問題描述
抓取回調函數 (Scrapy callback function)
我有一個基本的scrapy腳本,它執行以下操作:
- 訪問網站
使用規則獲取所有頁面:
rules = ( Rule(LinkExtractor(allow=(), restrict_xpaths=('//*[@id="pagination_top"]/a',)), callback="parse_page", follow= True), )
在每個頁面中,獲取產品頁面的所有鏈接:
def parse_page(self, response): for href in response.css("#prod_category > ul > li > a::attr('href')"): url = response.urljoin(href.extract()) yield scrapy.Request(url, callback=self.parse_dir_contents)
並訪問每個產品頁面以獲取有關產品的詳細信息。然後我從另一個鏈接獲取更多詳細信息
def parse_dir_contents(self, response): # select xpath here print '________________________BEGIN PRODUCT________________________' item = detailedItem() item['title'] = sites.xpath('//*[@id="product‑name"]/text()').extract() # get url_2 from this page request = scrapy.Request(url_2, callback=self.parse_detailed_contents) request.meta['item'] = item yield request
最後是獲取產品詳細信息的函數
我認為這是最後一個 parse_detailed_contents是我有問題的地方
def parse_detailed_contents(self, response): item = response.meta['item'] sel = Selector(response) sites = sel.xpath('//*[@id="prod‑details"]') print '________________________GETTING DETAILS________________________' item['prod_details'] = sites.xpath('//*[@id="prod‑details"]/div/text()').extract() return item
問題是我的腳本返回項目['prod_details' ] 用於第一個鏈接,但不返回任何後續鏈接的項目。
那是因為 url_2 對所有產品都一樣嗎?
有人可以幫忙嗎?提前非常感謝!
參考解法
方法 1:
try adding dont_filter=True
def parse_dir_contents(self, response):
# select xpath here
print '________________________BEGIN PRODUCT________________________'
item = detailedItem()
item['title'] = sites.xpath('//*[@id="product‑name"]/text()').extract()
# get url_2 from this page
request = scrapy.Request(url_2, callback=self.parse_detailed_contents,dont_filter=True)
request.meta['item'] = item
yield request
(by user6055239、jithin)