【问题标题】:How do I run a user defined function in a scrapy spider?如何在 scrapy 蜘蛛中运行用户定义的函数?
【发布时间】:2021-08-31 20:02:41
【问题描述】:

既然我们使用自己的终端命令运行 scrapy spiders,我该如何运行自己定义的函数?

下面的例子:

import scrapy


class Fcc(scrapy.Spider):

    name = "fcc"
    start_urls = ["http://freecodecamp.org/"]

    def parse(self, response):
        for link in response.css("a::attr(href)").getall():
            yield {
            "url": link,
            }

    def add(self):
        with open("links.txt", "a") as f:
            f.write(next(self.parse()))

所以现在如果我通过传递以下命令从终端运行蜘蛛,它只会执行 parse 函数。那么如何在需要的时候运行 add 函数呢?

scrapy runspider fcc_spider.py

因为这将帮助我处理从任何网站抓取的数据。

附言。这只是一个例子,请不要只针对这段代码给出具体的解决方案,给出在任何情况下都可以使用的解决方案。

【问题讨论】:

  • 在普通的 Python 程序中,您将传递命令行参数并使用 sys.argv 来读取它们。我不知道scrapy 是否将命令行传递给脚本,但值得检查。

标签: python scrapy web-crawler


【解决方案1】:

默认情况下,Scrapy 执行 start_requestsparse 方法。您可以使用def __init__ 来检查命令行参数并运行您的目标函数。

【讨论】:

  • 由于我对scrapy不太了解,能否详细说明或分享一个好的scrapy教程?
  • @RohanLalwani Scrapy 文档怎么样:docs.scrapy.org/en/latest
【解决方案2】:

您可以通过在您的 Scrapy 回调之一中调用用户定义的函数来运行它们。

您可以在 parse 方法内的 for 循环之前或之后调用它(记住 Scrapy 的异步特性)。

您还可以为您的 Spider 定义一个构造函数并将 links.txt 文件的内容传递给它。

以下是 Scrapy 文档中的一个示例:https://docs.scrapy.org/en/latest/topics/spiders.html#spider-arguments

【讨论】:

  • 我对异步编程和scrapy的环境一无所知,你认为我应该在继续我的scrapy项目之前学习异步编程吗?如果你有一个很好的教程可以教我scrapy以及它是如何工作的,那将不胜感激。因为scrapy文档对我来说很难理解。
  • @RohanLalwani 我相信你在开始使用 Scrapy 之前不需要学习异步编程,你可以向 Scrapy 学习,这可能是一个很好的体验。检查 Scrapy docs,随着时间的推移您会熟悉它,并使用 Scrapy data flow
【解决方案3】:

在 Python 中,可以创建 Inner Functions(函数中的函数)。

在另一个函数内部定义的函数称为内部函数或嵌套函数。在 Python 中,这种函数可以访问封闭函数中的名称。下面是一个如何在 Python 中创建内部函数的示例:

def outer_func():
     def inner_func():
         print("Hello, World!")
     inner_func()

outer_func()

输出:

Hello, World!

在此代码中,您在 outer_func() 中定义 inner_func() 以打印 Hello, World!消息到屏幕。为此,您在 outer_func() 的最后一行调用 inner_func()。这是在 Python 中编写内部函数的最快方法。但是,除了您在本示例中看到的内容之外,内部函数还提供了许多有趣的可能性。

阅读更多here

实施示例

基于此,您可以在其中一个 Scrapy 函数中创建一个函数,并在该函数中调用它。

def parse(self, response):
    def function_name(name):
        to_return = "hello {}".format(name)
        return to_return

    #Some code here...

    pharam = function_name(name)

【讨论】:

    猜你喜欢
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多