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

时间:2014-09-16 11:50:43

标签: python xpath web-scraping scrapy

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

我理解基本的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,猜测请求无法接受。

我不期待这里的任何帮助,如果有人可以指出我正确的方向,或进一步研究的东西?

1 个答案:

答案 0 :(得分:2)

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回调中想要做什么。据我所知,您希望关注“服务名称”链接并获取每个链接的其他数据。然后,我不明白为什么在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