如何制作,以便我能用一只刮scrap的蜘蛛持续浏览网站清单?

时间:2019-04-27 07:25:47

标签: python scrapy twisted

我编写了用于从Python脚本启动scrapy spider的代码。现在,我要始终绕过网站列表,即我为一个网站运行Spider,当它完成抓取操作后,我关闭了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()

1 个答案:

答案 0 :(得分: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()
^^^