python - 如何抓取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
解决方案
你只得到 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)
推荐阅读
- laravel - 自定义电子邮件验证通知
- latex - tikz png 输出不输出 png
- c# - 将对象类型从 IEnumerable 更改为 IQueryable 后,开始接收 LINQ 上下文错误
- algorithm - 找到最接近给定 3D 线集的点的算法
- c# - 如何让 Coroutine Timer 更流畅
- reactjs - 'stepped' paginationType 在控制台中产生 React 警告
- c# - Grpc.Auth:无法从程序集“Grpc.Core.Api”加载类型“Grpc.Core.CallCredentials”
- python - 按条件将值广播到数据帧组
- python - Paramiko 是重用会话还是为每个 exec_command 调用打开一个新会话?
- java - 涉及 javax 的导入问题