如何基于Scrapy构建一个永不停歇的网络爬虫?

11 投票
2 回答
5903 浏览
提问于 2025-04-15 19:48

我想用Scrapy来搭建一个网络爬虫,目的是从几个新闻门户网站抓取新闻图片。这个爬虫我希望能做到以下几点:

  1. 永远运行

    也就是说,它会定期重新访问一些门户页面,以获取最新的信息。

  2. 调度优先级

    给不同类型的网址设置不同的优先级。

  3. 多线程抓取

我看过Scrapy的文档,但没有找到跟我列出的内容相关的部分(可能是我没有仔细看)。这里有没有人知道怎么做?或者能给我一些想法或例子?谢谢!

2 个回答

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 
12

Scrapy是一个用来抓取网站的框架,它可以帮助你实现你的需求,但一开始它不会自动为你做所有事情;你可能需要对这个模块有一定的了解,才能完成一些任务。

  1. 让程序一直运行是由你调用Scrapy的应用程序决定的。你需要告诉爬虫去哪里,以及什么时候去。
  2. 设置优先级是调度中间件的工作,你需要自己创建并接入Scrapy。关于这方面的文档信息不太全面,我也没有查看过代码——但原则上这个功能是存在的。
  3. Scrapy本质上是异步的,这可能正是你想要的:请求B可以在请求A还没有完成时就得到响应。底层的连接引擎并不妨碍你进行真正的多线程操作,但Scrapy本身并不提供线程服务。

Scrapy是一个库,而不是一个应用程序。使用这个模块需要进行相当多的工作(编写代码)。

撰写回答