gpt4 book ai didi

python - 如何从另一个蜘蛛启动 Scrapy 蜘蛛

转载 作者:行者123 更新时间:2023-12-02 06:38:40 26 4
gpt4 key购买 nike

我在一个 Scrapy 项目中有两个蜘蛛。 Spider1 抓取页面列表或整个网站并分析内容。 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 并且在没有 URL 列表的情况下调用 Spider1。我尝试按照 Scrapy 文档的建议使用 CrawlRunner,但这是同样的问题。我尝试在解析方法中使用 CrawlProcess,它“有效”,但是我仍然收到错误消息。当在 parse 方法中使用 CrawlRunner 时,它不起作用。

最佳答案

目前,如果您使用 scrapy scrapy 命令,则无法从另一个蜘蛛启动蜘蛛(请参阅 https://github.com/scrapy/scrapy/issues/1226 )。如果您自己编写启动脚本,则可以从蜘蛛启动蜘蛛 - 技巧是使用相同的 CrawlerProcess/CrawlerRunner 实例。

不过我不会那样做,你是在与框架作斗争。如果能支持这个用例就好了,但现在还没有真正支持。

一种更简单的方法是重写代码以使用单个 Spider 类,或者创建一个运行 scrapycrawlspider1-oitems 的脚本(bash、Makefile、luigi/airflow,如果你想变得更花哨) .jl 后跟 scrapycrawl Spider2;第二个蜘蛛可以读取第一个蜘蛛创建的项目并相应地生成 start_requests

FTR:完全支持在单个蜘蛛中结合 SplashRequests 和常规 scrapy.Requests(它应该可以工作),您不必为它们创建单独的蜘蛛。

关于python - 如何从另一个蜘蛛启动 Scrapy 蜘蛛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45301230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com