我的代码执行了,但是复制了我要抓取的数据。在传递循环获取并连接到URL的方式时,我可能对其中一个for循环放置有误,感觉可能有更好的方法来处理此问题,从而在下面获得我的预期结果。 / p>
我使用Selenium处理连接的原因是由于出于某种原因使用JSoups连接发生超时。
我找到了这个堆栈,但这是基于JSoup连接-Pagination with Web Driver Selenium and JSoup
问题是完整的URL列表没有一次全部加载。您必须继续单击下一页,它将继续加载。它是一个页面范围。这是我正在谈论的图像以及HTML结构以及指向分页屏幕快照的链接。
这是HTML结构的代码段
我尝试使用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等顺序收集,直到结束页不计其数。数据不应该像上面编写的代码那样针对我的场景进行复制。我觉得这可以用一种更加优雅的方式编写,并且很想看看我的代码中有什么想法以及我应该如何实现。谢谢!