简述http中的状态保持?
htpp协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态;客户端与服务器的一次通信就是一会话,实现状态保持的方式:在客户端或服务器端存储与会话有端的数据;存储方式包括cookiesession,会话一半指session对象,使用cookie,所有数据存储在客户端,注意不要存储民反信息;推荐使用sesison 方式,所有数据存储在服务器端, 在客户端coookie中存储session_id;状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据;注意: 不同的请求者之间不会共享这个数据,与请求者一一对应。
请列举一些常见的请求状态码,特别说明400 401 403 404 405
2xx成功。表示服务器成功的接受了客户端的请求。
3xx重定向表示要完成请求,需要进一步操作,客户端浏览器必须采取更多的操作来实现请求
4xx请求错误。这些状态码表示请求可能出错,妨碍了服务器的处理
400:语义有误,当前请求无法被服务器理解。或者请求参数有误
401:当前请求需要用户验证
403:服务器理解请求,拒绝执行,无权限
404:请求方式无效
405:方法禁用 服务器禁用了请求中指定的方法
5xx:服务器错误:表示服务器在尝试处理请求时发生内部错误,这些错误可能是服务器本身的错误,而不是请求出错。
简单介绍什么是TCP,什么事UDP?
tcp传输控制协议是一种面向连接的/可靠的/基于字节流的传输层通信协议,在因特网协议族中,TCP层是位于IP层之上,应用层之下的中间层。特点属于长链接,传输的是数据流/安全可靠。
UDP协议全称是用户数据报协议在玩裸重他与TCP协议一样处于处理数据包,是一种无连接的协议,在OSI模型中,在第四层--传输层,处于IP协议的上一层,当报文发送之后无法得知是否安全到达的,是一项非常使用和可行的网络传输层协议,特点属于短连接/传输的是数据包,传输过程中数据包可能会丢失,因此他是不安全不可靠的
简述一个网址url有那几个部分组成
URL基本格式scheme://host[:port#]/path/.../[?query-sting]
scheme:协议
host:服务器的IP地址或者域名
port:服务器的端口(如果是走协议默认端口,缺省端口80)
path:访问资源的路径
query-string:参数,发送给http服务器的数据
简单的描述下什么是Robot.txt协议?
Robots协议(也称爬虫协议/机器人协议等)的 全程是‘网络爬虫排除标准’,roboot.txt是一个协议,而不是一个命令他是国际互联网界通行到的规范,大型网站通过Robots协议来告诉搜索引擎那些页面可以抓取哪些页面不能抓取
描述一下下列富豪在正则表达式中的含义(.?*+[a-z]{n,m}^|\d)
.点匹配除了换行符‘\n’之外的任何单个字符
?非贪婪陪陪0个或1个与「0,1」等价
*匹配前面的子表达式任意次
+匹配前面的自表达式一次或多次(大于等一1次)
【a-z】字符串的范围,匹配指定范围(a-z)内的任意字符
{n,m}匹配子表达式最少匹配n次最多匹配m次
^匹配输入子函授,必须以匹配字符开头
|将两个匹配条件进行逻辑or运算
\d匹配一个数字字符等价于[0-9]
描述我们爬虫中最常使用的几种反反爬虫的手段
1.构造合理的http请求头
2.使用UserAgent池摸一浏览器
3.设置cookie
4.降低访问频率
5.动态页面的反爬虫使用selenuim和phantomjs
模拟浏览器获取数据
6.使用IP,网站反爬比较严格的时候,一半会根据用户请求网页的频率来限制IP所以必要的时候使用代理池
列举你并简要介绍常用的数据库,说说他们的优势?
mysql:(mysql使用的sql语言是用于访问数据库的最常用标准化语言)mysql 是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中而不是将所有数据放在一个大仓库里,能够正价查询效率提高灵活性,有点:体积小/查询速度块/支持多种操作系统总体拥有成本低/支持多线程能充分利用CPU
mongodb:mongoDB是用C++语言编写的非关系形数据库,优点:高性能,易部署易使用存储数据十分方便,只要提醒是: 面向集合存储,易于存储对象类型数据/模式自由支持动态查询/支持完全索引/使用高效的二进制存储/文件粗处格式Bson
redis 是一个来源的使用ANSI C编写的,遵守BSD协议, 支持网路可基于内唇持久化数据的数据库,通常被称为数据结构服务器。特性: 热地说支持数据的持久化,可以讲内存中的书库保存在磁盘中,充气的时候可以在此加载进行使用;redis不仅仅支持简单的key-value 数据类型数据同时还提供listsetzsethash等数据结构的存储;redis支持数据的备份,即master-slave模式的数据备份。又是性能极高有丰富的数据类型,遵守原子性操作具有吩咐的特性
在scrapy 框架中我们如何激活一个pipeline数据管道中定义的函数?(要求将ArticleSpuder中的piplines下的mysqlTwistedPipeline激活)
首先我们找到工程下的settings.文件
找到Item_PIPELINES项将articlespider.pipelines.mysqlTwistedPipeline:1
写入如下代码所示
ITEM_PIPELINEDS= {'ArticleSpider.piplines.MysqlTwistedPipeline':1,}
简单描述scrapy矿建中国各模块的共嫩作用是什么? 可以根据提示回答
scrapy Engine(引擎):负责spider、itempiplineDownloader/Scheduler中间的通讯,信号数据传递等。
2.scheduler(调度器):他扶着接受引擎发送过来的REquest请求,并按照一定的方式进行整理排列,入队,当引擎需要是,交还给引擎
3.downloader(下载器):扶着下载scrapyEngine(引擎)发送的所有Requests请求,并肩获取到的reponses交还给scrapy
Engine(引擎),有引擎交给spiser来处理
spider(爬虫):他扶着处理所有Responses,崇中分析提取数据,获取item字段需要的数据,并肩需要跟进的url提交给引擎再次进入Scheduler(调度器)
itempipeline(管道):他负责处理spiser中获取到的item,并进行后期处理(详细分析,过滤,存储等)的地方。
Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件
8.spiderMIddlewares(Spider中间件):你可以理解为是一个可以自定义扩展和操作引擎和搜的人中间通信的功能组件
在scrapy-Redis 分布式策略中我们一半氛围Master端和Slaver端,请简单的介绍他们格子的作用和工作流程
参考答案:master端(核心服务器):不扶着数据爬去,只负责URL指纹判重/Request的分配和数据存储
2.slaver端(爬虫程序执行端):负责执行master分配的request爬虫任务,运行过程中会将数据和新的request给master
工作流程:
首先slacer端重master端拿任务(request、url)进行数据抓取,,slaver抓取数据的同时,残生新的REquest给Master处理;
Master端只有一个热地说数据库,扶着将未处理的Request去重和热舞分配,将处理后的request加入带爬队列,并且存储爬去的数据
解释一下python的多线程与多进程,描述他们的优缺饿点以及使用场景】
首先是cpu 执行的最小单元, 进程包含线程,每一个进程下可以有多个线程,在python中存在一个全局解释器锁FIL,只有拿到了全局解释器锁的线程才会被cpu执,所以说python中的多线程是伪的多线程,线程之间的资源是共享的,我们一半会使用锁老保护资源,如果项充分利用cpu资源的化,我们会使用多进程,进程之间的资源是不共享的,每一个进程都有自己独立的资源存储空间,一半情况下,多线程用来出炉I/O密集型操作,多进程用来处理计算密集型操作。
在Django开发中,什么叫做状态保持
答案:浏览器请求服务器是无状态的。无状态只一次用户请求时,浏览器/服务器无法知道之前这个用户做过什么,么次请求都是一次新的请求。
django中无状态的根本原因是
无状态的应用层面的原因是:浏览器和服务器之间的通信都遵守http协议。根本原因是: 浏览器与服务器是使用socket套接字进行通信的,服务器将请求结果返回给浏览器之后, 会关闭当前的Socket连接, 而且服务器也会在处理页面完毕之后销毁页面对象
在后丢安开发中,又是需要保存下来用户浏览的状态,比如用户是否登录,浏览过哪些商品等实现状态保持主要有两种f方式
在客户端存储信息使用cookie
在服务器出存储信息使用session
cookie的特点
cookie 以键值对的格式进行信息的存储
cookie基于域名安全, 不同域名的cookie是不能互相访问的
当浏览器请求某网站是,会讲浏览器存储的跟网站相关的cookie信息提交非网站服务器
初始化一个UTF-8 编码的字符串,现将改字符转转换为unicode编码,再将unique编码格式字符串转换成GBK,再将GBK编码格式字符串转换为unicode 编码格式最后将unicode编码格式字符串转换成utf8,用发麻实现上述转换
utf8Str = '这是一个utf8字符串'
uncstr= utf8Str.decode('utf8')
gbk = uncstr.encode('GBK')
unclStr = gbk.decode('gbk')
俺换成其他编码的字符床utf8 = unclStr.encode('utf8')
decode 作用是将其他编码的字符串转换成unicode编码
encode的作用是将Unicode编码转换成其他编码的字符串
使用scrapy框架时我们创建项目/创建爬虫文件(spider,crawlspider)两种启动爬虫/已经我们在未启动spider的情况下尝试及调试代码的操作命令是什么
创建项目scrapy startproject qidian
创建文件 scrapy genspider qidian qidian.com
创建crawlspider爬虫文件scrapy genspider -t crawl baidu baidu.com
启动爬虫 crapy crawl jobbole
scrapy shell 网址
当我们使用scrapy编写一个爬虫工程后,想要对工程进行断点调试,和内部运行一样我们会定义一个main.py文件,以运行jobbole 为例,请编写main文件代码
from scrapy.cmdline import execute
import sys,os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
excute(['scrapy','crawl','jobbole'])
title = response.css(".entry-header h1::text").extract_first("")
crate_data = response.css(""div.entry-meta-hide-on-mobile p.publish-time::text").extract_first("")
comment_nums = response.css('a[href="#article-comment"]>span ::text').extract_first("")
content = response.css(".entry p::text").extract()
content = ''''.join(content)
我们在爬虫获得数据后,使用pipline管道文件进行数据的处理要求在pipleline中,将传递过来的字典以json字符串的格式写入本地文件
import json
class Pipline(object):
def__init__(srlf):
self.file = open('jobbole.json','w')
def process_item(sefl,item,spider):
content = json.dumps(dict(item),ensure_ascii=False)+"\n"
self.file.write(content)
return item
def close_spider(self,spider):
self.file.close()
我们在爬虫获得数据后,使用pipeline管道文件进行数据的处理,要求在pipleline中,将传递过来的字典保存在mongodb中。假设host port dbname cilname 卸载了settings文件中
import pymongo
class doubanpipeline(object):
def __init__(self,host,port,db,col):
self.client = pymongo.MongoClient(host,PORT)
self.db = self.client[DB]
self.col = self.db[col]
@classmethod
def from_settings(cls,settings):
MONGODBHOST = settings[HOST]
MONGODBPORT = settings[PORT]
MONGODB_DB = settings[DBNAME]
MONGODB_COL = settings[COLNAME]
return cls('''')
def process_item(self,item,spider):
data = dict(item)
self.mysheet.insert(data)
return item
def close_spider(self,spider):
self.db.close()
updata teacher SET birthday = "1982-11-08" where id =1
updata teacher SET address ='beiing' where sex="男"
delete from teacher where num = 1002;