如何让我可以用一只scrapy蜘蛛一致地绕过一系列网站?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让我可以用一只scrapy蜘蛛一致地绕过一系列网站?相关的知识,希望对你有一定的参考价值。
我编写了从Python脚本启动scrapy spider的代码。现在,我想要一致地绕过网站列表,即。我为一个网站运行蜘蛛,当它完成抓取时,我关闭蜘蛛并反复拨打另一个网站。
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from datetime import datetime
start_urls=['https://sentek.ru/','http://www.s-kab.ru/',https://sevkab.nt-rt.ru/',http://www.mikroprovod.ru/']
for start_url in start_urls:
process = CrawlerProcess(get_project_settings())
domain = start_url.split('//')[-1].split('/')[0].split('www.')[-1]
current_time = datetime.now().strftime('%Y-%m-%d')
current_time = current_time.replace("-", ".")
process.crawl('procurement', start_url=start_url,domain=domain,time=current_time)
process.start()
但是当我开始刮第二个站点时出现错误twisted.internet.error.ReactorNotRestartable
。我知道它是由于TwistedReactor的功能而无法重新启动。我想知道,有没有办法运行反应堆一次并且总是重新创建蜘蛛在里面?谢谢你的关注!:)
更新!解决方案我决定为每个蜘蛛创建单独的进程,为此我使用了多处理库。这有助于避免错误twisted.internet.error.ReactorNotRestartable
并执行连续的抓取网站。这是代码:
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from datetime import datetime
from multiprocessing import Process
def create_spider(start_url):
process = CrawlerProcess(get_project_settings())
domain = start_url.split('//')[-1].split('/')[0].split('www.')[-1]
current_time = datetime.now().strftime('%Y-%m-%d')
current_time = current_time.replace("-", ".")
process.crawl('procurement', start_url=start_url, domain=domain,
time=current_time)
process.start()
if __name__ == '__main__':
start_urls = [
'http://www.samaracable.ru/',
'http://www.skz67.ru/', 'http://www.uralcable.ru/',
'http://www.ufimcabel.ru/', 'http://www.chuvashcable.ru/',
'https://uncomtech.ru/']
for start_url in start_urls:
proc = Process(target=create_spider, args=(start_url,))
proc.start()
proc.join()
答案
你的代码非常接近工作,你错过了一个重要的细节。 CrawlProcess
实际上是为了同时运行多个蜘蛛而设计的!
CrawlProcess 一个同时在进程中运行多个scrapy爬虫的类。
所以要解决所有你需要做的就是移动你的CrawlProcess
对象创建并在你的循环之外启动它:
process = CrawlerProcess(get_project_settings())
^^^
for start_url in start_urls:
domain = start_url.split('//')[-1].split('/')[0].split('www.')[-1]
current_time = datetime.now().strftime('%Y-%m-%d')
current_time = current_time.replace("-", ".")
process.crawl('procurement', start_url=start_url,domain=domain,time=current_time)
process.start()
^^^
以上是关于如何让我可以用一只scrapy蜘蛛一致地绕过一系列网站?的主要内容,如果未能解决你的问题,请参考以下文章