【问题标题】:Scraping data from webpage. Java, HTMLUnit从网页中抓取数据。 Java、HTML单元
【发布时间】:2016-09-27 13:25:12
【问题描述】:

我正在尝试从网页中抓取一些信息。我的问题是我得到的回报不包含我正在寻找的东西。

如果我检查网络的源代码,我会发现一个空白部分

<section id="player-controller">
</section>

但如果我检查我想要从中获取数据的元素,它们会出现在该部分中

由于它是动态生成的,我尝试使用 HTMLUnit,但仍然无法获得它。也许我看错了。

有什么方法可以使用 HTMLUnit 获取代码,还是应该使用其他工具?

已解决

通过使用 HTMLUnit 并在打印页面之前让进程停止一段时间,我得到它来打印丢失的内容

WebClient webclient = new WebClient();
    HtmlPage currentPage = webclient.getPage("https://www.dubtrack.fm/join/chilloutroom");
    Thread.sleep(2000);
    System.out.println(currentPage.asXml());

【问题讨论】:

    标签: java web-scraping htmlunit


    【解决方案1】:

    如果您在首次加载页面时检查其文本,动态内容将不会被加载。 callScraper.html 中的 javascript 将调用另一个页面,然后等待两秒钟,然后再读取 HTML 元素的内容。这里的时机可能很棘手。我希望下面的代码会有所帮助。

    callScraper.html

    <!DOCTYPE html>
    <head>
    <title>Call test for scraping</title
    <meta charset="UTF-8" />
    <script>
    var newWindow;
    var contents;
    function timed() {
    contents.value = contents.value + "\r\n" +"function timed started" + "\r\n";
    contents.value = contents.value + "\r\n" + newWindow.document.getElementById("player-controller").innerHTML;
    }
    function starter() {
    // alert("Running starter");
    contents = document.getElementById("contents");
    newWindow = window.open("scraper.html");
    contents.value = contents.value + "\r\nTimer started\r\n";
    setTimeout(timed, 2000);
    }
    window.onload=starter;
    </script>
    </head>
    <body>
    <p>This will open another page and then diplay an element from that page.</p>
    <form name="reveal">
    <textarea id="contents" cols="50" rows="50"></textarea>
    </form>
    </body>
    </html>
    

    scraper.html

    <!DOCTYPE html>
    <head>
    <title>Test for scraping</title>
    <meta charset="UTF-8" />
    <script>
    var section;
    function starter() {
    section = document.getElementById("player-controller");
    // alert(":"+section.innerHTML+";");
    section.innerHTML = "<p>inner text</p>";
    // alert(":" +section.innerHTML + ":");
    }
    window.onload = starter;
    </script>
    </head>
    <body>
    <p>See http://stackoverflow.com/questions/37513393/scrapping-data-from-webpage-java-htmlunit</p>
    <section id="player-controller">
    
    </section>
    </body>
    </html>
    

    【讨论】:

    • 你的想法奏效了。我在java中实现它,调用页面并在打印代码之前等待几秒钟。
    【解决方案2】:

    你可以试试jsoup

    检查我想要从中获取数据的元素,它们出现在动态生成的部分中

    API 允许使用最好的 DOM、CSS 和类似 jquery 的方法来提取和操作数据。在数据被 AJAX 加载之前,您可能需要执行一些操作。

    【讨论】:

    • 我也试过 Jsoup,据我了解它不支持 javascript/ajax,我猜它是用来填补空白的。我正在尝试为数据发送 GET 请愿书,而且一开始似乎可以正常工作,但仍需要对其进行更多测试。
    • 看起来与headless browser 的组合可能会奏效。
    猜你喜欢
    • 2013-02-16
    • 1970-01-01
    • 2018-03-20
    • 2016-11-16
    • 2022-01-21
    • 2021-07-17
    • 2011-03-23
    • 1970-01-01
    • 2015-07-15
    相关资源
    最近更新 更多