1. 程式人生 > 其它 >scrapy傳遞 item時的 資料不匹配 和一些注意事項

scrapy傳遞 item時的 資料不匹配 和一些注意事項

用scrapy框架大多是為了完成一些列表頁和詳情頁的請求 這個時候需要發起兩個請求 一個parse 一個parse_detail,這個時候通常會使用yield 來發起一個請求,並通過 callback 回撥函式,可有時候會出現資料對應不上的問題

這個時候需要檢查你的程式碼 不要 多寫yield 尤其是 發起兩個請求 不要多謝yield item 不然 直接傳給item 會導致請求錯誤

錯誤!!!!

 

 

 

正確:

 

 

 

並且在傳值item時 會出現 獲取到最後一個item的情況,而且是迴圈呼叫最後一個,就像是上面yield 這一部分是個for迴圈,但是下面的parse方法不再迴圈內,所以就只能一直呼叫到最後一個item.

所以我們可以使用 copy.deepcopy 深拷貝

因為深拷貝完全拷貝了父物件及其子物件。所以再統一傳值給 parse_detail 由parse_detail 傳值給item

程式碼如下

 def parse(self, response, **kwargs):
        # 匯入item都西昂
        item = CurrenyItem()
        # 完成列表頁提取 獲得一個selector 列表物件
        ul_resp =response.xpath('//*[@id="pc"]//div[@class="nyrtct"]/ul/li')
        
# 遍歷 for li in ul_resp: # 拿到連結地址 item['title_url'] = li.xpath('./a/@href').extract_first() # 拿到連結標題 item["title_name"] = li.xpath('./a/@title').extract_first() # 拿到標題i時間 item["title_date"] = li.xpath('./span/text()').extract_first()
# 強轉 url 這步可以忽略 item['title_url'] = str(item['title_url']) # 傳值 yield scrapy.Request( url=item['title_url'], callback=self.parse_detail, # 用深拷貝的方式 複製子物件 等 meta={'item': copy.deepcopy(item)}) # 完成下一頁連結的的提取 next_url = response.xpath('//*[@id="pc"]//div[@class="show_page"]/a[@class="next"]/@href').extract_first() # 如果下頁不為空 則一直重複回撥 if next_url is not None: yield scrapy.Request(url=next_url,callback=self.parse) def parse_detail(self, response): # 獲得item item = response.meta['item'] # 拿到詳情頁正文內容 item['content_html'] = response.xpath('//*[@id="pc"]/div/div/div[@class="main1"]').extract_first() # 如果精確匹配匹配不到 就換一個xpath if item['content_html'] is None: item['content_html'] = response.xpath('/html/body/div[4]/div[2]').extract_first() # 強轉字串 可忽略 item['content_html'] = str(item['content_html']) # 列印是否成功 print(item['title_name'],">>>>>>>>>ok") # 統一傳值給item yield item

 

【轉載自己的文章 ~~~】