如何将新URL传递给Scrapy爬虫

时间:2013-05-23 02:36:24

标签: python django multithreading celery scrapy

我想让一个scrapy爬虫不断在芹菜任务工作者内部运行,可能使用something like this。或按照建议in the docs 我们的想法是使用爬虫来查询返回XML响应的外部API。我想传递URL(或查询参数并让爬虫构建URL)我想查询爬虫,爬虫将进行URL调用,并将提取的项目还给我。如何在开始运行时将我想要抓取的新URL传递给抓取工具。我不希望每次要为其提供新的网址时重新启动抓取工具,而是希望抓取工具无所事事地等待网址抓取。

我发现在另一个python进程中运行scrapy的两种方法使用一个新的进程来运行爬虫。我希望每次我想要抓取一个URL时都不必拆分和拆除一个新进程,因为这是相当昂贵和不必要的。

2 个答案:

答案 0 :(得分:0)

只需要一个轮询数据库(或文件?)的蜘蛛,当它与新URL一起创建并为其生成一个新的Request()对象时。

您可以轻松地手动构建它。可能有一个更好的方法来做到这一点,但这基本上是我为开放代理刮刀做的。蜘蛛从数据库中获取所有“潜在”代理的列表,并为每个代理生成一个Request()对象 - 当它们被返回时,它们随后被分派到链中并由下游中间件验证,并且它们的记录由项目管道。

答案 1 :(得分:0)

您可以使用消息队列(如IronMQ - 完全披露,我为使IronMQ作为开发人员传播者的公司工作)来传递URL。

然后在您的抓取工具中,轮询队列中的网址,并根据您检索的邮件进行抓取。

您链接的示例可能会更新(这是未经测试和伪代码,但您应该了解基本想法):

from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy.settings import Settings
from scrapy import log
from testspiders.spiders.followall import FollowAllSpider
from iron-mq import IronMQ

mq = IronMQ()
q = mq.queue("scrape_queue")
crawler = Crawler(Settings())
crawler.configure()
while True: # poll forever
    msg = q.get(timeout=120) # get messages from queue
                             # timeout is the number of seconds the message will be reserved for, making sure no other crawlers get that message. Set it to a safe value (the max amount of time it will take you to crawl a page)
    if len(msg["messages"]) < 1: # if there are no messages waiting to be crawled
        time.sleep(1) # wait one second
        continue # try again
    spider = FollowAllSpider(domain=msg["messages"][0]["body"]) # crawl the domain in the message
    crawler.crawl(spider)
    crawler.start()
    log.start()
    reactor.run() # the script will block here
    q.delete(msg["messages"][0]["id"]) # when you're done with the message, delete it