首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从另一个抓取蜘蛛开始

如何从另一个抓取蜘蛛开始
EN

Stack Overflow用户
提问于 2017-07-25 18:54:25
回答 1查看 1.6K关注 0票数 3

我在一个Scrapy项目中有两个蜘蛛。Spider1爬行页面列表或整个网站并分析内容。Spider2使用Splash在谷歌上获取URL,并将该列表传递给Spider1。

因此,无需Spider2调用即可使用Spider1对内容进行爬行和分析

代码语言:javascript
复制
# 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的代码

代码语言:javascript
复制
# 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时,我遇到了这样的错误:在没有URL列表的情况下调用twisted.internet.error.ReactorAlreadyRunning和Spider1。我试着按照Scrapy文档中的建议使用CrawlRunner,但问题是一样的。我尝试使用CrawlProcess的内部解析方法,它“工作”,但我仍然有错误信息。当在解析方法中使用CrawlRunner时,它不起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-26 05:56:32

目前,如果您使用scrapy crawl命令(请参阅https://github.com/scrapy/scrapy/issues/1226),则不能从另一个爬行器启动爬行器。如果您自己编写启动脚本,则可以从爬行器启动爬行器-诀窍是使用相同的CrawlerProcess/CrawlerRunner实例。

但我不会这么做,你是在与框架作斗争。支持这个用例是很好的,但是现在还没有真正支持它。

一种更简单的方法是要么重写代码以使用单个爬行器类,要么创建一个脚本(bash、Makefile、luigi/airflow,如果您想要的话),它先运行scrapy crawl spider1 -o items.jl,然后运行scrapy crawl spider2;第二个爬行器可以读取第一个爬行器创建的项并相应地生成start_requests

在一个单独的爬虫中组合SplashRequests和常规scrapy.Requests是完全受支持的(它应该可以工作),你不需要为它们创建单独的爬虫。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45301230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档