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
    实现原理是有个下载中间件

 

posted @ 2018-06-29 21:14  liang哥哥  阅读(97)  评论(0)    收藏  举报