Python爬取TripAdvisor请求极慢,尝试多种方案仍触发read操作超时报错
问题根因
你碰到的超时是反爬拦截导致的,浏览器能正常打开但代码请求失败,核心原因是你的请求没有模拟浏览器特征,被TripAdvisor的反爬系统识别为爬虫,直接拦截了请求。
修复步骤
- 修正错误的URL拼接,删掉末尾多余的
/robots.txt,#REVIEWS是页面锚点,不需要带到实际请求路径里 - 给请求添加浏览器的User-Agent请求头,伪装成正常浏览器访问
- 每次请求之间加随机间隔,避免触发频率限制
- 优先用
requests库替代原生urllib,处理请求更灵活,适配反爬场景更方便
可直接运行的修复后代码
import time import random import pandas as pd import requests from bs4 import BeautifulSoup as bssoup hotel_reviewnames2 = [] hotel_review2 = [] # 伪装浏览器请求头,可替换为你自己浏览器的实际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" } for i in range(7,9): urlp1 = 'https://www.tripadvisor.com.ph/Hotel_Review-g298459-d3914035-Reviews-or' urlp2 = '-Park_Inn_by_Radisson_Davao-Davao_City_Davao_del_Sur_Province_Mindanao.html' realurl = urlp1 + str(i*5) + urlp2 print(realurl) resp = requests.get(realurl, headers=headers, timeout=30) resp.encoding = 'utf-8' soup6 = bssoup(resp.text, 'html.parser') hotelreviewsDavaonames3 = soup6.find_all('a', class_='ui_header_link bPvDb') hotelreviewsDavao3 = soup6.find_all('div', class_='pIRBV _T') for x in hotelreviewsDavaonames3: hotel_reviewnames2.append(x.text.split()) for y in hotelreviewsDavao3[1::2]: hotel_review2.append(y.text.split('\n')) # 随机等待1-3秒,避免请求太频繁被封 time.sleep(random.uniform(1,3)) df4 = pd.DataFrame({ 'Reviewer_Name':hotel_reviewnames2, 'Reviews':hotel_review2 }) print(df4)
额外注意事项
- 如果你想要继续用
urllib,只需要构造Request对象把headers传进去即可,逻辑和上面一致 - 如果后续还是出现拦截,可以再加
Referer、Accept-Language等其他请求头,和你浏览器实际请求的头保持一致即可 - 不要短时间内发起大量请求,避免IP被临时封禁
内容的提问来源于stack exchange,提问作者Aurumen
相关产品推荐
相关产品推荐

