使用 Jsoup 获取网页元素

Posted

技术标签:

【中文标题】使用 Jsoup 获取网页元素【英文标题】:Getting web elements using Jsoup 【发布时间】:2016-10-06 20:28:12 【问题描述】:

我正在尝试使用Jsoup 从名为 Morningstar 的网站获取股票数据。我查看了其他论坛,但无法找出问题所在。

我正在尝试进行更高级的数据报废,但我似乎无法获得价格。我要么返回 null,要么什么都没有。

我知道其他语言和 API,但我想使用 Jsoup,因为它似乎非常强大。

这是我目前所拥有的:

public class Scrape 
    public static void main(String[] args)
        String URL = "http://www.morningstar.com/stocks/xnas/aapl/quote.html";
        Document d = new Document(URL);
        try
            d = Jsoup.connect(URL).get();
        catch(IOException e)
            e.printStackTrace();
        
        Element stuff = d.select("#idPrice gr_text_bigprice").first();
        System.out.println("Price of AAPL: " + stuff);
        

任何帮助将不胜感激。

【问题讨论】:

您确定数据不是由 javascript 动态生成的吗? 【参考方案1】:

由于内容是使用 javascript 动态创建的,您可以使用无头浏览器,例如 HtmlUnit https://sourceforge.net/projects/htmlunit/

价格等信息嵌入在 iFrame 中,因此我们首先抓取(也是动态构建的)iFrame 链接,然后解析 iFrame。

java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF);

final WebClient webClient = new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setTimeout(1000);

HtmlPage page = webClient.getPage("http://www.morningstar.com/stocks/xnas/aapl/quote.html");

Document doc = Jsoup.parse(page.asXml());

String title = doc.select(".r_title").select("h1").text();

String iFramePath = "http:" + doc.select("#quote_quicktake").select("iframe").attr("src");

page = webClient.getPage(iFramePath);

doc = Jsoup.parse(page.asXml());

System.out.println(title + " | Last Price [$]: " + doc.select("#last-price-value").text());

打印:

Apple Inc | Last Price [$]: 98.63

HtmlUnit 中的 javascript 引擎相当慢(以上代码在我的机器上大约需要 18 秒),因此查看其他 javascript 引擎/无头浏览器(phantomJs 等)可能会很有用;请查看此选项列表:https://github.com/dhamaniasad/HeadlessBrowsers) 以提高性能,但 HtmlUnit 完成了工作。您还可以尝试使用自定义WebConnectionWrapper 过滤不相关的脚本、图像等:

http://htmlunit.10904.n7.nabble.com/load-parse-speedup-tp22735p22738.html

【讨论】:

以上是关于使用 Jsoup 获取网页元素的主要内容,如果未能解决你的问题,请参考以下文章

jsoup抓取页面源码的问题、源码被隐藏、

使用Jsoup获取网页内容超时设置

使用Jsoup和htmlunit爬取动态网页

jsoup获取网页属性

用jsoup解析获取一段网页内容的问题

Jsoup代码示例解析网页+提取文本