使用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
相关产品推荐
相关产品推荐

