我是scrapy的初学者,我一直在尝试执行以下工作流程:从页面A
开始,这是一个结果搜索页面,其中包含url end为数字的完整文章的链接。我的目的是获取每个结果搜索页面的每个链接,访问链接并废弃完整的文章。
我遍历每个页面,收集带有以下规则的链接:
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
根据我对sc {的tutorial的理解,我需要在解析器方法结束时返回项目,以便规则正确附加到项目的最终列表中,我可以将其放入json文件中或者由控制台运行的其他东西。注意响应下面的这部分并返回崩溃的呼叫。我无法弄清楚如何同时使用请求和退货项目。
方法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'
您可以找到完整的可运行代码here。在运行时,您将看到它不断抛出异常。如果执行直接修复是可行的,并且对此有什么问题进行简短解释,我会很感激,因为类似的问题会让我在网上找到Django相关的问题。
答案 0 :(得分:0)
只放置一个回调参数,使用self.parse_full_story
(Request()
期望可调用; see here)
“回调名称字符串”版本仅适用于规则(see here)
使用
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),
)