使用Requests访问特定网页出现500服务器错误,但Selenium可正常访问的问题求助
我有一个使用requests模块检查网页新闻更新的脚本,一周前还能正常工作,但现在遇到了一个奇怪的错误。我可以用requests访问基础网址(www.example.com),但访问www.example.com/news/123456时会出现500错误,错误内容如下:
Internal Server Error
Sorry, There were some technical issues while processing your request.
不过用selenium访问就没有这个问题,有没有人知道为什么只有requests会出现这个错误?
以下是我的代码:
import requests from bs4 import BeautifulSoup # 注:原代码中使用了BeautifulSoup但未导入,此处补充以保证代码可运行 url = 'www.example.com/news/123456/' # Headers that I got from the (working) selenium request headers = {'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/90.0.4430.212 Safari/537.36'} response = requests.get(url, headers=headers) webpage_content = response.text soup = BeautifulSoup(webpage_content, 'html.parser') raw_lines = soup.find_all() lines = '\n'.join([line.get_text() for line in raw_lines]) lines = lines.splitlines() for line in lines: print(line)
我的排查建议:
这情况我之前也碰到过好几次,大概率是你的requests请求缺少了某些Selenium会自动带上的关键细节,给你几个具体的排查方向:
先补全完整的URL:你当前的
url没有带上http://或https://前缀,虽然requests偶尔能自动补全,但不少服务器对这种不规范的URL处理会出错。先把URL改成http://www.example.com/news/123456/或者https://开头的完整地址试试,这是最容易忽略但见效快的点。补充更多关键请求头:除了
user-agent,Selenium发送请求时还会自动带上一堆浏览器默认的请求头,比如Accept、Accept-Language、Referer这些,有些服务器会校验这些字段来识别“真实浏览器”。你可以打开浏览器开发者工具(F12),找到Selenium请求的完整头信息,把这些字段都复制到headers字典里,比如:headers = { 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/90.0.4430.212 Safari/537.36', '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': 'http://www.example.com/', 'DNT': '1', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1' }检查Cookie的影响:Selenium在访问网站时,可能已经保存了会话Cookie(比如登录状态、会话标识、验证令牌),而你的
requests请求是全新的会话,没有带上这些Cookie,导致服务器拒绝处理。你可以从Selenium的浏览器实例中导出Cookie,转换成requests可用的格式添加到请求中:# 示例:从Selenium获取Cookie并转换 # cookies_list = driver.get_cookies() # cookies = {cookie['name']: cookie['value'] for cookie in cookies_list} # 然后在请求中带上cookies参数 response = requests.get(url, headers=headers, cookies=cookies)反爬机制的检测:有些网站会检测请求是否来自真实的JavaScript渲染环境——Selenium会模拟浏览器渲染页面,而
requests只是静态获取HTML,服务器可能会通过返回动态内容(需要JS渲染)或直接返回错误来拦截静态请求。这种情况下,你可以试试用requests-html(支持JS渲染的requests扩展),或者继续用Selenium获取页面内容后,再传给BeautifulSoup解析。
建议你先从补全URL和补充请求头开始尝试,这两个是最常见的触发原因,解决起来也最快~
备注:内容来源于stack exchange,提问作者Kovy Jacob

