首页 > 其他分享 >WebMagic抓取 table分页数据, table分页时,URL不变

WebMagic抓取 table分页数据, table分页时,URL不变

时间:2024-11-07 18:19:12浏览次数:1  
标签:分页 URL driver org selenium import table page webmagic

动态页面爬虫前的准备:https://www.cnblogs.com/maohuidong/p/18517953

一:java添加maven依赖:
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.7.4</version>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.7.4</version>
</dependency>
<!--selenium依赖-->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>

二:重写PageProcessor:

import java.util.List;
import java.util.Set;

import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.RemoteWebDriver;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.JsonFilePipeline;
import us.codecraft.webmagic.processor.PageProcessor;

/**
* 准备抓取这个页面:http://yapi.rongyi.so/project/317/interface/api
* 但是这个页面需要登录后才能访问,登录页面为:http://yapi.rongyi.so/login
* 登录后抓取的页面有 分页, 分页的特点是地址不变,所以从第二页开始,无法通过webMagic抓取第二页的内容
* 只能通过Selenium来点击下一页的操作,然后再解析页面。
*/
public class YapiPageProcessor implements PageProcessor {

private Site site = Site.me().setRetryTimes(3).setSleepTime(0).setTimeOut(3000);

//用来存储cookie信息
private Set<Cookie> cookies;

private RemoteWebDriver driver;

public YapiPageProcessor(){
System.setProperty("webdriver.chrome.driver","E:\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe");

//创建浏览器参数对象
ChromeOptions chromeOptions = new ChromeOptions();
// 设置为 无界面浏览器 模式,若是不想看到浏览器打开,就可以配置此项

//解决 403 出错问题
chromeOptions.addArguments("--remote-allow-origins=*");
// chromeOptions.addArguments("--headless");
chromeOptions.addArguments("--window-size=1440,1080");// 设置浏览器窗口打开大小

RemoteWebDriver driver = new ChromeDriver(chromeOptions);
this.driver = driver;
}


@Override
public void process(Page page) {
// 取所有的key 和对应的所有的value
List<String> keys = page.getHtml().xpath("//tbody[@class='ant-table-tbody']/tr/td/a/span/text()").all();
List<String> values = page.getHtml().xpath("//tbody[@class='ant-table-tbody']/tr/td/div/span[3]/text()").all();
//获取用户的id
for (int i = 0;i < keys.size();i++) {
page.putField(keys.get(i),values.get(i));
}

while (driver.findElements(By.xpath("//li[@title='下一页' and @aria-disabled='false']")).size() > 0){
// 点击下一页
driver.findElement(By.xpath("//li[@title='下一页' and @aria-disabled='false']")).click();

// 等待2S
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}

List<WebElement> elements = driver.findElements(By.xpath("//tbody[@class='ant-table-tbody']/tr"));
for (int ii = 1;ii <= elements.size();ii++) {
WebElement key = driver.findElement(By.xpath("//tbody[@class='ant-table-tbody']/tr[" + ii + "]/td/a/span"));
WebElement value = driver.findElement(By.xpath("//tbody[@class='ant-table-tbody']/tr[" + ii + "]/td/div/span[3]"));
page.putField(key.getText(),value.getText());
}
}
}

//使用 selenium 来模拟用户的登录获取cookie信息
public void login(String loginUrl,String userName,String password)
{
driver.get(loginUrl);

driver.findElement(By.id("email")).clear();

//在******中填你的用户名
driver.findElement(By.id("email")).sendKeys(userName);

driver.findElement(By.id("password")).clear();
//在*******填你密码
driver.findElement(By.id("password")).sendKeys(password);

//模拟点击登录按钮
driver.findElement(By.xpath("//button[@type='submit']")).click();

//获取cookie信息
cookies = driver.manage().getCookies();
// driver.close();
}


@Override
public Site getSite() {

//将获取到的cookie信息添加到webmagic中
for (Cookie cookie : cookies) {
site.addCookie(cookie.getName().toString(),cookie.getValue().toString());
}

return site.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1");
}

public static void main(String[] args){

YapiPageProcessor pageProcessor = new YapiPageProcessor();

//调用selenium,进行模拟登录
pageProcessor.login("http://yapi.rongyi.so/login","xxx","xxx");
Spider.create(pageProcessor)
.addUrl("http://yapi.rongyi.so/project/317/interface/api")
.setDownloader(new MyDownloader(pageProcessor.driver))//可选择使用自定义的
// 输出到D盘webmagic文件夹
.addPipeline(new JsonFilePipeline("D:\\webmagic1\\"))
//开启1个线程抓取
.thread(1)
//启动爬虫
.run();
System.out.println("爬取结束");
}
}

