使用urllib读取网页仅获元数据,如何获取实际页面HTML?
解决Distil反爬,获取实际页面内容
兄弟,你这明显是撞上Distil Networks的反爬机制了!你拿到的那段HTML里的<meta http-equiv="refresh">、sessionStorage操作还有隐藏样式,都是它用来检测是否为真实浏览器访问的手段——普通的urllib只是发送了纯HTTP请求,根本不执行JavaScript,自然过不了它的验证,只能拿到这个“拦截页”。
要拿到页面检查里看到的实际内容,你需要模拟真实浏览器的行为,这里给你两个实用的方案:
方案一:用Selenium操控真实浏览器
Selenium可以调用Chrome、Firefox这类真实浏览器,自动执行JS、处理页面跳转,完美绕过这类需要浏览器环境的反爬。
步骤:
- 先安装Selenium库:
pip install selenium - 下载对应浏览器的Driver(比如ChromeDriver,要和你的Chrome版本匹配),放到系统PATH里或者指定路径。
示例代码:
from selenium import webdriver from selenium.webdriver.chrome.options import Options import time # 设置浏览器选项,模拟真实UA options = Options() options.add_argument('user-agent=Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11') # 可选:无头模式(不弹出浏览器窗口) # options.add_argument('--headless=new') # 初始化浏览器 driver = webdriver.Chrome(options=options) try: # 访问目标页面 driver.get('https://www.example.com') # 等待页面加载完成(可以根据实际元素等待,更精准) time.sleep(3) # 获取实际渲染后的HTML源码 actual_html = driver.page_source print(actual_html) finally: # 关闭浏览器 driver.quit()
方案二:用Playwright(更轻量,无需单独装Driver)
Playwright是微软推出的自动化工具,自带浏览器驱动,API更简洁,也能很好处理动态页面和反爬。
步骤:
- 安装Playwright和浏览器:
pip install playwright playwright install chrome
示例代码:
from playwright.sync_api import sync_playwright with sync_playwright() as p: # 启动浏览器,设置UA browser = p.chromium.launch(headless=False) # headless=True可以不显示窗口 page = browser.new_page(user_agent='Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11') page.goto('https://www.example.com') # 等待页面加载完成 page.wait_for_load_state('networkidle') # 获取实际HTML actual_html = page.content() print(actual_html) browser.close()
注意事项
- 不要频繁请求!给请求加个随机延迟(比如2-5秒),不然很容易被封IP。
- 如果目标网站有验证码,可能还需要额外处理,但先把浏览器模拟这一步搞定,大部分基础反爬都能过。
- 新手阶段先专注于模拟浏览器的基础用法,等熟悉了再考虑代理池、随机UA池这些进阶操作。
内容的提问来源于stack exchange,提问作者user3457834
相关产品推荐
相关产品推荐

