Scrapy爬取TripAdvisor餐厅数据分页不生效该如何排查?
Scrapy爬取TripAdvisor分页失效问题解决方案
核心错误点
- 分页链接语法错误:
('http://tripadvisor.com' + response.css('a.nav').attrib['href']).extract()写法不符合Scrapy语法规则,attrib['href']获取到的结果已经是字符串类型,不存在extract()方法,运行会直接抛出异常,导致分页逻辑直接终止。 - 选择器匹配不准确:使用
a.nav作为选择器会匹配到所有分页导航链接,无法保证取到的是「下一页」对应的地址,很容易拿到错误的分页链接。 - 协议拼接错误:手动拼接的域名使用
http,而TripAdvisor全站已启用https,会触发重定向甚至请求失败。 - 多余的手动域名拼接:Scrapy的
response.follow()原生支持相对路径,不需要手动拼接域名,完全可以避免拼接出错的问题。
修复后的完整代码
import scrapy class TripadvSpider(scrapy.Spider): name = 'tripadv' allowed_domains = ['tripadvisor.com'] start_urls = ['https://www.tripadvisor.com/Restaurants-g60795-oa0-Philadelphia_Pennsylvania.html#EATERY_LIST_CONTENTS'] def parse(self, response): for stores in response.css('div.emrzT'): yield { # 替换extract()为get(),获取单个字符串而非列表格式的结果 'name' : stores.css('a.bHGqj::text').get(), 'link' : stores.css('a.bHGqj').xpath("@href").get() } # 直接匹配带Next文本的下一页按钮,获取href属性 next_page = response.xpath('//a[contains(text(), "Next")]/@href').get() # next_page不为空时自动跟进请求,不需要手动拼接域名 if next_page: yield response.follow(next_page, callback=self.parse)
额外注意点
如果运行后还是取不到下一页链接,大概率是TripAdvisor的页面元素类名、文本规则发生了更新,打开浏览器控制台核对下一页按钮的元素属性,调整对应选择器即可。
内容的提问来源于stack exchange,提问作者djmystica
相关产品推荐
相关产品推荐