三:重写Downloader:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.RemoteWebDriver;
import us.codecraft.webmagic.downloader.Downloader;
import us.codecraft.webmagic.*;
import us.codecraft.webmagic.selector.PlainText;
import org.openqa.selenium.Cookie;
import java.util.Map;
public class MyDownloader implements Downloader {
//声明驱动
private RemoteWebDriver driver;

public MyDownloader(RemoteWebDriver driver) {
this.driver = driver;
}

/**
* 由于selenium的默认域名为data;因此第一次必须跳转到登录页,才能加入对应域名
* @param request Request
*/
@Override
public Page download(Request request, Task task) {
try {
driver.get(request.getUrl());//第一次打开url,跳转到登录页
Thread.sleep(3000);//等待打开浏览器
//获取从process返回的site携带的cookies,填充后第二次打开url
Site site = task.getSite();
if (site.getCookies() != null) {
for (Map.Entry<String, String> cookieEntry : site.getCookies()
.entrySet()) {
Cookie cookie = new Cookie(cookieEntry.getKey(),
cookieEntry.getValue());
driver.manage().addCookie(cookie);
}
//添加对应domain的cookie后,第二次打开url
driver.get(request.getUrl());
}
Thread.sleep(2000);
driver.executeScript("window.scrollTo(0, document.body.scrollHeight - 1000)");//需要滚动到页面的底部,获取完整的数据
Thread.sleep(2000);//等待滚动完成
//获取页面,打包成Page对象,传给PageProcessor 实现类
Page page = createPage(request.getUrl(), driver.getPageSource());
//driver.close();//看需要是否关闭浏览器
return page;
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}

@Override
public void setThread(int threadNum) {

}

//构建page返回对象
private Page createPage(String url, String content) {
Page page = new Page();
page.setRawText(content);
page.setUrl(new PlainText(url));
page.setRequest(new Request(url));
page.setDownloadSuccess(true);
return page;
}

标签:分页,URL,driver,org,selenium,import,table,page,webmagic
From: https://www.cnblogs.com/maohuidong/p/18533746

相关文章

  • 欢迎 Stable Diffusion 3.5 Large 加入 Diffusers
    作为StableDiffusion3的改进版本,StableDiffusion3.5如今已在HuggingFaceHub中可用,并可以直接使用......
  • 不要再使用 READ TABLE 了,教你如何使用新语法读取内表
    在本文章中,您将了解ABAP7.40版中引入的新读取语法。该语法早在2013年就已引入,因此已不再新鲜。但是,如果您仍在使用READTABLE关键字来读取表项,那么这篇文章绝对适合您。请看下面的示例。请注意,下面的代码是在读取语句之前编写的。DATA:it_flightsTYPESTANDARD......
  • stable diffusion图生图
    本节内容,给大家带来的是stablediffusion的图生图课程,我们在midjourney的课程中有学习过midjourney的图生图功能,即使用垫图的方式来引导AI绘制图片。图生图是AI绘图程序一个非常重要的功能,stablediffusion同样提供了类似的功能,而且stablediffusion图生图功能所提供的选项......
  • stable diffusion 大模型
    本节内容,给大家带来的是stablediffusion的基础模型课程。基础模型,我们有时候也称之为大模型。在之前的课程中,我们已经多次探讨过大模型,并且也见识过一些大模型绘制图片的独特风格,相信大家对stablediffusion大模型已经有了一定的了解。使用不同的大模型,绘制的图片风格,内容,精细......
  • Stable Diffusion LoRA, LyCoris
    本节内容,给大家带来的是stablediffusion的LoRA与LyCoris模型课程。我们在上节课程中,已经详细讲解了关于大模型的使用。在stablediffusion中打造一个大模型,需要基于大量特定特征的图像集进行训练,我们通常将这个过程称之为Dreambooth训练,这个过程比较耗时,同时对计算资源的要求......
  • 【comfyui教程】ComfyUI 现已支持 Stable Diffusion 3.5 Medium!人人都能轻松上手的图
    前言ComfyUI现已支持StableDiffusion3.5Medium!人人都能轻松上手的图像生成利器大家翘首以盼的StableDiffusion3.5Medium模型终于来了!就在今天,StabilityAI正式推出了这款“亲民版”平衡模型,让创作者们得以在消费级GPU上体验到AI图像生成的最新黑科技。本文将带......
  • 21天全面掌握:小白如何高效学习AI绘画SD和MJ,StableDiffusion零基础入门到精通教程!快速
    今天给大家分享一些我长期以来总结的AI绘画教程和各种AI绘画工具、模型插件,还包含有视频教程AI工具,免费送......
  • bp抓包与url栏所对应的文件问题处理
    如题:题目告诉我们是文件绕过问题打开web环境,题目是百度的界面,一开始我以为是我卡了。本题解题方法很多,只在这里展示一种看到url栏,发现直接就是一个子文件。但是删掉后缀发现网页打不开,选择用burpsuite进行抓包。打开内嵌浏览器,打开拦截,拦截后发送到repeater。在repeater中发......
  • IOS获取“酷狗概念版”app的URL scheme
    1,在苹果应用商店安装debuganywhere2,打开“酷狗概念版”app3,随便点一首歌,点击分享按钮 4,点击复制链接 5,打开安装好的debuganywhere,将复制的链接粘贴到输入框,点击debug 6,点击齿轮按钮 7,切换到Source栏,就可以找到相关URLscheme 8,复制scheme|URLIOS的值,打开快捷......
  • 【Tableau2023软件下载与安装教程】
    Tableau2023‌是一款强大的数据可视化和数据分析软件,广泛应用于商业智能领域。它通过提供直观的界面和丰富的数据分析功能,使用户能够轻松地从复杂的数据中提取见解和策略,从而加速数据分析和报告生成的过程‌。1、安装包  Tableau2023:链接:https://pan.quark.cn/s/195fd628......