首页 > 解决方案 > 如何抓取zomato上的所有href?

问题描述

我正试图爬进 zomato 以获取伊斯坦布尔餐厅的信息。所以,我正在尝试获取搜索结果页面中的所有 href。但是,我只得到每个页面的第一个搜索结果。

import scrapy
from ..items import ZomatodataItem

class ZomatoSpider(scrapy.Spider):
    name = 'zomato'
    allowed_domains = ["zomato.com"]
    start_urls = [
        'https://www.zomato.com/istanbul/restaurants?page=1'
    ]

    def parse(self, response):
        all_css = response.css('.search_left_featured')
        all_product = all_css.css('a::attr(href)').get()

        yield scrapy.Request(all_product, callback=self.parse_dir_contents)

        max_page_number = 6
        for i in range(1, max_page_number):
            url_next = 'https://www.zomato.com/istanbul/restaurants?page=' + str(i)+''
            yield scrapy.Request(url_next, callback=self.parse)

    def parse_dir_contents(self, response):
        items = ZomatodataItem()

        items['name'] = response.css('.diBDma::text').extract()
        items['genre'] = response.css('.gQXqL::text').extract_first()
        items['tags'] = response.css('.cunMUz::text').extract()
        items['address'] = response.css('.clKRrC::text').extract()
        items['phone_number'] = response.css('.kKemRh::text').extract()

        yield items

标签: pythonscrapyweb-crawler

解决方案


你只得到 1 个结果是有道理的 - 'all_product' 将只包含 1 个项目。如果要获取完整列表,则必须将其更新为:

all_products = all_css.css('a::attr(href)').getall()

现在您可以遍历链接并获取详细信息,如下所示:

for product in all_products:
  yield scrapy.Request(product, callback=self.parse_dir_contents)

推荐阅读