gpt4 book ai didi

python - Scrapy - 发送新请求/使用回调

转载 作者:行者123 更新时间:2023-11-28 17:39:54 24 4
gpt4 key购买 nike

比基本抓取功能的使用更深入。

我了解基本的 BaseSpider 类:name、allowed_domains,以及如何为每个 start_url 发送 Request 对象,其中 parse 函数用作回调函数,parse 接收 Response。

我知道我的解析函数为每个名为“service-name”的类的数据保存了一个 XPath 响应,我相信它会通过循环遍历该数据来继续,将每个 XPath 响应匹配存储到对象“item”中,然后发送到“我的 items.py 容器中的 TgmItem 类。

“newUrl”包含接下来需要抓取的串联 URL,我需要弄清楚如何让 LinkParse 函数抓取找到的每个 newUrl,或者接收所有链接以单独抓取。

我知道 meta 用于解析我的对象项数据,并且回调为 Request 提供了一个将响应发送到的函数。

LinkParse 将用于从所有已抓取的链接中抓取更多数据,例如:“item['test']=link.xpath('test()').extract())”

def parse(self, response):
links = response.selector.xpath('//*[contains(@class, "service-name")]')
for link in links:
item = TgmItem()
item['name'] = link.xpath('text()').extract()
item['link'] = link.xpath('@href').extract()
item['newUrl'] = response.url.join(item['link'])
yield Request(newUrl, meta={'item':item}, callback=self.LinkParse)

def LinkParse(self, response):
links = response.selector.xpath('*')
for link in links:
item = response.request.meta['item']
item['test'] = link.xpath('text()').extract()
yield item

我知道在回调函数中你解析了一个响应(网页),我需要它是所有或每个链接(但我认为要解决这个问题,我必须发送当前的 response.url 并处理每个/所有链接(s) 在 ParseLink 函数中。

我收到一条错误消息,提示 newUrl 未定义,我猜测 Request 无法接受它。

我不希望在这里得到任何帮助,如果有人能给我指出正确的方向,或者有什么可以进一步研究的吗?

最佳答案

newUrl 变量未定义。而是使用 item['newUrl']:

yield Request(item['newUrl'], meta={'item': item}, callback=self.LinkParse)

此外,response.url.join() 调用对我来说没有意义。如果要将 response.urlhref 属性值结合使用,请使用 urljoin() :

item['newUrl'] = urlparse.urljoin(response.url, item['link'])

此外,我不确定您在 LinkParse 回调中要做什么。据我了解,您想点击“服务名称”链接并为每个链接获取额外数据。然后,我不明白为什么您需要 LinkParse() 方法中的 for link in links 循环。

据我所知,您的 LinkParse() 方法应该如下所示:

def LinkParse(self, response):
newfield = response.selector.xpath('//myfield/text()').extract()
item = response.meta['item']
item['newfield'] = newfield
return item

关于python - Scrapy - 发送新请求/使用回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25868040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com