Мой код выполняется, но дублирует данные, которые я собираю.Возможно, я сделал что-то не так с одним из мест размещения цикла 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 и т. Д. Вплоть до конечной страницы, независимо от того, сколько там страниц.Данные не должны дублироваться, как в случае моего сценария с кодом, который я написал выше.Я чувствую, что это можно написать гораздо более элегантно, и мне очень хотелось бы посмотреть, какие мысли есть в моем коде и как мне к этому подойти.Спасибо!