当前位置: 首页 > 知识库问答 >
问题:

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

莘翰采
2023-03-14

钻研比使用基本刮擦功能更深。

我了解基本的BaseSpider类:名称、允许的\u域,以及如何为每个start\u url发送请求对象,其中parse函数用作回调函数,parse接收响应。

我知道我的解析函数为每个名为“服务名称”的类的数据保存了一个XPath响应,我相信它会通过循环将每个XPath响应匹配的数据存储到对象“项”中,然后将其发送到“我的items.py容器。

'newUrl'包含连接的URL,需要刮接下来,我需要弄清楚如何让LinkParse函数刮每个newUrl找到,或接收所有链接,它刮个别。

我知道meta用于解析我的对象项数据,回调给请求一个发送响应的函数。

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

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并在ParseLink函数中处理每个/所有链接)。

我得到一个错误说newUrl没有定义,猜测请求不能接受。

我不希望在这里得到任何帮助,如果有人能为我指出正确的方向,或者做一些进一步的研究?

共有1个答案

郜彦
2023-03-14

newUrl变量未定义。改为使用项['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()方法中的linkin-links循环中需要这个

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

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

 类似资料:
  • 问题内容: 是否可以使用Python的库发送SOAP请求? 问题答案: 确实有可能。 这是一个使用普通请求lib调用Weather SOAP Service的示例: 一些注意事项: 标头很重要。没有正确的标头,大多数SOAP请求将无法工作。可能是更 正确 使用的标头(但weatherservice更喜欢 这将以xml字符串形式返回响应-然后,您需要解析该xml。 为简单起见,我以纯文本形式包含了该

  • 问题内容: 我是Web服务的新手,正在尝试使用python脚本发送以下基于JSON的请求: 如果我将以上内容粘贴到浏览器中,它将按预期工作。但是,我正在努力从Python发送请求。以下是我正在尝试的: 如何将apikey数据添加到请求中? 谢谢! 问题答案: 代替使用urllib2,您可以使用request。这个新的python lib确实写得很好,并且使用起来更加简单直观。 要发送json数据,

  • 我正试图使用Guzzle6 http客户端发送一个post请求。我发送了两个请求,一个内容类型为(Guzzle),另一个为(Guzzle)。 我将客户机初始化如下(分别为和): 我收到的响应没有相同的数据/正文: :的输出 但是为什么我首先问这个问题是因为我面临签名不匹配的问题。 当我发送请求时,我添加了一个带有签名的头,签名是。因此,当以和的形式发送数据时,我得到了不同的签名(因为在的情况下,接

  • 发送请求 发送同步请求 Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/ Web3ClientVersion web3ClientVersion = web3.web3ClientVersion().send(); String clientVersion = web3Client

  • 问题内容: 我一直在尝试从SO和其他站点上的大量示例中学习,但是我无法弄清楚为什么我一起学习的示例无法正常工作。我正在构建一个小型的概念验证应用程序,该应用程序可以识别语音并将其(文本)作为POST请求发送到node.js服务器。我确认了语音识别功能,并且服务器正在通过常规浏览器访问获得连接,因此我被认为是问题出在应用程序本身。我想念一些小而愚蠢的东西吗?没有引发任何错误,但是服务器从不识别连接。

  • 我试图向远程服务器发送HTTP GET请求,并在HTML页面上使用响应。下面是project/js/script.js页面 在我的响应标题中,这是我得到的 远程地址:127.0.0.1:63342 请求URL:localhost:63342/object 请求方法:获取 状态代码:404未找到 请求头 接受:申请/json,文本/平原,/ 接受编码:gzip、deflate、sdch 接受语言:e