[英]Scrapy - Sending a new Request/using callback
深入研究比使用基本刮削功能更深入。
我理解基本的BaseSpider類:name,allowed_domains,以及如何為每個start_url發送Request對象,其中parse函數用作回調函數,parse接收Response。
我知道我的parse函數為每個名為“service-name”的類的數據保存了一個XPath響應,我相信它會通過循環遍歷存儲每個XPath響應匹配的數據到對象“item”然后發送到“TgmItem”來繼續。我的items.py容器中的類。
'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並處理每個/所有鏈接在ParseLink函數中。
我收到一個錯誤,說newUrl沒有定義,猜測請求不能接受。
我不期待任何幫助,如果有人能指出我正確的方向,或進一步研究的東西?
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
回調中想要做什么。 據我所知,您希望關注“服務名稱”鏈接並獲取每個鏈接的其他數據。 然后,我不明白為什么你需要LinkParse()
方法for link in links
循環中的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.