3

1 つの Scrapy プロジェクトに 2 つのスパイダーがあります。Spider1 は、ページのリストまたは Web サイト全体をクロールし、コンテンツを分析します。Spider2 は Splash を使用して Google で URL を取得し、そのリストを Spider1 に渡します。

そのため、Spider1 はクロールしてコンテンツを分析し、Spider2 から呼び出されることなく使用できます。

# coding: utf8
from scrapy.spiders import CrawlSpider
import scrapy


class Spider1(scrapy.Spider):
    name = "spider1"
    tokens = []
    query = ''

    def __init__(self, *args, **kwargs):
        '''
        This spider works with two modes,
        if only one URL it crawls the entire website,
        if a list of URLs only analyze the page
        '''
        super(Spider1, self).__init__(*args, **kwargs)
        start_url = kwargs.get('start_url') or ''
        start_urls = kwargs.get('start_urls') or []
        query = kwargs.get('q') or ''
        if google_query != '':
            self.query = query
        if start_url != '':
            self.start_urls = [start_url]
        if len(start_urls) > 0:
            self.start_urls = start_urls


    def parse(self, response):
        '''
        Analyze and store data
        '''
        if len(self.start_urls) == 1:
            for next_page in response.css('a::attr("href")'):
                yield response.follow(next_page, self.parse)

    def closed(self, reason):
        '''
        Finalize crawl
        '''

Spider2 のコード

# coding: utf8
import scrapy
from scrapy_splash import SplashRequest
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings


class Spider2(scrapy.Spider):
    name = "spider2"
    urls = []
    page = 0

    def __init__(self, *args, **kwargs):
        super(Spider2, self).__init__(*args, **kwargs)
        self.query = kwargs.get('q')
        self.url = kwargs.get('url')
        self.start_urls = ['https://www.google.com/search?q=' + self.query]

    def start_requests(self):
        splash_args = {
            'wait:': 2,
        }
        for url in self.start_urls:
            splash_args = {
                'wait:': 1,
            }
            yield SplashRequest(url, self.parse, args=splash_args)

    def parse(self, response):
        '''
        Extract URLs to self.urls
        '''
        self.page += 1

    def closed(self, reason):
        process = CrawlerProcess(get_project_settings())
        for url in self.urls:
            print(url)
        if len(self.urls) > 0:
            process.crawl('lexi', start_urls=self.urls, q=self.query)
            process.start(False)

Spider2 を実行しているときに、次のエラーが発生しますtwisted.internet.error.ReactorAlreadyRunning。Spider1 は、URL のリストなしで呼び出されます。Scrapy のドキュメントでアドバイスされているように CrawlRunner を使用してみましたが、同じ問題です。parse メソッド内で CrawlProcess を使用してみましたが、「機能します」が、まだエラーメッセージが表示されます。parse メソッド内で CrawlRunner を使用すると、機能しません。

4

1 に答える 1