(我不会纵容任何非法行为,这仅用于教育目的)
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中文网其他相关文章!