为何爬取MakeMyTrip与Tanishq网站时频繁出现访问拒绝或超时?
无法爬取MakeMyTrip与Tanishq网站的原因及解决思路
用户问题
无法爬取以下两个网站:Make My Trip、Tanishq。以下是我的代码:
import requests from bs4 import BeautifulSoup request_headers = { "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36', 'X-Crawlera-Profile': 'pass', 'X-Crawlera-Cookies': 'disable', "Upgrade-Insecure-Requests": "1", 'sec-fetch-site': 'none', 'sec-fetch-mode': 'navigate', 'sec-fetch-user': '?1', 'sec-ch-ua-mobile':'?0', 'sec-fetch-dest': 'document', "Dnt": "1", 'cache-control': 'no-cache', "Accept-Encoding": "gzip, deflate,br", 'accept-language': 'en-GB,en-US;q=0.9,en;q=0.8', "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", } try: response = requests.get('https://makemytrip.com/',headers=request_headers,timeout=20,stream=True) soup = BeautifulSoup(response.text, 'html.parser') print(str(soup)) except requests.exceptions.Timeout as t: print(str(t)) print ("Timeout occurred") except Exception as e: print(str(e))
我也尝试过使用Selenium,但依旧无法爬取这些网站。请问可能是什么问题?
核心原因分析
1. 严格的反爬机制
这类旅游、电商网站普遍配备多层反爬策略:
- 指纹识别:requests的请求头虽模拟了浏览器,但缺少完整的动态特征(如
sec-ch-ua的完整标识);Selenium默认会暴露window.navigator.webdriver属性,被网站直接判定为自动化工具。 - IP封禁:频繁请求会触发IP黑名单,单一IP的规律性请求极易被识别为爬虫。
- CDN防护:多数网站采用Cloudflare、Akamai等CDN,会拦截异常请求并要求人机验证,普通爬取工具无法直接绕过。
2. 代码配置不合理
你的requests代码中包含X-Crawlera-Profile和X-Crawlera-Cookies两个Crawlera专属请求头——如果未配置Crawlera代理服务,这些头会被网站识别为异常请求,直接拒绝或返回无效内容。
3. 动态内容与会话依赖
- 网站大量内容通过AJAX动态加载,requests直接GET只能拿到空的静态骨架;Selenium若未设置足够的等待时间,也会在内容加载完成前抓取到空数据。
- 部分页面需要会话Cookie验证,代码禁用了Crawlera的Cookie处理,但未手动维护会话,导致请求被判定为未授权。
可行解决方向
1. 修复请求头配置
移除无用的X-Crawlera-*头,补充完整的浏览器特征:
request_headers = { "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36', "sec-ch-ua": '"Not_A Brand";v="99", "Google Chrome";v="108", "Chromium";v="108"', "sec-ch-ua-platform": '"Windows"', "Referer": "https://www.google.com/", # 模拟从搜索引擎跳转 # 保留其他必要头,删除X-Crawlera相关项 }
2. 优化Selenium反检测
改用undetected-chromedriver替代普通Selenium,自动修改浏览器指纹避免被识别:
from undetected_chromedriver import Chrome, ChromeOptions from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By options = ChromeOptions() options.add_argument("--headless=new") # 可选无头模式 driver = Chrome(options=options) driver.get("https://www.makemytrip.com/") # 显式等待确保页面加载完成 WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.CLASS_NAME, "header-container"))) print(driver.page_source) driver.quit()
3. 代理与请求频率控制
- 使用高匿代理池,每次请求轮换IP,避免单一IP被封禁。
- 添加随机延迟(如
time.sleep(random.uniform(1, 3))),模拟人类浏览节奏,降低反爬触发概率。
4. 处理CDN与动态内容
- 针对Cloudflare防护,可尝试使用
cfscrape库配合requests绕过基础验证。 - Selenium中优先使用显式等待(
WebDriverWait)而非固定延迟,确保目标元素加载完成后再抓取。
内容的提问来源于stack exchange,提问作者Sammon Babu
相关产品推荐
相关产品推荐

