Утилизация полного динамического HTML-контента с использованием Java JSoup и Selenium - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь очистить этот веб-сайт

https://www.dailystrength.org/search?query=aspirin&type=discussion

, чтобы получить набор данных для моего проекта (используя аспирин в качестве элемента поиска заполнителя).

Я решил использовать Jsoup, чтобы сделать гусеничный ход.Но проблема в том, что сообщения динамически доставляются с помощью Ajax-запроса.Запрос выполняется с помощью кнопки Показать больше

Эта кнопка вызывает проблемы

Когда отображается весь контент, он должен выглядеть так с текстом «Все сообщения загружены»

конечный результат

import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.*;

/**
 *
 * @author Ahmed
 */
public class Crawler {

    public static void main(String args[]) {
        Document search_result;
        String requested[] = new String[]{"aspirin"/*, "Fentanyl"*/};
        ArrayList<Newsfeed_item> threads =  new ArrayList();

        String query = "https://www.dailystrength.org/search?query=";

        try {
            for (int i = 0; i < requested.length; i++) {
                search_result = Jsoup.connect(query+requested[i]+"&type=discussion").get();

                Elements posts = search_result.getElementsByClass("newsfeed__item");
                for (Element item : posts) {

                    Elements link=item.getElementsByClass("newsfeed__btn-container posts__discuss-btn");

                    Newsfeed_item currentItem=new Newsfeed_item();
                    currentItem.replysLink=link.attr("abs:href");
                    Document reply_result=Jsoup.connect(currentItem.replysLink).get();
                    Elements description = reply_result.getElementsByClass("posts__content");

                    currentItem.description=description.text();
                    currentItem.subject=requested[i];
                    System.out.println(currentItem);

                }
            }
        } catch (IOException ex) {
            Logger.getLogger(Crawler.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

Этот код дает мне только несколько отображаемых сообщений, а не скрытые.Я понял, что JSoup не может быть использован для этой проблемы, поэтому я попытался найти источники для селена, чтобы показать полный контент и загрузить его для сканирования.

Я не могу найти источники, и единственный найденный кодпопробовать для начального понимания от

https://www.youtube.com/watch?v=g1IbI_qYsDg

Дает мне эту ошибку

Exception in thread "main" java.lang.IllegalStateException: The path to the driver executable must be set by the webdriver.gecko.driver system property; for more information, see https://github.com/mozilla/geckodriver. The latest version can be downloaded from https://github.com/mozilla/geckodriver/releases
    at com.google.common.base.Preconditions.checkState(Preconditions.java:847)
    at org.openqa.selenium.remote.service.DriverService.findExecutable(DriverService.java:134)
    at org.openqa.selenium.firefox.GeckoDriverService.access$100(GeckoDriverService.java:44)
    at org.openqa.selenium.firefox.GeckoDriverService$Builder.findDefaultExecutable(GeckoDriverService.java:167)
    at org.openqa.selenium.remote.service.DriverService$Builder.build(DriverService.java:355)
    at org.openqa.selenium.firefox.FirefoxDriver.toExecutor(FirefoxDriver.java:190)
    at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:147)
    at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:125)
    at SeleniumTest.main(SeleniumTest.java:14)
C:\Users\Ahmed\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)

Любая помощь или пример кода или альтернативы?Мне просто нужно получить полную страницу, и я использую свой сканер.Или создайте новый сканер, но я не могу найти код и сталкиваюсь с ошибками.

1 Ответ

0 голосов
/ 02 февраля 2019

Я постараюсь продолжить приближение без селена.С помощью отладчика вашего веб-браузера и его вкладки «Сеть» вы можете просмотреть все запросы, отправленные вашим браузером.

enter image description here

Полезно посмотреть, что происходит, когдаВы нажимаете «показать больше».Вы можете видеть, что с этого URL загружается следующая страница: https://www.dailystrength.org/search/ajax?query=aspirin&type=discussion&page=2&_=1549130275261 И вы можете получить больше страниц, изменив параметр page=2.К сожалению, в результате получается JSON, содержащий экранированный HTML, поэтому вам придется использовать некоторую библиотеку JSON для его анализа, получения HTML и последующего анализа с помощью Jsoup.Это было бы неплохо, поскольку этот JSON включает также переменную "has_more":true, чтобы вы знали, есть ли еще контент.

...