(我不會縱容任何非法行為,這僅用於教育目的)
Scrapy 是 Python 中最好的網頁抓取框架之一,它易於使用、快速且功能豐富。
但是如果我們想遞歸地抓取多個頁面怎麼辦?例如產品頁面。
最簡單的方法是為請求函數添加一個簡單的回呼。
這是 Scrapy 專案中的一個程式碼片段,用於抓取包含 Amazon、eBay 和 Etsy 等列出的產品的網站:
def parse(self, response): links = response.css('a.s-item__link::attr(href)').getall() for link in links: yield Request(url=link, callback=self.parse_item) next_page = response.css('a.pagination___next.icon-link::attr(href)').get() if next_page: print('Next page: %s' % next_page) yield Request(url=next_page, callback=self.parse) def parse_item(self, response): title = response.xpath('//h1[@class="x-item-title___mainTitle"]/span/text()').get() price = response.xpath('//span[@id="prcIsum"]/text()').get() yield {'title':title, 'price':price}
首先,它使用以下程式碼行來取得產品頁面上列出的每個項目的連結:
links = response.css('a.s-item__link::attr(href)').getall()
然後循環遍歷每個鏈接,發送請求以獲取頁面來源並對 parse_item 進行回調:
for link in links: yield Request(url=link,callback=self.parse_item)
在 parse_item 函數中,它會取得商品的標題和價格:
def parse_item(self, response): title = response.xpath('//h1[@class="x-item-title__mainTitle"]/span/text()').get() price = response.xpath('//span[@id="prcIsum"]/text()').get() yield {'title':title, 'price':price}
然後我們的程式碼獲取下一頁的鏈接,透過自身回調(即解析函數)來請求它,然後重新開始:
next_page = response.css('a.pagination__next.icon-link::attr(href)').get() if next_page: print('Next page:%s' % next_page) yield Request(url=next_page,callback=self.parse)
就是這樣,就這麼簡單!
使用 Scrapy 遞歸地抓取產品頁面可以像向 Request 函數添加回調一樣輕鬆實現。
以上是如何使用 Scrapy 和請求回呼在 Python 中抓取產品頁面(Etsy、Amazon、Ebay)的詳細內容。更多資訊請關注PHP中文網其他相關文章!