【问题标题】:Is it possible to run another spider from Scrapy spider?是否可以从 Scrapy spider 运行另一个蜘蛛?
【发布时间】:2015-08-24 06:49:42
【问题描述】:

现在我有 2 只蜘蛛,我想做的是

  1. Spider 1 转到url1,如果出现url2,则使用url2 调用spider 2。还通过管道保存url1的内容。
  2. 蜘蛛2url2 做点什么。

由于两种蜘蛛的复杂性,我想将它们分开。

我尝试过使用scrapy crawl

def parse(self, response):
    p = multiprocessing.Process(
        target=self.testfunc())
    p.join()
    p.start()

def testfunc(self):
    settings = get_project_settings()
    crawler = CrawlerRunner(settings)
    crawler.crawl(<spidername>, <arguments>)

它会加载设置但不会抓取:

2015-08-24 14:13:32 [scrapy] INFO: Enabled extensions: CloseSpider, LogStats, CoreStats, SpiderState
2015-08-24 14:13:32 [scrapy] INFO: Enabled downloader middlewares: DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, HttpAuthMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
2015-08-24 14:13:32 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2015-08-24 14:13:32 [scrapy] INFO: Spider opened
2015-08-24 14:13:32 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)

文档中有一个关于从脚本启动的示例,但我想做的是在使用 scrapy crawl 命令时启动另一个蜘蛛。

编辑:完整代码

from scrapy.crawler import CrawlerRunner
from scrapy.utils.project import get_project_settings
from twisted.internet import reactor
from multiprocessing import Process
import scrapy
import os


def info(title):
    print(title)
    print('module name:', __name__)
    if hasattr(os, 'getppid'):  # only available on Unix
        print('parent process:', os.getppid())
    print('process id:', os.getpid())


class TestSpider1(scrapy.Spider):
    name = "test1"
    start_urls = ['http://www.google.com']

    def parse(self, response):
        info('parse')
        a = MyClass()
        a.start_work()


class MyClass(object):

    def start_work(self):
        info('start_work')
        p = Process(target=self.do_work)
        p.start()
        p.join()

    def do_work(self):

        info('do_work')
        settings = get_project_settings()
        runner = CrawlerRunner(settings)
        runner.crawl(TestSpider2)
        d = runner.join()
        d.addBoth(lambda _: reactor.stop())
        reactor.run()
        return

class TestSpider2(scrapy.Spider):

    name = "test2"
    start_urls = ['http://www.google.com']

    def parse(self, response):
        info('testspider2')
        return

我希望是这样的:

  1. scrapy 爬行测试1 (例如,当 response.status_code 为 200 时:)
  2. 在test1中,调用scrapy crawl test2

【问题讨论】:

  • 您可以捕获“response.url”并将其放入 if 语句中并通过正则表达式进行一些模式匹配,然后如果符合您的条件则执行此操作,否则执行此操作
  • 是的,但它不会进行抓取。
  • 在这里发布你的全部代码
  • 已添加代码。我正在考虑放弃使用scrapyd,在蜘蛛内调用scrapyd API....

标签: python scrapy multiprocessing


【解决方案1】:

我不会深入给出,因为这个问题真的很老,但我会继续从官方的 Scrappy 文档中删除这个 sn-p ......你非常接近!哈哈

import scrapy
from scrapy.crawler import CrawlerProcess

class MySpider1(scrapy.Spider):
    # Your first spider definition
    ...

class MySpider2(scrapy.Spider):
    # Your second spider definition
    ...

process = CrawlerProcess()
process.crawl(MySpider1)
process.crawl(MySpider2)
process.start() # the script will block here until all crawling jobs are finished

https://doc.scrapy.org/en/latest/topics/practices.html

然后使用回调,你可以在你的蜘蛛之间传递项目做你所说的逻辑函数

【讨论】:

  • 嗨脚本!谢谢你的回答对我有帮助。你知道如何将参数从一只蜘蛛传递给另一只蜘蛛吗?
  • 有一种方法可以获取一个蜘蛛返回的 url 并在另一个蜘蛛中使用它?
【解决方案2】:

我们不应该从蜘蛛中运行蜘蛛。 据我了解,您想在其他蜘蛛完成时运行蜘蛛,对吗? 如果是这样,让我们​​使用下面的源代码:

from twisted.internet import reactor, defer
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
from datascraper.spiders.file1_spd import Spider1ClassName
from datascraper.spiders.file2_spd import Spider2ClassName
from scrapy.utils.project import get_project_settings


@defer.inlineCallbacks
def crawl():
    yield runner.crawl(Spider1ClassName)
    yield runner.crawl(Spider2ClassName)
    reactor.stop()


configure_logging()
config = get_project_settings()
runner = CrawlerRunner(settings=config)
crawl()
reactor.run() # the script will block here until the last crawl call is finished

您可以参考这里:https://doc.scrapy.org/en/latest/topics/practices.html#running-multiple-spiders-in-the-same-process

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2015-05-13
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多