我正在尝试获取有关股票的信息,但是它不起作用(我最终会将股票代码作为函数的输入)我试图获取每股收益和市盈率,但是我一直在获取这个错误。我该如何解决?至少我只需要jsoup就能访问html代码。本质上,我希望代码从本益比输出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>
答案 0 :(得分:0)
似乎正在尝试访问的URL似乎无法自我访问,您只需先在浏览器中尝试它,即可访问吗?如果是,则尝试显式设置超时,例如Jsoup.connect(“ ...”)。timeout(10 * 1000).get()
答案 1 :(得分:0)
该链接不起作用,因为在访问它之前,您会多次重定向,并且JSOUP仅采用静态上下文,这就是为什么每次都会得到该错误代码的原因。
尤其是Nasqad的问题,因此,如果您要检索任何股票报价的股票信息,我强烈建议您抓取Yahoo Finance,因为它可以更好地工作,并且如果您只想要该信息,则可以很多包装器,例如yahoo-finance-fix用于Python或Java Finance Quotes用于Java。
我有一个使用Java制作的Nasqad ETF搜寻器,但在GitHub上的私有存储库中,如果您需要它,请问我,我会邀请您加入回购协议!
希望它对您有所帮助!随时要求其他任何东西!
答案 2 :(得分:0)
使用免费的财务数据API
我过去使用纳斯达克网站开发了一种类似的刮板。纳斯达克网站(类似于其他网站)受到DDoS保护,并使用限制。因此,要爬网NASDAQ网站要么要求您将HTTP标头设置为模拟基于浏览器的HTTP请求的扩展。例如,如果User-Agent
标头为空,或者会话未附加到您的请求中,则纳斯达克将阻止您的请求。另外,将需要设置正确的Referrer
和X-Requested-With
标头。
您可以通过
确定所需的标题和cookie。Request Headers
部分如果需要通过API访问ETF数据,则可以使用etfdb-api
Node.js程序包:https://www.npmjs.com/package/etfdb-api
免责声明:我是这个软件包的作者:)