【发布时间】:2021-10-07 16:21:48
【问题描述】:
我正在尝试构建一个爬虫(使用 scrapy)从 main.py 启动蜘蛛并进行多处理。
第一个蜘蛛 (cat_1) 使用 scrapy.crawler.CrawlerProcess 启动而不进行多处理:
crawler_settings = Settings()
crawler_settings.setmodule(default_settings)
runner = CrawlerProcess(settings=crawler_settings)
runner.crawl(cat_1)
runner.start(stop_after_crawl=True)
它工作正常,我拥有 FEED 处理的所有数据。
下一个蜘蛛需要第一个蜘蛛的结果并进行多处理:
从第一个蜘蛛加载结果后,我创建了一个 URL 列表并将其发送到我的函数 process_cat_2()。该函数创建进程,每个进程都会启动蜘蛛 cat_2:
from multiprocessing import Process
def launch_crawler_cat_2(crawler, url):
cat_name = url[0]
cat_url = url[1]
runner.crawl(crawler, cat_name, cat_url)
def process_cat_2(url_list):
nb_spiders = len(url_list)
list_process = [None] * nb_spiders
while(url_list):
for i in range(nb_spiders):
if not (list_process[i] and list_process[i].is_alive()):
list_process[i] = Process(target=launch_crawler_cat_2, args=(cat_2, url_list.pop(0)))
list_process[i].start()
# break
# Wait all thread end
for process in list_process:
if process:
# process.start()
process.join()
问题是runner.crawl(crawler, cat_name, cat_url)(在 cat_2 中)没有抓取任何东西:
2021-10-07 17:20:38 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
而且我不知道如何使用现有的twisted.internet.reactor 所以要避免这个错误:
twisted.internet.error.ReactorNotRestartable
使用时:
def launch_crawler_cat_2(crawler, url):
cat_name = url[0]
cat_url = url[1]
runner.crawl(crawler, cat_name, cat_url)
runner.start()
如何使用现有的 reactor 对象启动新蜘蛛?
【问题讨论】:
标签: python web-scraping scrapy