scrapy的补充一
1.scrapy依赖twisted 2.twisted是什么以及和requests的区别? twisted 是基于事件循环的异步非阻塞模块或框架 封装socket发送请求,单线程完成并发请求 用来帮助我们下载页面, 内部基于事件循环的机制实现爬虫的并发 并发效率高 三个相关词 - 非阻塞:不等待 - 异步:回调 - 事件循环:一直循环去检查状态。 requests是一个python实现的可以伪造浏览器发送http请求的模块封装socket发送请求 3. Http请求本质 模拟浏览器向服务端发送请求 4. scrapy的response对象有哪些? response - text - body - request - xpath - // - / - .// - //div[@x="xx"] - //div/text() - //div/@href --- 获取href属性 - .extract() - .extract_first() 5.- 持久化 - pipeline中5个方法 (__init__,from_crawler(cls,crawler),open_spider(self,spider), process_item(self,item,spider),close_spider(self,spider)) -BaseDupeFilter的5个方法 (from_settings(cls,settings),request_seen(self,request), open(self),close(self,reason),log(self,request,spider)) 爬虫中: yield Item对象 - 再次发请求(from scrapy.http import Request或from scrapy import Request) - yield Request对象 - cookie 6.深度和优先级 - 深度 - 最开始是0 - 每次yield时,会根据原来请求中的depth + 1 配置:DEPTH_LIMIT 深度控制 - 优先级 - 请求被下载的优先级 -= 深度 * 配置 DEPTH_PRIORITY 配置:DEPTH_PRIORITY socket默认是阻塞的 sk = socket.socket() sk.setblocking(False) --- 将socket变成非阻塞。 协程在计算机中不是真实存在的,是人为的(函数的调用,跳来跳去) 单纯的协程无法实现并发 协程就是微线程,对一个线程的分片,如果去处理计算操作速度会慢,如果去做IO操作才能快(遇到IO会切换) 全局解释器锁,保证同一时刻一个进程只有一个线程使用CPU(并不能保证数据完全安全,还需自己再加个锁) IO的时候不会用CPU,计算密集型的时候用CPU 进程间进行共享 pipeline queue manager 先写pipeline类 写item类 settings配置:pipeline需要先注册 爬虫 yield item对象 会自动执行process_item方法 dont_filter=True --- 不去重 dont_filter=False --- 去重 dropitem 让下一次不执行 addBoth # 限制深度 DEPTH_LIMIT = 3 可迭代对象转换成迭代器 iter(list) os.environ --- 一个进程中的环境变量(当前进程)两个进程的环境变量不共享 meta={'cookiejar':True} --- 会自动保存携带cookie 实现原理是有个下载中间件