Очистка страниц с диапазонами с использованием Java, Jsoup и Selenium Web Driver - PullRequest
0 голосов
/ 09 февраля 2019

Мой код выполняется, но дублирует данные, которые я собираю.Возможно, я сделал что-то не так с одним из мест размещения цикла for, когда я передаю URL-адрес для получения и подключения в цикле и чувствую, что может быть лучший способ справиться с этим, чтобы получить ожидаемый результат ниже.

Причина, по которой я использую Selenium для обработки соединения, заключается в том, что по какой-то причине тайм-ауты имели место при использовании соединения JSoups.

Я нашел этот стек, но он был основан на соединении JSoup - Разбивка на страницы с помощью веб-драйвера Selenium и JSoup

Проблема в том, что полный список URL-адресов загружается не сразу.Вы должны продолжать нажимать на следующую страницу, и она будет продолжать загружаться.Это диапазон страниц.Вот изображение того, о чем я говорю, вместе со структурой HTML и ссылкой на снимок экрана с нумерацией страниц.

https://imgur.com/5WpsPHf

Вот фрагмент кода HTMLструктура

https://pastebin.com/MLDEAnZu

Я пытался сделать это с помощью Selenium Web Driver и Jsoup для анализа HTML.Пожалуйста, обратитесь к моему коду ниже, чтобы узнать, как я перебираю данные и пытаюсь проанализировать новые страницы.

package com.jz.prodscraper;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

public class MyScraper {



public static void main(String[] args) {

    ChromeOptions options = new ChromeOptions();
    options.addArguments("--headless");
    WebDriver webDriver = new ChromeDriver(options);
    webDriver.get("myurl");
    String pageSource = webDriver.getPageSource();


    Document doc = Jsoup.parse(pageSource);
    Elements pageCount = doc.body().getElementsByClass("page-number");

    //System.out.println("DOCUMENT  " + doc.body());


    for (int i = 0; i < pageCount.size(); i++) {

        //Jsoup Parse Starts Now
        //first page
        Elements skuHeader = doc.body().getElementsByClass("sku-header");
        Elements skuModel = doc.body().getElementsByClass("sku-model");

        for (Element e : skuHeader) {

            System.out.println("SKU Header is    " + e.text());
        }

        for (Element e : skuModel) {

            System.out.println("SKU Model is    " + e.text());

        }


        for(Element link : pageCount){

            String dynamicPageSource = webDriver.getPageSource();
            Document dynDoc = Jsoup.parse(dynamicPageSource);

            Elements dynSkuHeader = dynDoc.body().getElementsByClass("sku- 
            header");
            Elements dynskuModel = dynDoc.body().getElementsByClass("sku- 
            model");



            //Dynamic Page Loop

            for(Element e : dynSkuHeader){

                System.out.println("Dynamic Header    " + e.text());


            }

            for(Element e : dynskuModel){

                System.out.println("Dynamic Sku Model    " + e.text());


            }


            String url = link.absUrl("href");


            webDriver.get(url);

        }

    }

    webDriver.quit();

  }
}

Результаты, которые я ищу, выглядят следующим образом.Собирайте заголовок, модель и sku с каждой страницы в нумерации страниц в порядке 1,2,3,4 и т. Д. Вплоть до конечной страницы, независимо от того, сколько там страниц.Данные не должны дублироваться, как в случае моего сценария с кодом, который я написал выше.Я чувствую, что это можно написать гораздо более элегантно, и мне очень хотелось бы посмотреть, какие мысли есть в моем коде и как мне к этому подойти.Спасибо!

...