使用Python requests库请求HTTP时遇404但浏览器可正常访问的问题
嘿,我碰到过好多次这种情况!明明浏览器打开好好的,用requests爬就返回404,大概率是你的请求“不像”正常用户的请求,网站把你当爬虫挡了。给你拆解几个最常见的原因:
缺失关键请求头信息
很多网站会检查请求里的User-Agent字段,requests库默认的User-Agent是类似python-requests/2.31.0的标识,一眼就被网站识别成爬虫了。而浏览器发送的User-Agent是对应浏览器的标识,比如Chrome的Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36。
你可以给请求加上这个字段试试:import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } url_2 = "https://stackoverflow.com/questions/36516183/what-should-i-use-instead-of-urlopen-in-urllib3" page_t = requests.get(url_2, headers=headers) print(page_t.status_code) # 现在应该能返回200了需要Cookie验证
部分网站会依赖Cookie来识别用户会话(比如是否登录、是否是正常访问的用户),浏览器会自动保存网站的Cookie,但requests默认是不带任何Cookie发起请求的,这也会导致网站返回404。你可以通过浏览器开发者工具复制当前的Cookie,加到请求头里,或者用requests.Session()来维持会话获取Cookie。IP或地区限制
如果你的爬虫IP被网站列入了黑名单,或者网站只允许特定地区的IP访问,也会出现浏览器能打开但爬虫返回404的情况。这种时候可以试试更换代理IP,或者确保你的请求IP和浏览器使用的IP一致。重定向处理差异
虽然requests默认会自动处理重定向,但有些网站的重定向逻辑比较特殊,比如需要特定的请求参数或者头信息才能触发正确的重定向,这时候也可能导致返回404。你可以开启allow_redirects=False查看原始响应,看看是否有重定向的线索。
内容的提问来源于stack exchange,提问作者Paul Vannan

