2017-11-23 27 views
0

私は3つの層の再帰を実装して、URLのシードリストを生成し、各URLから情報をスクレイピングしました。 multiprocessingを使用して、システムのすべてのコアを利用してクロールを高速化したいと考えています。これまでに実装したクローラコードを示します。Pythonでマルチプロセッシングを使用してScrapyを使用して何百万ものURLをクロールする方法は?

# -*- coding: utf-8 -*- 
import scrapy 
from scrapy.selector import HtmlXPathSelector 
from scrapy.http.request import Request 

from CompanyInfoGrabber.Utility.utils import getAddress, getCompanyStatus, getDirectorDetail, getRegNumber 


class CompanyInfoGrabberSpider(scrapy.Spider): 
    name = 'CompanyDetail' 
    allowed_domains = ['example.com'] 
    start_urls = ['http://example.com'] 

    def parse(self, response): 
     counter = 0 
     print("User Agent in parse() is : ", response.request.headers['User-Agent']) 
     hxp = HtmlXPathSelector(response) 
     URL_LIST = hxp.select('//sitemapindex/sitemap/loc/text()').extract() 
     print("URL LIST: ", URL_LIST) 
     for URL in URL_LIST[:2]: 
      next_page = response.urljoin(URL) 
      yield Request(next_page, self.parse_page) 

    def parse_page(self, response): 
     print("User Agent in parse_page is : ", response.request.headers['User-Agent']) 
     hxp = HtmlXPathSelector(response) 

     # create seed list of company-url 
     COMPANY_URL_LIST = hxp.select('//urlset/url/loc/text()').extract() 
     print("Company url: ", COMPANY_URL_LIST[:20]) 
     """ 
     Here I want to use multiprocessing like this 
     pool = Pool(processes=8) 
     pool.map(parse_company_detail, COMPANY_URL_LIST) 
     """ 
     for company_url in COMPANY_URL_LIST[:5]: 
      next_page = response.urljoin(company_url) 
      yield Request(next_page, self.parse_company_detail) 

    def parse_company_detail(self, response): 
     COMPANY_DATA = dict() 
     print("User Agent in parse_company_page() is : ", response.request.headers['User-Agent']) 
     hxp = HtmlXPathSelector(response) 
     _ABOUT_ = ''.join(hxp.xpath('normalize-space(//div[@class="panel-body"]/text())').extract()) 
     for node in hxp.xpath('//div[@class="panel-body"]//p'): 
      _ABOUT_ += ''.join(node.xpath('string()').extract()) 

     COMPANY_DATA['About'] = _ABOUT_ 
     # Get company data. 
    COMPANY_DATA = getDirectorDetail(COMPANY_DATA, hxp) 

    print("Dictionary: ", COMPANY_DATA) 
    return COMPANY_DATA 

どのようにしてマルチプロセッシングを使用してURLのシードリストをクロールできますか? ありがとうございました。

更新: 私の質問はthisの重複ではありません。ここで私は唯一のスパイダーを持っています。

よろしく、

オム・プラカシュ

+0

(https://stackoverflow.com/questions/31087268/multiprocessing-of-scrapy-spiders-in-parallel-processes)Clé[email protected] –

+0

、[並列プロセスにおけるScrapy蜘蛛のマルチプロセッシング]の可能性のある重複しませんそれは重複ではありません。私はここに唯一のクモを持っています。 –

答えて

0

私は、同時に複数のスレッドを実行するために、threadingモジュールを使用することをお勧めします。 のURL引数を取るようにクラスを変更する必要があります。

import threading 

sites = ['URL1','URL2','URL3'] 

def create_instance(): 
    global sites 
    CompanyInfoGrabberSpider(scrapy.Spider,sites[0]) 
    sites.remove[sites[0]] 

for site in sites: 
    threading.Thread(target=create_instance).start() # Create and start thread 
関連する問題