网页抓取作业出现403错误,请求排查解决方法
网页抓取403错误的解决方法及代码修正
403错误是Yelp的反爬系统把你的请求识别成了非浏览器发起的爬虫请求,直接拒绝了访问。光加User-Agent往往不够,结合你的代码问题,给你分步解决:
一、强化请求头,模拟真实浏览器
Yelp会检查多个请求头字段,只加User-Agent不够,补充这些字段能大幅降低被拦截的概率:
Accept:告诉服务器你能接受的内容类型Accept-Language:模拟浏览器的语言设置Referer:模拟从搜索页面跳转过来的请求
二、添加请求延迟
频繁请求会触发反爬,每次请求后加1-3秒的延迟,避免被判定为恶意爬虫。
三、修正代码里的语法错误
你的代码存在几个明显bug,会导致即使请求成功也无法正常运行:
- for循环变量名重复(
for listings in listings),应改为for listing in listings - except语法错误,正确写法是
except AttributeError: - 变量拼写错误,循环里误用了
listings代替listing
修正后的完整代码
import requests from bs4 import BeautifulSoup import time # 导入time模块用于设置延迟 # Yelp目标页面URL URL = "https://www.yelp.com/biz/whistle-stop-cafe-rockledge?osq=Coffee+Shops" # 更完整的请求头,模拟真实Chrome浏览器(可替换成你自己浏览器的UA) HEADERS = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", "Referer": "https://www.yelp.com/search?find_desc=Coffee+Shops&find_loc=Rockledge" } # 添加请求延迟,避免频繁访问 time.sleep(2) response = requests.get(URL, headers=HEADERS) if response.status_code == 200: soup = BeautifulSoup(response.content, "html.parser") # 注意:Yelp的类名会经常变化,需要用浏览器检查工具获取最新的类名 listings = soup.find_all("div", {"class": "css-1qn0b6x"}) for listing in listings: try: # 这里的类名需要你自己用浏览器检查确认是否有效 name = listing.find("h1", {"class": "y-css-olzveb"}).text address = listing.find("p", {"class": "y-css-p0gpmm"}).text print(f"名称: {name}, 地址: {address}") except AttributeError: # 跳过缺少名称或地址的条目 continue else: print(f"页面获取失败,状态码: {response.status_code}")
额外提示
- 如果你还是遇到403,可以尝试更换User-Agent(直接复制你当前浏览器的UA,方法是在浏览器地址栏输入
about:version查看) - 不要短时间内重复请求同一页面,Yelp的反爬机制很严格,多次违规可能会封IP
- Yelp有官方API,如果长期需要抓取数据,优先考虑使用API,比爬虫更稳定合规
内容的提问来源于stack exchange,提问作者Reefman411
相关产品推荐
相关产品推荐

