Java jsoup连接问题

Posted

技术标签:

【中文标题】Java jsoup连接问题【英文标题】:Java jsoup connection issue 【发布时间】:2019-04-14 12:57:25 【问题描述】:

我正在尝试获取有关股票的信息,但它不起作用(我最终会将股票代码作为函数的输入)我正在尝试获取每股收益和市盈率,但我一直在获取这个错误。我将如何解决这个问题?至少我只需要 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">
                        $&nbsp;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>

【问题讨论】:

我已经改了,还是一样的错误 【参考方案1】:

该链接不起作用,因为在访问它之前会多次重定向您,而 JSOUP 只采用静态上下文,这就是您每次都收到该错误代码的原因。

问题出在 Nasqad 上,所以如果你想检索任何股票代码的股票信息,我强烈建议你抓取 Yahoo Finance,因为它效果更好,如果你只想要信息,这里有很多像 yahoo-finance-fix 用于 Python 或 Java Finance Quotes 用于 Java 的包装器。

我有一个使用 Java 制作的 Nasqad ETF 爬虫,但在 GitHub 上的私有存储库中,如果你需要它,请向我索取,我会邀请你加入 repo 或其他什么!

希望对您有所帮助!如有其他要求,请随意!

【讨论】:

谢谢,我试用了 Yahoo Finance 库,效果很好,但我对你的 etf 爬虫很感兴趣,如果你可以的话,我想要一个邀请【参考方案2】:

似乎尝试的 URL 似乎无法访问,您只需先在浏览器中尝试,是否可以访问?如果是,则尝试显式设置超时,例如 Jsoup.connect("...").timeout(10*1000).get()

【讨论】:

链接可访问 我分别尝试了 (10*1000) 和 (10*10000) 超时,但两次都没有用【参考方案3】:

使用免费的财务数据 API

https://iextrading.com/developer/docs/#stocks

我过去曾使用 NASDAQ 网站开发过类似的爬虫。纳斯达克网站(类似于其他网站)受 DDoS 保护,并使用限制。因此,爬取纳斯达克网站要么需要您将 HTTP 标头设置为模拟基于浏览器的 HTTP 请求的扩展。例如,如果User-Agent 标头为空,或者会话未附加到您的请求,纳斯达克将阻止您的请求。此外,还需要设置正确的 ReferrerX-Requested-With 标头。

您可以通过

确定所需的标头和cookies
    在 Chrome 中打开开发工具, 切换到“网络”标签, 加载您尝试抓取的页面, 点击每一行(代表一个请求/响应), 找到包含您要查找的响应的行(例如 GET /symbol/aapl) 在详细信息中找到Request Headers 部分 在您的 scraper 中使用这些标头(cookie 和领域可能会过期,即要求您再次执行步骤 1. 到 7.)

如果您需要 API 访问 ETF 数据,可以使用 etfdb-api Node.js 包:https://www.npmjs.com/package/etfdb-api

免责声明:我是这个包的作者 :)

【讨论】:

以上是关于Java jsoup连接问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Jsoup 通过 HTTPS 连接?

java [JAVA]如何从Http连接获取JSession id(使用Jsoup)

Java Jsoup 下载 torrent 文件

Jsoup错误握手期间远程主机关闭连接

JAVA网络爬爬学习之HttpClient+Jsoup

连接错误:“org.jsoup.UnsupportedMimeTypeException:未处理的内容类型”