scrapy分页抓取网页的相关细节介绍可以参考中的文档和社区joshuaseng
优采云 发布时间: 2022-07-26 11:01scrapy分页抓取网页的相关细节介绍可以参考中的文档和社区joshuaseng
scrapy分页抓取网页的相关细节介绍可以参考scrapy中的文档和社区joshuaseng:scrapy分页抓取网页的相关细节介绍如果你理解executor的执行流程的话,在scrapy中的pythonexecutor、httpexecutor、gevent的执行流程都一样,都是将参数包装为相应的streams,并不断分包,分好后在内存中进行拷贝。
只是本质上是scrapy的作用是解决异步抓取,抓取更多网页时用gevent更多,那这里介绍的executor虽然是抓取同一个网页,但它也是一个异步任务队列的实现,主要用来解决每个抓取的streams有不同的队列,这种blockingstreamscheduler模型不好处理分页抓取,为了更好的处理分页抓取任务,scrapy提供了自定义的异步任务队列catchtasks,executor可以直接用它来执行异步任务,只是有时会对异步任务的处理结果产生一些影响,很多人都知道在抓取完成后回退时executor将会处理分页任务,这对于处理分页相关请求会带来影响,因为分页是重复抓取过程,在收到重复信息时executor会返回一个redisobject.structure(name="",root=0)来返回相应的字典。
所以我们会出现redisobject.structure("'',ip='10.99.139.137',ds=[''])这种格式的处理结果并不安全,而且会报错。executor的源码在scrapy/executor/python.py中。但在python2.x中,在抓取过程中gevent协程是跟executor一起执行的,在2.x中,scrapy使用scrapyqtcore替代了gevent,它是scrapy协程管理进程的基本框架,不同gevent协程和scrapyqtcore绑定在不同的客户端上,executor是pythonpython代码代理的实现,每个gevent协程可以有多个实例,在实际中可以使用--gevent属性来指定所有gevent协程实例的线程数量,然后在qtcore执行本地任务来主动调用实例来执行一系列本地任务,使用“cpus”给cpu个数,cpu的每一个时钟周期就执行一个本地任务。
这样qtcore中全都是executor实例而不是gevent协程,这样做的好处是scrapy1.6版本引入了mutable_scheduler,也就是scrapy自带异步分页机制,从而不需要手动启动gevent协程。本文以分页抓取一个chinaz网站下的某个热门旅游城市的热门人物的个人的信息,这些信息会以文本列表的形式展示给我们,点击会跳转到该个人的主页,在本文中,我只抓取旅游城市的热门人物的个人信息。
fromscrapy.requestimporturlfromscrapy.cookieimportkeywordsfromscrapy.exceptionsimportexcusefroms。