Python requests获取的HTML与浏览器不一致,如何获取完全一致的HTML?
解决IMDb搜索页爬取HTML与浏览器不一致的问题
出现这种情况的核心原因是IMDb的反爬机制:默认的requests/urllib请求头会暴露爬虫身份,且部分页面内容是通过JavaScript动态渲染生成的,静态请求无法获取完整内容。以下是针对性的解决方法:
1. 模拟浏览器请求头
服务器会通过请求头识别访问来源,默认requests的User-Agent是python-requests/xxx,很容易被拦截。添加浏览器级别的请求头可以绕过基础反爬:
import requests base_url = "https://www.imdb.com" search_url = base_url + "/search/title/?" params = { "title_type": "feature", "release_date": "2022-01-01,2022-12-31", "start": 1 } # 模拟Chrome浏览器的请求头,可根据自己浏览器实际请求头调整 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", "Accept-Language": "en-US,en;q=0.9", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Referer": "https://www.imdb.com/" } response = requests.get(search_url, params=params, headers=headers) print(response.text)
2. 处理JavaScript动态渲染内容
如果添加请求头后仍无法获取和浏览器一致的HTML,说明页面核心内容是JS动态加载的,静态HTTP请求无法拿到渲染后的结果。此时需要用浏览器自动化工具模拟真实加载过程:
以Selenium为例(需提前安装selenium库和对应浏览器驱动):
from selenium import webdriver from selenium.webdriver.chrome.options import Options import time base_url = "https://www.imdb.com" search_url = base_url + "/search/title/?" params = { "title_type": "feature", "release_date": "2022-01-01,2022-12-31", "start": 1 } full_url = search_url + "&".join([f"{k}={v}" for k, v in params.items()]) # 配置无头模式(不弹出浏览器窗口),保留浏览器请求特征 chrome_options = Options() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("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") driver = webdriver.Chrome(options=chrome_options) driver.get(full_url) # 等待页面JS加载完成,根据页面复杂度调整等待时间 time.sleep(3) # 获取完全渲染后的页面源码 page_source = driver.page_source print(page_source) driver.quit()
3. 规避反爬封禁
- 控制请求频率,添加随机延迟(比如
time.sleep(random.uniform(1,3))),避免短时间内大量请求。 - 若频繁被封,可使用代理IP池分散请求来源。
- 遵守IMDb的
robots.txt规则,不要爬取禁止索引的内容。
内容的提问来源于stack exchange,提问作者shaik moeed
相关产品推荐
相关产品推荐

