0

我是 scrapy 的初学者,我一直在尝试执行以下工作流程: Start from page A,这是一个结果搜索页面,其中包含 url 结尾为数字的完整文章的链接。我的意图是抓取每个结果搜索页面的每个链接,访问这些链接并废弃整篇文章。

我使用以下规则遍历每个收集链接的页面:

   rules = (Rule(SgmlLinkExtractor(allow=(r'\d+',)), callback='parse_short_story',follow=True),)

每个都确保在我收集完链接并删除当前页面的完整文章后,搜索页面的最后一位迭代到下一位。

parse_short_story方法仅使用 select 过滤 html 页面的一部分,然后循环剩余部分以获取完整故事的链接并将其传递给请求:

for short_story in short_stories:
        item = DmozItem()

        full_story_link = short_story.select(".//h2/a/@href").extract()

        if full_story_link:
            yield Request(full_story_link, self.parse_full_story, callback='self.parse_full_story', errback=lambda _: item, meta=dict(item=item),)            

        items.append(item)
    return items     

根据我对scrapy教程的理解,我需要在解析器方法结束时返回项目,以便规则正确地附加到项目的最终列表中,我可以将这些项目放入json文件或其他运行的东西中安慰。请注意响应和返回调用下面的这部分崩溃。我不知道如何同时使用请求和退货项目。

该方法像dos一样parse_full_story获取response参数parse_short_story,并恢复我作为参数发送的项目

    item = response.meta.get('item')

item在我使用的物品上正确设置了我想要的信息后return item

总之,

我的期望是该规则将使用回调处理包含完整文章链接的搜索页面移动parse_short_story,而对于每个页面的每个链接,parse_full_story将访问这些链接的完整文章,废弃我想要的,添加到item项目,然后退出,希望最终扫描所有完整的文章。

显然我的理解是错误的,我得到了错误: 你可以在这里 yield Request(full_story_link, self.parse_full_story, callback='self.parse_full_story', errback=lambda _: item, meta=dict(item=item),) exceptions.TypeError: __init__() got multiple values for keyword argument 'callback' 找到完整的可运行代码。当它运行时,你会看到它一直在抛出异常。如果执行直接修复和给出/或对此问题的简短解释是可行的,我将不胜感激,因为类似的问题导致我在网络上与 Django 相关的问题。

4

1 回答 1

0

只放一个回调参数,使用self.parse_full_storyRequest()期望一个可调用的;见这里

“回调名称字符串”版本仅适用于规则(请参阅此处

利用

yield Request(full_story_link,
    self.parse_full_story,
    errback=lambda _: item,
    meta=dict(item=item),
)

代替

yield Request(full_story_link,
    self.parse_full_story, callback='self.parse_full_story',
    errback=lambda _: item,
    meta=dict(item=item),
)
于 2013-09-25T15:53:05.867 回答