照着教程写Python爬虫定位元素返回None,他人可运行我无法成功是为什么
问题排查与修复方案
1. 核心语法错误
请求商品详情页后,解析时误用了之前搜索页的响应内容:
r2 = requests.get(testlink) soup = BeautifulSoup(r.content, 'lxml') # 此处r为搜索页响应对象,需替换为r2.content
修正后代码:
soup = BeautifulSoup(r2.content, 'lxml')
2. 反爬拦截处理
目标站点存在基础反爬规则,默认requests请求的User-Agent会被识别为爬虫,返回拦截页面,无法定位到目标元素。需添加请求头模拟浏览器访问:
# 全局定义请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36' } # 所有get请求都携带headers r = requests.get(f'https://www.thewhiskyexchange.com/search?q=japanese+whiskey&pg={x}&psize=24&sort=rdesc', headers=headers) r2 = requests.get(testlink, headers=headers)
3. 逻辑缺陷修正
time.sleep(5)位置错误:延时放置在解析逻辑后无法起到防反爬作用,需调整到两次请求之间。- 评分定位规则不合理:不同商品的星级class后缀随分数动态变化,写死
star-rating--45会导致其他商品定位失败,建议改为模糊匹配:
rating = soup.find('span', class_=lambda c: c and 'review-overview__rating' in c)
4. 环境校验
确保本地已安装lxml解析库,未安装可执行命令pip install lxml完成安装,否则解析规则会失效。
可通过打印r2.status_code确认请求是否成功,打印r2.text确认返回内容和浏览器访问结果一致。
内容的提问来源于stack exchange,提问作者Lee Eugene
相关产品推荐
相关产品推荐

