两段Yelp评论爬取脚本差异排查:一段正常一段失效
Yelp评论爬取脚本故障排查
我编写了两段用于爬取Yelp平台餐厅评论的Python脚本,第一段可正常运行并获取评论内容,但第二段脚本无法正常工作,无法理解其失效原因,希望排查问题以实现Yelp评论的爬取。
第一段可正常运行的脚本
import time import random from bs4 import BeautifulSoup as bs import urllib import urllib.request as url html = urllib.request.urlopen('https://www.yelp.com/biz/the-stillery-nashville?osq=Restaurants+Nashville+Tn').read().decode('utf-8') soup = bs(html, 'html.parser') relevant= soup.find_all('p', class_='comment__09f24__gu0rG css-qgunke') for div in relevant: for html_class in div.find_all('span',class_="raw__09f24__T4Ezm"): text = html_class.find('span') review = html_class.getText() print(review)
第二段无法正常运行的脚本
import time import random from bs4 import BeautifulSoup import urllib import urllib.request as url import html headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} url='https://www.yelp.com/biz/the-hampton-social-nashville-nashville-2?osq=Restaurants+Nashville+Tn' response=requests.get(url, headers=headers) soup2 = BeautifulSoup(response.text, 'html.parser') relevant2= soup2.find_all('p', class_='comment__09f24__gu0rG css-qgunke') for div in relevant2: for html_class in div.find_all('span',class_="raw__09f24__T4Ezm"): #text = html_class.find('span') review2 = html_class.get_text() print(review2)
故障原因分析
- 缺少
requests模块导入:第二段脚本使用了requests.get()方法,但未导入requests库,运行时会直接抛出NameError: name 'requests' is not defined错误,这是最直接的问题。 - 变量名冲突:脚本同时将
url作为urllib.request的别名和目标URL的字符串变量,覆盖了模块引用,属于不良编码习惯,可能引发后续逻辑问题。 - User-Agent版本过旧:使用的Chrome 58版本过于老旧,Yelp的反爬机制可能识别并拦截这类请求,返回的页面不包含评论内容,导致
find_all无法匹配目标元素。 - 反爬机制限制:不同商家页面的渲染逻辑存在差异,部分页面需要携带有效Cookie或会话请求才能获取完整内容,第二段脚本未处理这些,导致返回的HTML结构不含评论节点。
修复后的脚本示例
import time import random import requests from bs4 import BeautifulSoup # 更新为较新的User-Agent headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'} target_url = 'https://www.yelp.com/biz/the-hampton-social-nashville-nashville-2?osq=Restaurants+Nashville+Tn' # 添加随机延迟,模拟人类行为 time.sleep(random.uniform(1,3)) response = requests.get(target_url, headers=headers) # 检查请求是否成功 if response.status_code != 200: print(f"请求失败,状态码:{response.status_code}") else: soup2 = BeautifulSoup(response.text, 'html.parser') relevant2 = soup2.find_all('p', class_='comment__09f24__gu0rG css-qgunke') if not relevant2: print("未找到评论节点,可能被反爬拦截") else: for div in relevant2: for html_class in div.find_all('span', class_="raw__09f24__T4Ezm"): review2 = html_class.get_text() print(review2)
内容的提问来源于stack exchange,提问作者sha_phys
相关产品推荐
相关产品推荐

