因此,我尝试使用 GET 请求从 java 应用程序收集网站 ( https://search.torrents.io/ ) 的内容。
在 https://search.torrents.io/ 之后给出正确的 torrent infohash例如: https://search.torrents.io/1A1B3A4C80431A536A160FD94C2C13AFD38AF108将为我提供一些有关 torrent 的信息以及相应的 infohash(仅用于上下文,对问题并不重要)。
当从浏览器或 postman 发送 GET 请求时,网站返回响应 200,但从 java 应用程序查询网站似乎不起作用,我收到错误 403-forbidden:
Server returned HTTP response code: 403 for URL: https://search.torrents.io/1A1B3A4C80431A536A160FD94C2C13AFD38AF108
这是我的做法:
try {
rss = new URL("https://search.torrents.io/" + infohash);
httpconn = (HttpsURLConnection)rss.openConnection();
httpconn.setRequestMethod ("GET");
httpconn.setRequestProperty("Content-Language", "en-US");
httpconn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36");
httpconn.setRequestProperty("Host", "search.torrents.io:443");
httpconn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
httpconn.setRequestProperty("Sec-Fetch-Dest", "document");
httpconn.setUseCaches(false);
httpconn.setDoInput(true);
httpconn.setDoOutput(true);
} catch (Exception e) {
return(TT.ERROR);
}
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(rss.openStream()));
} catch (Exception e) {
return(TT.ERROR);
}
现在一开始我没有向请求添加任何请求属性 - 收到 403 错误并发现我必须包含 User-agent 属性才能使其表现得像浏览器请求,但这不起作用任何一个。
然后我阅读了更多内容,有人建议我查看 chrome 的实时 http headers 插件,我基本上添加了所有预设的属性,并且似乎对请求有意义。
我还发现添加用户代理适用于许多其他网站,但不适用于此网站。看起来也很奇怪,它是从 postman 那里工作的,而 postman 也不是真正的浏览器。如果请求包含相同的 header ,那么它们不应该等于服务器吗?
有人知道如何解决这个问题吗? 非常感谢任何意见。
谢谢, 马蒂奇
最佳答案
感谢您的建议。
所以,我没有解决这个问题,问题可能是我正在查询的网站识别出查询来自默认的 java 库。我通过使用另一个库修复了它。
关于java - 即使包含 User-Agent 属性,从 java 对网站的 GET 请求也会返回 403,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60486724/