使用Java,Jsoup和Selenium Web驱动程序通过范围取消分页

时间:2019-02-09 17:58:22

标签: java selenium-webdriver web-scraping jsoup

我的代码执行了,但是复制了我要抓取的数据。在传递循环获取并连接到URL的方式时,我可能对其中一个for循环放置有误,感觉可能有更好的方法来处理此问题,从而在下面获得我的预期结果。 / p>

我使用Selenium处理连接的原因是由于出于某种原因使用JSoups连接发生超时。

我找到了这个堆栈,但这是基于JSoup连接-Pagination with Web Driver Selenium and 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等顺序收集,直到结束页不计其数。数据不应该像上面编写的代码那样针对我的场景进行复制。我觉得这可以用一种更加优雅的方式编写,并且很想看看我的代码中有什么想法以及我应该如何实现。谢谢!

0 个答案:

没有答案