使用jsoup和selenium进行网络抓取

时间:2014-12-31 11:59:39

标签: java html selenium web-scraping jsoup

我想用selenium和jsoup从这个动态网站中提取一些信息。要获取我想要提取的信息,我必须单击“Detailsöffnen”按钮。第一张图片显示了点击该按钮之前的网站,第二张图片显示了点击该按钮后的网站。红色标记的信息是我想要提取的信息。

enter image description here

enter image description here

我首先尝试仅使用Jsoup提取信息,但正如我被告知Jsoup无法处理动态内容,因此我现在尝试使用selenium和Jsoup提取信息,就像您在源代码中看到的那样。 Howerver我不确定selenium是否是正确的,所以也许还有其他方法来提取我需要的信息更简单,但重要的是可以用Java完成。

接下来的两张图片会在点击按钮之前和点击按钮之后显示html代码。

enter image description here

enter image description here

public static void main(String[] args) {

    WebDriver driver = new FirefoxDriver(createFirefoxProfile());
    driver.get("http://www.seminarbewertung.de/seminar-bewertungen?id=3448");
    //driver.findElement(By.cssSelector("input[type='button'][value='Details öffnen']")).click();
    WebElement webElement = driver.findElement(By.cssSelector("input[type='submit'][value='Details öffnen'][rating_id='2318']"));
    JavascriptExecutor executor = (JavascriptExecutor)driver;
    executor.executeScript("arguments[0].click();", webElement);
    String html_content = driver.getPageSource();
    //driver.close();


    Document doc1 = Jsoup.parse(html_content);
    System.out.println("Hallo");

    Elements elements = doc1.getAllElements();
    for (Element element : elements) {
        System.out.println(element);
    }

}

private static FirefoxProfile createFirefoxProfile() {
    File profileDir = new File("/tmp/firefox-profile-dir");
    if (profileDir.exists())
        return new FirefoxProfile(profileDir);
    FirefoxProfile firefoxProfile = new FirefoxProfile();
    File dir = firefoxProfile.layoutOnDisk();
    try {
        profileDir.mkdirs();
        FileUtils.copyDirectory(dir, profileDir);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return firefoxProfile;
}

使用这个源代码,我找不到包含我想要提取的信息的div元素。

如果有人可以帮助我,那真的很棒。

1 个答案:

答案 0 :(得分:3)

如果生成javascript,Jsoup无法处理动态内容,但在您的情况下,按钮正在发出Ajax请求,这可以通过Jsoup完成。

我建议打电话来解除按钮及其ID,然后进行成功调用(Ajax帖子)以检索详细信息(评论或其他)。

代码可以是:

    Document document = Jsoup.connect("http://www.seminarbewertung.de/seminar-bewertungen?id=3448").get();
    //we retrieve the buttons
    Elements select = document.select("input.rating_expand");
    //we go for the first
    Element element = select.get(0);
    //we pick the id
    String ratingId = element.attr("rating_id");

    //the Ajax call
    Document document2 = Jsoup.connect("http://www.seminarbewertung.de/bewertungs-details-abfragen")
            .header("Accept", "*/*")
            .header("X-Requested-With", "XMLHttpRequest")
            .data("rating_id", ratingId)
            .post();

    //we find the comment, and we are done
    //note that this selector is only as a demo, feel free to adjust to your needs
    Elements select2 = document2.select("div.ratingbox div.panel-body.text-center");
    //We are done!
    System.out.println(select2.text());

此代码将打印所需的:

  

Das Eingehen aufindividuelleBedürfnisseinesjeden einzelnen Teilnehmer scheint mir ein Markenzeichen von Fromm zu sein。 Beieinemfrüheren研讨会habe ich死了auch schon所以erlebt!

我希望它会有所帮助。

祝新年快乐!