You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用urllib2爬取网页遭遇JavaScript验证问题

嗨,我来帮你搞定这个网页爬取的问题!

你遇到的这个提示,本质是目标站点做了反爬检测:要么它识别出你的请求不是真实浏览器发出的,要么它需要JavaScript来完成重定向/加载内容,而urllib2作为纯HTTP请求库,本身不支持执行JS,所以就被拦截了。下面给你几个实用的解决思路:

1. 补全请求头,让请求更像真实浏览器

你现在的Accept头没写完整,而且还可以补充其他浏览器常用的请求头字段,很多反爬机制会检查这些细节。修改后的请求头可以这样写:

hdr = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'Referer': 'https://目标站点的首页地址/',  # 替换成你要爬的站点首页URL
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1'
}

然后在urllib2里使用这个请求头:

import urllib2

try:
    req = urllib2.Request('你的目标页面URL', headers=hdr)
    response = urllib2.urlopen(req)
    content = response.read()
    # 处理返回内容
except urllib2.HTTPError as e:
    print(f"请求出错:{e.code}")
    print(e.read())

2. 用支持JS渲染的工具处理重定向

如果补全请求头还是不行,那大概率是站点需要执行JS才能完成重定向。这时候可以换用轻量的requests-html库(比Selenium简单很多),它能模拟浏览器执行JS:

首先安装库:

pip install requests-html

然后写代码:

from requests_html import HTMLSession

session = HTMLSession()
headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5'
}
# 发送请求并执行JS
r = session.get('你的目标页面URL', headers=headers)
r.html.render()  # 这一步会触发JS执行,完成重定向
# 获取最终页面内容
print(r.html.html)

3. 保持会话和Cookie

有些站点会在首次访问时设置Cookie,后续请求必须带上这些Cookie才能正常访问。用urllib2的话可以通过CookieJar来处理会话:

import urllib2
import cookielib

# 创建CookieJar管理会话Cookie
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)

# 先访问站点首页获取Cookie
opener.open('https://目标站点首页URL')

# 再请求目标页面,自动带上之前获取的Cookie
req = urllib2.Request('你的目标页面URL', headers=hdr)
response = opener.open(req)
content = response.read()

先从补全请求头开始试,不行的话再换JS渲染工具,基本就能解决这个问题啦!

内容的提问来源于stack exchange,提问作者pseudocode425

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:34:39