【发布时间】:2015-09-07 08:13:51
【问题描述】:
我正在使用 Scrapy 使用两阶段抓取来汇总每日数据。第一阶段从索引页面生成 URL 列表,第二阶段将列表中每个 URL 的 HTML 写入 Kafka 主题。
虽然爬网的两个组件是相关的,但我希望它们是独立的:url_generator 将作为计划任务每天运行一次,page_requester 将持续运行,在可用时处理 URL。为了“礼貌”,我将调整DOWNLOAD_DELAY,以便爬虫在 24 小时内完成,但对站点的负载最小。
我创建了一个 CrawlerRunner 类,它具有生成 URL 和检索 HTML 的功能:
from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy import log, signals
from scrapy_somesite.spiders.create_urls_spider import CreateSomeSiteUrlList
from scrapy_somesite.spiders.crawl_urls_spider import SomeSiteRetrievePages
from scrapy.utils.project import get_project_settings
import os
import sys
class CrawlerRunner:
def __init__(self):
sys.path.append(os.path.join(os.path.curdir, "crawl/somesite"))
os.environ['SCRAPY_SETTINGS_MODULE'] = 'scrapy_somesite.settings'
self.settings = get_project_settings()
log.start()
def create_urls(self):
spider = CreateSomeSiteUrlList()
crawler_create_urls = Crawler(self.settings)
crawler_create_urls.signals.connect(reactor.stop, signal=signals.spider_closed)
crawler_create_urls.configure()
crawler_create_urls.crawl(spider)
crawler_create_urls.start()
reactor.run()
def crawl_urls(self):
spider = SomeSiteRetrievePages()
crawler_crawl_urls = Crawler(self.settings)
crawler_crawl_urls.signals.connect(reactor.stop, signal=signals.spider_closed)
crawler_crawl_urls.configure()
crawler_crawl_urls.crawl(spider)
crawler_crawl_urls.start()
reactor.run()
当我实例化该类时,我能够成功地单独执行任一函数,但不幸的是,我无法同时执行它们:
from crawl.somesite import crawler_runner
cr = crawler_runner.CrawlerRunner()
cr.create_urls()
cr.crawl_urls()
第二个函数调用在尝试执行crawl_urls 函数中的reactor.run() 时会生成twisted.internet.error.ReactorNotRestartable。
我想知道这段代码是否有一个简单的修复方法(例如,运行两个单独的 Twisted 反应器的某种方式),或者是否有更好的方式来构建这个项目。
【问题讨论】:
标签: scrapy twisted scrapy-spider