如何让我可以用一只scrapy蜘蛛一致地绕过一系列网站?

问题描述 投票:0回答:1

我编写了从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()
python scrapy twisted
1个回答
2
投票

你的代码非常接近工作,你错过了一个重要的细节。 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()
^^^
© www.soinside.com 2019 - 2024. All rights reserved.