Java请求Biletix Solr接口报“No javascript support found”错误求助
解决Java请求返回"No javascript support found"的问题
看起来这个网站的Solr接口做了请求验证,它会检查请求是否来自真实的浏览器环境——而Java默认的HTTP请求头里没有模拟浏览器的标识,所以被拦截了,返回的"No javascript support found"其实大概率是个幌子,核心是你的请求没有通过它的浏览器检测。
下面是具体的解决办法:
1. 模拟浏览器的请求头
最关键的是设置User-Agent请求头,让服务器认为你的请求来自浏览器。另外,补充其他常见的浏览器请求头(比如Accept、Accept-Language)也能提升请求的真实性。
修改后的Java代码示例(使用HttpURLConnection)
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class SolrRequestExample { public static void main(String[] args) throws IOException { String urlStr = "http://www.biletix.com/solr/en/select/?start=0&rows=300&q=*:*&fq=start%3A%5B2018-04-01T00%3A00%3A00Z%20TO%202020-04-01T00%3A00%3A00Z%2B1DAY%5D&sort=score%20desc,start%20asc&&wt=json&indent=true&facet=..."; URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 模拟Chrome浏览器的请求头 conn.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"); conn.setRequestProperty("Accept", "application/json, text/javascript, */*; q=0.01"); conn.setRequestProperty("Accept-Language", "en-US,en;q=0.9"); conn.setRequestProperty("Connection", "keep-alive"); conn.setRequestMethod("GET"); conn.setDoInput(true); // 读取响应 BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); // 打印结果 System.out.println(response.toString()); conn.disconnect(); } }
2. 可能的其他情况
如果设置请求头后还是不行,那可能网站真的需要JavaScript渲染(比如动态生成了某些参数或者Cookie)。这种情况下,你需要使用支持JS渲染的Java库,比如:
- 使用
Selenium搭配ChromeDriver,模拟真实浏览器的操作 - 使用
HtmlUnit,一个无界面的Java浏览器,支持JS执行
举个HtmlUnit的简单示例:
import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; import java.io.IOException; public class HtmlUnitExample { public static void main(String[] args) throws IOException { try (WebClient webClient = new WebClient()) { // 启用JavaScript webClient.getOptions().setJavaScriptEnabled(true); // 忽略CSS(可选,提升速度) webClient.getOptions().setCssEnabled(false); // 模拟Chrome浏览器 webClient.getOptions().setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"); String url = "http://www.biletix.com/solr/en/select/?start=0&rows=300&q=*:*&fq=start%3A%5B2018-04-01T00%3A00%3A00Z%20TO%202020-04-01T00%3A00%3A00Z%2B1DAY%5D&sort=score%20desc,start%20asc&&wt=json&indent=true&facet=..."; HtmlPage page = webClient.getPage(url); // 等待JS执行完成(如果需要) webClient.waitForBackgroundJavaScript(5000); // 获取页面内容(这里就是返回的JSON) System.out.println(page.asText()); } } }
注意事项
- 请确保你遵守网站的
robots.txt和使用条款,不要进行恶意爬取 - 网站的验证规则可能会变化,如果上述方法失效,需要重新分析请求的差异(可以用浏览器的开发者工具对比Java请求和浏览器请求的头信息、Cookie等)
内容的提问来源于stack exchange,提问作者Omeerfk
相关产品推荐
相关产品推荐

