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

使用Python爬取Yelp点评始终返回首页内容的问题咨询

问题1:为什么requests.get请求始终返回20条结果

Yelp商家点评页的分页规则为固定单页返回最多20条公开点评,属于平台默认的内容分发规则,和请求代码无关,属于正常现象。

问题2:为什么循环迭代/直接指定start=20都返回第一页内容

该问题通常由两类原因导致,可逐一排查:

  • 参数拼接错误:首先确认你构造的完整请求URL是否符合预期,建议在发起请求前打印完整URL,核对base_url末尾是否存在多余的斜杠、无效参数,导致start参数被平台忽略。你代码中x*19+x等价于x*20,如果你的url_list是从0开始的整数序列,参数计算逻辑本身没有问题,优先核对拼接后的完整URL是否和你手动测试的URL完全一致。
  • 反爬机制拦截:Yelp有较为严格的反爬策略,若请求头缺少必要字段(如正确的User-Agent、cookie)、请求频率过高,平台会直接返回第一页内容作为拦截响应,哪怕start参数正确。你可以先在浏览器隐身窗口访问start=20的URL,确认可正常加载第二页点评后,将浏览器的完整请求头复制到你的headers变量中,同时在两次请求之间增加2-3秒的间隔,降低被识别为爬虫的概率。

参考优化代码片段

import time
import json
import requests
from bs4 import BeautifulSoup

# 替换为你本地浏览器抓取的真实请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.5",
    "Connection": "keep-alive"
}

base_url = "https://www.yelp.com/biz/moto-i-ramen-and-sake-house-minneapolis-2?start="
url_list = [0,1,2,3,4] # 对应5页,start值依次为0、20、40、60、80

for x in url_list:
    current_url = base_url + str(x * 20)
    # 打印当前请求URL方便核对
    print("请求地址:", current_url)
    response = requests.get(current_url, headers=headers)
    
    if response.status_code != 200:
        print("请求失败,状态码:", response.status_code)
        break
        
    text = BeautifulSoup(response.text, "html.parser")
    script_tags = text.findAll('script', {'type': 'application/ld+json'})
    
    if len(script_tags) >= 2:
        file = str(script_tags[1])
        file2 = str(file.strip()[35:-9])
        data = json.loads(file2)
        # 打印当前页点评数量验证结果是否正确
        print("当前页点评数:", len(data.get("review", [])))
    
    # 增加请求间隔避免被拦截
    time.sleep(3)

内容的提问来源于stack exchange,提问作者Elliott Wong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:24:04