You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Scrapy爬取TripAdvisor时if else筛选条件无法生效求助

Scrapy餐厅评论数过滤逻辑修复方案

问题根因

  • 核心错误:你将评论数转为了字符串类型后执行比较,字符串比较是按ASCII码逐位匹配的,例如'9' >= '50'会返回True,完全不符合数值比较的预期。
  • 逻辑顺序错误:你先执行大小比较,再判断值是否为None,空值会先进入比较逻辑产生错误判定。
  • 细节问题:爬取到的评论数可能带有千位分隔符逗号(如1,245),直接转整数会报错;餐厅名称用getall()会返回列表格式,不符合常规存储需求。

修复后代码

import scrapy

class TripadSpider(scrapy.Spider):
    name = 'tripad'
    allowed_domains = ['www.tripadvisor.in']
    start_urls = ['https://www.tripadvisor.in/Restaurants-g304554-c33-Mumbai_Maharashtra.html']

    def parse(self, response):
        for item in response.xpath("//div[@class='_2Q7zqOgW Vt o']"):
            # 获取评论数原始值
            review_count_str = item.xpath(".//span[@class='w726Ki5B']/text()").get()
            # 先过滤空值
            if not review_count_str:
                continue
            # 处理千位分隔符,转成整数
            try:
                review_count = int(review_count_str.replace(',', ''))
            except ValueError:
                continue
            # 数值比较过滤评论数大于50的餐厅
            if review_count > 50:
                # 拼接餐厅名称多段文本,返回字符串
                title = ''.join(item.xpath(".//a[@class='_15_ydu6b S5 H4 Cj b']/text()").getall()).strip()
                yield {
                    'title': title,
                    'review_count': review_count
                }

        next_page = response.xpath("//a[@class='nav next rndBtn ui_button primary taLnk']/@href").get()
        if next_page:
            # 用Scrapy内置follow方法自动拼接域名,无需手动拼接
            yield response.follow(next_page, callback=self.parse)

关键修改说明

  • 调整了逻辑顺序,先做空值判断再做数据转换
  • 去掉了手动域名拼接逻辑,改用Scrapy原生的response.follow方法处理分页,稳定性更高
  • 新增了异常捕获逻辑,避免评论数格式异常导致爬虫中断
  • 统一了数据格式,餐厅名称返回字符串,评论数返回整数,方便后续数据处理

内容的提问来源于stack exchange,提问作者Iswar Chand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:09:03