使用Java HtmlUnit爬取Parimatch网站返回AccessDenied错误如何解决
错误原因
- 请求头未模拟真实浏览器:你当前使用WebClient发起的请求默认携带的是爬虫特征的请求标识,网站的Web应用防火墙识别到非浏览器请求后,直接拦截返回AccessDenied错误。
- 错误关闭了JavaScript支持:该站点的页面内容完全依赖前端JavaScript动态渲染生成,且部分反爬验证逻辑需要JS执行通过才会返回正常内容,关闭JS支持后既无法通过校验,也无法拿到渲染后的完整内容。
- IP区域限制:这类博彩站点普遍配置了区域访问限制,如果你发起请求的IP不在站点允许访问的区域范围内,也会直接返回拒绝访问提示。
修复方案
首先调整WebClient的配置,模拟真实浏览器的请求特征,代码修改示例如下:
public static void main(String[] args) throws IOException { String url = "https://parimatch.com"; WebClient webclient = new WebClient(); // 配置真实浏览器的请求头 webclient.addRequestHeader("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"); webclient.addRequestHeader("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); webclient.addRequestHeader("Referer", "https://www.google.com"); // 开启JavaScript支持,关闭不必要的错误抛出 webclient.getOptions().setJavaScriptEnabled(true); webclient.getOptions().setCssEnabled(false); webclient.getOptions().setThrowExceptionOnScriptError(false); webclient.getOptions().setThrowExceptionOnFailingStatusCode(false); // 等待3秒让JS完成页面渲染 webclient.waitForBackgroundJavaScript(3000); HtmlPage page = webclient.getPage(url); System.out.println(page.asText()); }
- 如果调整配置后仍然返回拒绝访问,可尝试使用符合站点访问区域要求的代理IP发起请求。
- 重要提示:博彩类网站在中国大陆属于非法运营站点,请勿对该类站点开展任何爬取、访问操作,避免违反相关法律法规。
内容的提问来源于stack exchange,提问作者Dima Bondarenko
相关产品推荐
相关产品推荐

