Java jsoup 连接问题
Java jsoup connection issue
我正在尝试获取有关股票的信息,但它不起作用(我最终会将代码作为函数的输入)我正在尝试获取每股收益和市盈率,但我不断收到此错误。我将如何解决这个问题?至少我只需要 jsoup 就可以访问 html 代码。本质上,我希望代码从 P/E 比率输出 15.62。
这是我的代码:
import org.jsoup.*;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
class Main {
static Document document;
public static void main(String[] args) throws java.io.IOException{
Document doc = Jsoup.connect("https://www.nasdaq.com/symbol/aapl").get();
Elements elements = doc.select("div#table-table fontS14px");
System.out.println(elements.get(1).getAllElements().get(0).toString());
}
}
这是错误信息:
Exception in thread "main" java.net.SocketTimeoutException: Read timed out
at java.base/java.net.SocketInputStream.socketRead0(Native Method)
at java.base/java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.base/java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at java.base/sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:746)
at java.base/sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:689)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1604)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1509)
at java.base/java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:527)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:750)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:722)
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:306)
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:295)
这是我正在尝试阅读的html:
<div class="table-table fontS14px">
<div class="table-row" style="">
<div class="table-cell">
<b>P/E Ratio</b>
</div>
<div class="table-cell">
17.23
</div>
</div>
<div class="table-row" style="">
<div class="table-cell">
<b>Forward P/E (1y)</b>
</div>
<div class="table-cell">
15.62
</div>
</div>
<div class="table-row" style="">
<div class="table-cell">
<b>Earnings Per Share (EPS)</b>
</div>
<div class="table-cell">
$ 11.87
</div>
</div>
<div class="table-row">
<div class="table-cell">
<b>Annualized Dividend</b>
</div>
<div class="table-cell">
$ 2.92
</div>
</div>
<div class="table-row">
<div class="table-cell">
<b>Ex Dividend Date</b>
</div>
<div class="table-cell">
11/8/2018
</div>
</div>
<div class="table-row">
<div class="table-cell">
<b>Dividend Payment Date</b>
</div>
<div class="table-cell">
11/15/2018
</div>
</div>
<div class="table-row">
<div class="table-cell">
<b>Current Yield</b>
</div>
<div class="table-cell">
1.39 %
</div>
</div>
<div class="table-row" style="">
<div class="table-cell">
<b>Beta</b>
</div>
<div class="table-cell">
1.02
</div>
</div>
</div>
似乎 URL 尝试似乎无法访问,您只需先在浏览器中尝试一下,是否可以访问?如果是,则尝试显式设置超时,例如 Jsoup.connect("...").timeout(10*1000).get()
link 不起作用,因为在访问它之前会多次重定向您,而 JSOUP 只采用静态上下文,这就是您每次都收到该错误代码的原因。
问题尤其出在 Nasqad 上,因此如果您想检索任何股票代码的股票信息,我强烈建议您抓取 Yahoo Finance, because it works better, and if you just want the info, there's a lot of wrappers like yahoo-finance-fix for Python or Java Finance Quotes for Java。
我有一个使用 Java 制作的 Nasqad ETF 爬虫,但在 GitHub 上的私人存储库中,如果您需要它,请向我索取,我会邀请您访问存储库或其他东西!
希望对您有所帮助!有任何其他问题请随时提出!
使用免费财务数据API
我过去使用纳斯达克网站开发了一个类似的爬虫。纳斯达克网站(与其他网站类似)受 DDoS 保护,并使用节流。因此,抓取 NASDAQ 网站需要您将 HTTP headers 设置为模拟 browser-based HTTP 请求的扩展。例如,如果 User-Agent
header 为空,或者 session 未附加到您的请求中,纳斯达克将阻止您的请求。此外,还需要设置正确的 Referrer
和 X-Requested-With
header。
您可以通过
确定所需的 headers 和 cookie
- 在 Chrome、
中打开开发工具
- 切换到“网络”选项卡,
- 加载您尝试抓取的页面,
- 点击每一行(代表一个request/response),
- 查找包含您要查找的响应的行(例如 GET /symbol/aapl)
- 在详细信息中找到
Request Headers
部分
- 在您的 scraper 中使用这些 header(cookie 和领域可能会过期,即需要您再次 运行 完成第 1 步到第 7 步)
如果您需要 API 访问 ETF 数据,您可以使用 etfdb-api
Node.js 包:https://www.npmjs.com/package/etfdb-api
免责声明:我是这个包的作者:)
我正在尝试获取有关股票的信息,但它不起作用(我最终会将代码作为函数的输入)我正在尝试获取每股收益和市盈率,但我不断收到此错误。我将如何解决这个问题?至少我只需要 jsoup 就可以访问 html 代码。本质上,我希望代码从 P/E 比率输出 15.62。
这是我的代码:
import org.jsoup.*;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
class Main {
static Document document;
public static void main(String[] args) throws java.io.IOException{
Document doc = Jsoup.connect("https://www.nasdaq.com/symbol/aapl").get();
Elements elements = doc.select("div#table-table fontS14px");
System.out.println(elements.get(1).getAllElements().get(0).toString());
}
}
这是错误信息:
Exception in thread "main" java.net.SocketTimeoutException: Read timed out
at java.base/java.net.SocketInputStream.socketRead0(Native Method)
at java.base/java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.base/java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at java.base/sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:746)
at java.base/sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:689)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1604)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1509)
at java.base/java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:527)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:750)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:722)
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:306)
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:295)
这是我正在尝试阅读的html:
<div class="table-table fontS14px">
<div class="table-row" style="">
<div class="table-cell">
<b>P/E Ratio</b>
</div>
<div class="table-cell">
17.23
</div>
</div>
<div class="table-row" style="">
<div class="table-cell">
<b>Forward P/E (1y)</b>
</div>
<div class="table-cell">
15.62
</div>
</div>
<div class="table-row" style="">
<div class="table-cell">
<b>Earnings Per Share (EPS)</b>
</div>
<div class="table-cell">
$ 11.87
</div>
</div>
<div class="table-row">
<div class="table-cell">
<b>Annualized Dividend</b>
</div>
<div class="table-cell">
$ 2.92
</div>
</div>
<div class="table-row">
<div class="table-cell">
<b>Ex Dividend Date</b>
</div>
<div class="table-cell">
11/8/2018
</div>
</div>
<div class="table-row">
<div class="table-cell">
<b>Dividend Payment Date</b>
</div>
<div class="table-cell">
11/15/2018
</div>
</div>
<div class="table-row">
<div class="table-cell">
<b>Current Yield</b>
</div>
<div class="table-cell">
1.39 %
</div>
</div>
<div class="table-row" style="">
<div class="table-cell">
<b>Beta</b>
</div>
<div class="table-cell">
1.02
</div>
</div>
</div>
似乎 URL 尝试似乎无法访问,您只需先在浏览器中尝试一下,是否可以访问?如果是,则尝试显式设置超时,例如 Jsoup.connect("...").timeout(10*1000).get()
link 不起作用,因为在访问它之前会多次重定向您,而 JSOUP 只采用静态上下文,这就是您每次都收到该错误代码的原因。
问题尤其出在 Nasqad 上,因此如果您想检索任何股票代码的股票信息,我强烈建议您抓取 Yahoo Finance, because it works better, and if you just want the info, there's a lot of wrappers like yahoo-finance-fix for Python or Java Finance Quotes for Java。
我有一个使用 Java 制作的 Nasqad ETF 爬虫,但在 GitHub 上的私人存储库中,如果您需要它,请向我索取,我会邀请您访问存储库或其他东西!
希望对您有所帮助!有任何其他问题请随时提出!
使用免费财务数据API
我过去使用纳斯达克网站开发了一个类似的爬虫。纳斯达克网站(与其他网站类似)受 DDoS 保护,并使用节流。因此,抓取 NASDAQ 网站需要您将 HTTP headers 设置为模拟 browser-based HTTP 请求的扩展。例如,如果 User-Agent
header 为空,或者 session 未附加到您的请求中,纳斯达克将阻止您的请求。此外,还需要设置正确的 Referrer
和 X-Requested-With
header。
您可以通过
确定所需的 headers 和 cookie- 在 Chrome、 中打开开发工具
- 切换到“网络”选项卡,
- 加载您尝试抓取的页面,
- 点击每一行(代表一个request/response),
- 查找包含您要查找的响应的行(例如 GET /symbol/aapl)
- 在详细信息中找到
Request Headers
部分 - 在您的 scraper 中使用这些 header(cookie 和领域可能会过期,即需要您再次 运行 完成第 1 步到第 7 步)
如果您需要 API 访问 ETF 数据,您可以使用 etfdb-api
Node.js 包:https://www.npmjs.com/package/etfdb-api
免责声明:我是这个包的作者:)