使用Selenium+Java的HttpURLConnection检测链接出现403错误的原因与解决方法
为什么用HttpURLConnection验证链接返回403,手动访问却正常?
这是典型的网站反爬机制在搞事情!我帮你拆解原因和解决办法:
核心原因分析
网站会通过请求头信息判断请求是否来自正常浏览器,而你用HttpURLConnection直接发起请求时,默认没有携带浏览器的关键标识,所以被网站判定为“非人类请求”,返回403禁止访问。具体来说:
- 缺了User-Agent:这是浏览器的身份标识,没有它网站就知道这不是正常浏览器发出的请求
- 可能缺了Referer:有些网站会检查请求的来源页面,确保你是从站内跳转过来的
- 没有携带Cookie:手动访问时浏览器会保存网站的会话Cookie,而
HttpURLConnection是全新的连接,没有这些Cookie就过不了权限验证
解决办法:模拟浏览器请求
只需要给你的HttpURLConnection添加浏览器的请求头信息,就能绕过这个限制。修改后的代码如下:
for(int j=0;j< activelinks.size();j++) { String linkUrl = activelinks.get(j).getAttribute("href"); System.out.println("Active Link address and status >>> " + linkUrl); HttpURLConnection connection = (HttpURLConnection)new URL(linkUrl).openConnection(); // 1. 添加浏览器User-Agent,模拟Chrome浏览器请求 connection.setRequestProperty("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"); // 2. 添加Referer,告诉网站请求来自当前页面(替换成你爬取链接的页面URL) connection.setRequestProperty("Referer", driver.getCurrentUrl()); // 3. 从Selenium浏览器中获取Cookie,添加到请求头(如果需要的话) Set<Cookie> cookies = driver.manage().getCookies(); StringBuilder cookieStr = new StringBuilder(); for (Cookie cookie : cookies) { cookieStr.append(cookie.getName()).append("=").append(cookie.getValue()).append("; "); } if (cookieStr.length() > 0) { // 去掉最后多余的分号和空格 connection.setRequestProperty("Cookie", cookieStr.substring(0, cookieStr.length() - 2)); } connection.connect(); String response = connection.getResponseMessage(); int responsecode = connection.getResponseCode(); connection.disconnect(); System.out.println(linkUrl + ">>"+ response+ " " + responsecode); }
注意事项
- 先试试只加
User-Agent,很多情况下这就够解决问题了 - 如果还是403,再加上
Referer和Cookie - User-Agent可以根据你实际用的浏览器调整,比如Firefox、Edge的UA都可以,网上搜一下就能找到最新的
- 要是遇到更复杂的反爬(比如需要JS渲染),你也可以直接用Selenium打开链接来验证状态,不过这种方式会慢一些
内容的提问来源于stack exchange,提问作者Lipson T A
相关产品推荐
相关产品推荐

