问题描述
我遇到以下错误:“请求网址必须为str或unicode,获取列表”
起始网址为“ https://www.zomato.com/istanbul/restaurants?page=1”
import scrapy
def parse(self,response):
all_css = response.css('.search_left_featured')
all_product = all_css.css('a::attr(href)').extract()
yield scrapy.Request(all_product,callback=self.parse_dir_contents)
max_page_number = 10
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()
name = response.css('.iNaazl::text').extract()
genre =response.css('.PhzdX::text').extract()
location =response.css('.gqeQEx::text').extract()
tags = response.css('.cunMUz::text').extract()
address = response.css('.clKRrC::text').extract()
phone = response.css('.kKemRh::text').extract()
items['name']= name
items['genre']= genre
items['location']= location
items['tags']= tags
items['address']= address
items['phone_number']= phone
yield items
解决方法
您的问题是什么?错误似乎很明显:.css
返回一个SelectorList
,其extract
方法返回一个list
,然后将其传递给需要URL的Request
,哪个不是列表。
要么迭代结果,要么使用scrapy的.get()
和.getall()
方法(更现代,更容易混淆),extract()
已弃用(因为在scrapy中已不再使用它了它的文档),因为它的行为取决于在Selector(返回字符串)或SelectorList(返回列表)上的调用而有所不同。
地狱,都做。