如何构建基于Scrapy的Web爬虫永远运行?

时间:2010-02-28 04:07:13

标签: python web-crawler scrapy

我想构建一个基于Scrapy的网络爬虫来从几个新闻门户网站上获取新闻图片。我想这个爬虫是:

  1. 永远跑步

    意味着它将定期重新访问某些门户网站页面以获取更新。

  2. 安排优先事项。

    为不同类型的网址指定不同的优先级。

  3. 多线程提取

  4. 我已经阅读了Scrapy文档,但没有找到与我列出的相关的内容(也许我不够谨慎)。这里有人知道怎么做吗?或者只是给出一些关于它的想法/例子。谢谢!

2 个答案:

答案 0 :(得分:12)

Scrapy是一个用于抓取网站的框架,因此,它旨在支持您的标准,但它不会为您提供开箱即用的舞蹈;对于某些任务,您可能需要相对熟悉该模块。

  1. 永远运行取决于调用Scrapy的应用程序。你告诉the spiders去哪里以及何时去那里。
  2. 优先考虑的是Scheduler middleware的工作,你必须创建并插入Scrapy。关于这个的文档看起来很不稳定,我没有查看代码 - 原则上功能就在那里。
  3. Scrapy本质上是fundamentally asynchronous,这可能是你想要的:请求B可以满足,而请求A仍然是未完成的。底层连接引擎不会阻止您进行真正的多线程,但Scrapy不提供线程服务。
  4. Scrapy是一个库,而不是一个应用程序。模块的用户需要进行大量的工作(代码)。

答案 1 :(得分:0)

关于永久跑步的要求,这里有一些细节。

你需要捕捉signals.spider_idle信号,并在你的方法中 连接到信号,您需要引发DontCloseSpider异常。当没有待处理的请求时,spider_idle信号被发送到scrapy引擎,默认情况下,蜘蛛将关闭。你可以拦截这个过程。

见代码打击:

import scrapy
from scrapy.exceptions import DontCloseSpider
from scrapy.xlib.pydispatch import dispatcher

class FooSpider(scrapy.Spider):
    def __init__(self, *args, **kwargs):
        super(FooSpider, self).__init__(*args, **kwargs)
        dispatcher.connect(self.spider_idle, signals.spider_idle)

    def spider_idle(self):
        #you can revisit your portal urls in this method
        raise DontCloseSpider