【问题标题】:scrapy item loader to get a absolute url from extracted urlscrapy 项目加载器从提取的 url 中获取绝对 url
【发布时间】:2013-11-14 05:09:13
【问题描述】:

我正在使用/学习scrapy,python 框架来抓取一些我感兴趣的网页。在那之后,我提取了页面中的链接。但在大多数情况下,这些链接是相对的。我使用了scrapy.utils.url 中的urljoin_rfc 来获取绝对路径。效果很好。

在学习过程中,我发现了一个名为Item Loader 的功能。现在我想使用 Item loader 做同样的事情。我的urljoin_rfc() 在用户定义的函数函数_urljoin(url,response) 中。我希望我的加载程序现在引用函数_urljoin。所以在我的加载器类中我做link_in = _urljoin()。所以我将我的 _urljoin 声明更改为_urljoin(url, response = loader_context.response)。 但我收到一条错误消息说NameError: name 'loader_context' is not defined

我在这里需要帮助。我这样做是因为,不仅在加载时我调用了 _urljoin(),我的代码的其他部分也调用了函数 _urljoin。如果我做得非常糟糕,请引起我的注意。

【问题讨论】:

    标签: python web-scraping scrapy


    【解决方案1】:

    如果您在其他地方使用_urljoin(url, response),您可以保持原样,接受响应作​​为第二个参数。

    现在,Item Loaders 的处理器可以接受上下文,但上下文是所有输入和输出处理器共享的任意键/值的字典 (from the docs)。 p>

    所以你可以有包装函数调用你的_urljoin(url, response)

    def urljoin_w_context(url, loader_context):
        response = loader_context.get('response')
        return _urljoin(url, response)
    

    在您的ItemLoader 定义中:

        ...
        link_in = MapCompose(urljoin_w_context)
        ...
    

    最后在您的回调代码中,当您实例化您的 ItemLoader 时,传递响应引用:

    def parse_something(self, response):
        ...
        loader = ItemLoader(item, response=response)
        ...
    

    【讨论】:

    • 这意味着我不能拥有一个加载器函数和一个通用函数。我在 _urljoin 中做的不多。因此,我将使用两个不同的(加载器功能和通用功能)功能来完成我的工作,这将节省我的切换时间。谢谢
    • 这个代码link_in = urljoin_w_context应该在哪里?我在类 abcLoader(ItemLoader) 中的蜘蛛中编写此代码
    • 嘿,如果你能告诉我应该在哪里以及如何调用 Loader 函数@paul t,我会很高兴。
    • 我编辑了答案以使用 ItemLoader 中的处理器。其他使用输入/输出处理器的方法详见the docs
    • 我在这里发现有点困惑。没有获得添加加载程序的写入方式。你能告诉我应该在哪里以及如何声明和定义 ItemLoader。通过我在哪个文件中的位置。它是在蜘蛛还是在项目中。我应该使用 Mapcompose()。不能直接调用函数名吗
    猜你喜欢
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2012-08-27
    相关资源
    最近更新 更多