每当我试图在某个网站上执行GET请求时(如下所示(,我总是会收到SocketTimeoutException。我只在Java中遇到这个问题,而如果我尝试使用Python的requests
库,我就成功地获得了文本。
String link = "https://www.yeezysupply.com/api/products/FV6125/availability";
try {
Connection connection = Jsoup.connect(link);
connection.header("content-type", "application/json; charset=utf-8");
Document document = connection.get();
System.out.println(document.text());
} catch (IOException e) {
e.printStackTrace();
}
以下是错误的屏幕截图:https://prnt.sc/rp1ym9
我主课的64号线是Document document = connection.get();
此外,当我使用Chrome扩展插件"PlugMan"时,我可以通过GET请求成功地从网站获取正文,所以很明显,我在Java中的操作方式存在问题,因为它在其他地方也能工作。
谢谢。
EDIT,该网站有一个防止机器人的对策。我让它响应的唯一方法是使用用户代理。这就是你用JSoup:设置它的方式
Response resp = Jsoup.connect(link)
.userAgent("User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15")
.followRedirects(true)
.execute();
Document document = resp.parse();
我最初的(错误的(假设保留在下面供参考:
我不认为这是Java或编码问题。该网站根本没有回应。网站是否已启动,或者您是否为Python配置了所需的代理,而Java代码中没有使用它?如果是这样的话,看看这个:https://docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html
当我在工作站上尝试一个简单的wget时,网站没有回答:
$ wget https://www.yeezysupply.com/api/products/FV6125/availability
--2020-03-29 17:59:13-- https://www.yeezysupply.com/api/products/FV6125/availability
Resolving www.yeezysupply.com (www.yeezysupply.com)... 184.28.114.123, 184.28.114.129
Connecting to www.yeezysupply.com (www.yeezysupply.com)|184.28.114.123|:443... connected.
HTTP request sent, awaiting response... Read error (Operation timed out) in headers.
Retrying.
两条备注:
content-type
不是请求标头。它用于描述服务器响应内容。为了指示您所期望的内容,您应该使用accept
标头- 添加
user-agent
标头是一个好习惯。有些服务器在没有用户代理的情况下不会响应,这里就是这样
connection.header("accept", "text/html, application/xhtml+xml, application/xml");
connection.header("user-agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/74.0");
上面这两个使联系成为可能,但我不得不让你失望。不管您在accept
头中设置了什么,响应都包含JSON,Jsoup不能解析JSON,只能解析HTML和XML。你必须使用其他库来下载和解析它
编辑:
使用Jsoup而不是将JSON下载到字符串
connection.get();
用途:
connection.ignoreContentType(true).execute().body();