Python网页爬取遇HTTP 403错误,如何解决指定URL访问问题?
解决爬取特定URL时的HTTP 403错误
我尝试爬取https://hayabusa.open2ch.net/test/read.cgi/livejupiter/1700322786/l50时持续遇到HTTP 403错误,以下是初始代码及错误信息:
初始代码
import requests url = 'https://hayabusa.open2ch.net/test/read.cgi/livejupiter/1700322786/l50' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36', 'Referer': 'https://www.google.com/' } res = requests.get(url, headers=headers) print('res=', res)
运行错误
res= <Response [403]>
我还尝试添加更多请求头,但问题仍未解决:
headers = { 'authority': 'www.google.com', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'accept-language': 'en-US,en;q=0.9', 'cache-control': 'max-age=0', 'cookie': 'SID=ZAjX93QUU1NMI2Ztt_dmL9YRSRW84IvHQwRrSe1lYhIZncwY4QYs0J60X1WvNumDBjmqCA.; __Secure-#..', 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', 'sec-ch-ua-arch': '"x86"', 'sec-ch-ua-bitness': '"64"', 'sec-ch-ua-full-version': '"115.0.5790.110"', 'sec-ch-ua-full-version-list': '"Not/A)Brand";v="99.0.0.0", "Google Chrome";v="115.0.5790.110", "Chromium";v="115.0.5790.110"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-model': '""', 'sec-ch-ua-platform': 'Windows', 'sec-ch-ua-platform-version': '15.0.0', 'sec-ch-ua-wow64': '?0', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'same-origin', 'sec-fetch-user': '?1', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36', 'x-client-data': '#..', }
可行的解决方法
1. 修正请求头核心字段
你当前设置的authority是第三方域名,与目标网站不符,这会被服务器判定为异常请求。同时调整Referer为目标网站自身域名,避免跨域嫌疑:
headers = { 'authority': 'hayabusa.open2ch.net', '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', 'Referer': 'https://hayabusa.open2ch.net/', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' }
2. 复制浏览器真实请求头
直接用浏览器访问目标URL,打开F12开发者工具→网络标签,找到对应请求的完整请求头(敏感Cookie可暂时移除,或保留有效Cookie),复制后替换到代码中,最大程度模拟真实浏览器请求。
3. 使用Session保持会话状态
requests.Session()可自动处理Cookie和连接复用,模拟浏览器的持续会话,避免单次请求被拦截:
import requests url = 'https://hayabusa.open2ch.net/test/read.cgi/livejupiter/1700322786/l50' session = requests.Session() 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', 'Referer': 'https://hayabusa.open2ch.net/' } # 先请求主页获取初始会话Cookie session.get('https://hayabusa.open2ch.net/', headers=headers) # 再请求目标页面 res = session.get(url, headers=headers) print('res=', res)
4. 绕过Cloudflare等反爬服务
如果以上方法都无效,大概率网站使用了Cloudflare之类的反爬防护。可以用cloudscraper库绕过(先安装:pip install cloudscraper):
import cloudscraper url = 'https://hayabusa.open2ch.net/test/read.cgi/livejupiter/1700322786/l50' scraper = cloudscraper.create_scraper() res = scraper.get(url) print('res=', res)
内容的提问来源于stack exchange,提问作者Noah
相关产品推荐
相关产品推荐

