比使用基本抓取功能更深入。
我理解基本的BaseSpider类:name,allowed_domains,以及如何为每个start_url发送Request对象,其中parse函数用作回调函数,parse接收Response。
我知道我的parse函数为每个名为“service-name”的类的数据保存了一个XPath响应,我相信它会通过循环遍历存储每个XPath响应匹配的数据到对象“item”然后发送到我的items.py容器中的“TgmItem类。
'newUrl'包含下一个需要删除的连接URL,我需要弄清楚如何让LinkParse函数抓取每个找到的newUrl,或者接收所有链接以便单独删除。
我知道meta用于解析我的对象项数据,而callback为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,猜测请求无法接受。
我不期待这里的任何帮助,如果有人可以指出我正确的方向,或进一步研究的东西?
答案 0 :(得分:2)
newUrl
变量未定义。而是使用item['newUrl']
:
yield Request(item['newUrl'], meta={'item': item}, callback=self.LinkParse)
此外,response.url.join()
电话对我没有意义。如果您想将response.url
与href
属性值合并,请使用urljoin()
:
item['newUrl'] = urlparse.urljoin(response.url, item['link'])
此外,我不确定你在LinkParse
回调中想要做什么。据我所知,您希望关注“服务名称”链接并获取每个链接的其他数据。然后,我不明白为什么在for link in links
方法中需要LinkParse()
循环。
据我了解,您的LinkParse()
方法应如下所示:
def LinkParse(self, response):
newfield = response.selector.xpath('//myfield/text()').extract()
item = response.meta['item']
item['newfield'] = newfield
return item