【问题标题】:Run scrapy spider from script从脚本运行scrapy spider
【发布时间】:2020-09-26 12:23:36
【问题描述】:

我想从 python 脚本运行我的爬虫。 我可以使用以下代码调用我的蜘蛛,

subprocess.check_output(['scrapy crawl mySpider'])

直到一切都好。但在此之前,我通过初始化 start_urls 来实例化我的蜘蛛类,然后调用 scrapy crawl 不起作用,因为它没有找到变量 start_urls。

from flask import Flask, jsonify, request
import scrapy
import subprocess

class ClassSpider(scrapy.Spider):
    name        = 'mySpider'
    #start_urls = []
    #pages      = 0
    news        = []

    def __init__(self, url, nbrPage):
        self.pages      = nbrPage
        self.start_urls = url

    def parse(self):
        ...

    def run(self):
        subprocess.check_output(['scrapy crawl mySpider'])
        return self.news

app = Flask(__name__)
data = []

@app.route('/', methods=['POST'])
def getNews():
    mySpiderClass = ClassSpider(request.json['url'], 2)

    data.append(mySpider.run())
    return jsonify({'data': data})

if __name__ == "__main__":
    app.run(debug=True)

我得到的错误是: 类型错误:init 缺少 1 个必需的位置参数:“start_url”和“pages”

有什么帮助吗?

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    您收到此错误消息的原因是您使用命令scrapy crawl mySpider 启动了抓取过程,该命令创建了ClassSpider 的新实例。它不会通过urlnbrPage
    如果您将subprocess.check_output(['scrapy crawl mySpider']) 替换为subprocess.check_output([f'scrapy crawl mySpider -a url={self.start_urls} nbrPage={self.pages}']),它可能会起作用。此外,您应该确保 start_urls 是一个列表。
    但是,您仍然会创建同一个蜘蛛的两个单独实例,因此我建议您应该将 run 实现为以 url 和 nbrPage 作为参数的函数。
    在同一脚本中还有其他使用 Scrapy 和 Flask 的方法。为此请检查this question

    【讨论】:

    • 感谢您的回复,但是当我放上您推荐的那段代码时,我认为 start_urls 列表是不支持的。我在 def parse(self, response) 下方添加了一个 print self.start_urls,但它显示了 anythink。
    • 没问题,但这不是推荐。我不会这样做。这就是您收到此错误的原因。还有,什么?对不起,我完全不明白你不支持 start_urls 是什么意思。它应该始终有效,除非您以不支持的方式覆盖 start_requests。
    • 终于,它开始工作了。不然怎么办?
    • 我发布的链接有一个使用钩针的答案。我目前正在使用这种方法。有了它,我很容易在页面中显示来自蜘蛛的数据。可能有更好的方法,这对我来说是最容易实现和显示结果的方法。
    • 嗨@Patrick K。你对这篇文章有什么想法吗:stackoverflow.com/questions/62284110/…
    【解决方案2】:

    另一种从脚本启动蜘蛛的方法(并提供参数):

    from scrapy.crawler import CrawlerProcess
    from path.to.your.spider import ClassSpider
    from scrapy.utils.project import get_project_settings
    
    process = CrawlerProcess(get_project_settings())
    process.crawl(
        ClassSpider,
        start_urls, # you need to define it somewhere
        number_of_pages, # you need to define it somewhere
    )
    process.start()
    

    【讨论】:

    • 感谢您的回复。我试过了,但我应该知道如何定义参数!我会检查的
    猜你喜欢
    • 2014-03-18
    • 2015-10-13
    • 2019-12-10
    • 2018-10-04
    • 1970-01-01
    • 2015-09-13
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多