11

我想建立一个基于 Scrapy 的网络爬虫,从几个新闻门户网站抓取新闻图片。我希望这个爬虫是:

  1. 永远奔跑

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

  2. 安排优先事项。

    为不同类型的 URL 赋予不同的优先级。

  3. 多线程获取

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

4

2 回答 2

12

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

  1. 永远运行取决于调用 Scrapy 的应用程序。你告诉蜘蛛去哪里,什么时候去那里。
  2. 给予优先级是调度器中间件的工作,你必须创建它并插入到 Scrapy 中。这方面的文档看起来参差不齐,我没有看过代码 - 原则上该函数就在那里。
  3. Scrapy 本质上是异步的,这很可能是您想要的:请求 B 可以在请求 A 仍然未完成的情况下得到满足。底层连接引擎不会阻止你真正的多线程,但 Scrapy 不提供线程服务。

Scrapy 是一个库,而不是一个应用程序。模块的用户需要做大量的工作(代码)。

于 2010-02-28T04:47:32.977 回答
0

关于永远运行的要求,这里有一些细节。

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

见代码吹:

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 
于 2016-08-18T03:30:27.947 回答