【Java-Crawler】爬取动态页面(WebMagic、Selenium、ChromeDriver)

news/2024/7/19 12:20:31 标签: 爬虫, java, selenium

WebMagic+Selenium+ChromeDriver+Maven 爬取动态页面

  • 一、需要下载的资源和引入的依赖
    • 资源
    • 依赖
  • 二、实战代码
    • 测试效果

在上一篇说WebMagic框架的时候( 一文学会WebMagic爬虫框架),提到了WebMagic仅能解析静态页面,满足不了小编的爬虫需求了,小编现在要爬取动态的页面,需要爬取JavaScript被解析后的页面了。

一、需要下载的资源和引入的依赖

资源

“多的不说,少的不辣”,先直接给出本篇博客需要的资源和依赖。

在这里插入图片描述根据GPT的答案所述:114.0.5735.16 对应的Google浏览器版本应该是 94.0.4606.61,所以咱下载的Google浏览器版本得是 94.0.4606.61 版本的。下面是其下载网盘链接。

链接:https://pan.baidu.com/s/1eMnn-phueE5yZgCdoEQOwA?pwd=tk0w
提取码:tk0w

下载驱动有两种方式,一种是去ChromeDriver官网,一种是去ChromeDriver官方下载地址,咱选择后者,因为后者不需要考虑版本对应问题,ChromeDriver对应什么版本Google对应就是什么版本,而且上面人GPT也说了,后者下载的更加稳定。

在这里插入图片描述
注意:下载完的驱动会有一个chromedriver.exe,然后需要把它放到C:\Windows\System32目录下,以便运行代码的时候可以找到。当然这种比较局限,一般System.setProperty("webdriver.chrome.driver", chromedriver.exe的路径);来指定。当然前者在本机上方便点。

依赖

首先这里是拿Maven去创建模块去测试的,下面给出需要的依赖。

首先既然需要使用 WebMagic 框架,那就要添加其相关依赖(一个是核心依赖、一个是拓展依赖,他们内部还使用了一个工具包commons-lang,咱得加进去)。

        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-extension</artifactId>
            <version>0.5.3</version>
        </dependency>

        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-core</artifactId>
            <version>0.5.3</version>
        </dependency>
        <!--工具包(StringUtils)-->
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>

然后为了获取动态页面代码,咱得使用 Selenium 测试,还需要远程调试 Google Chrome 浏览器,为了允许开发者通过HTTP协议与Chrome浏览器通信,所以需要远程调试协议:Chrome DevTools协议,而selenium-devtools-v86依赖则提供了该协议的集成。所以需添加以下依赖(selenium-devtools-v86是selenium-java的一个依赖项,版本号要一致,不然没作用):

        <!--非常重要-->->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-devtools-v86</artifactId>
            <version>4.0.0-beta-2</version>
        </dependency>

        <!--版本和devtools一致-->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.0.0-beta-2</version>
        </dependency>

最后咱需要一个强大的Java工具库,guava(噶哇)。

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>31.1-jre</version>
        </dependency>

至此需要的资源和依赖就欧了,接下来就是实战了。

二、实战代码

  1. Spider(蜘蛛)容器配置、管理、开启;
  2. 创建 ChromeDriver 驱动对象,可根据需要向上转型为 WebDriverJavascriptExecutor
  3. 模拟打开对应网页,可通过 page.getUrl.toString() 获取 url字符串;
  4. 然后通过 ChromeDriver 对象去获取对应的 WebElement 对象;
  5. 然后通过webElement.getAttribute("outerHTML")获得原始html字符串,构造 Html 对象,剩下的就是 WebMagic 框架一样的操作了。

    关闭、退出 ChromeDriver 驱动。
java">public class CompanyProcessor implements PageProcessor {


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

    public void process(Page page) {

        // 创建ChromeDriver实例对象
        ChromeDriver driver = new ChromeDriver();
        // 去模拟浏览器输入url后敲回车
        driver.get(page.getUrl().toString());
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 获取body下的标签内容
        WebElement webElement = driver.findElement(By.tagName("body"));
        // 模拟点击事件,因为有的时候不通过一些外设操作有些html代码是不会出现的,就爬不了了
        WebElement element = webElement.findElement(By.cssSelector("span[event-type='15']"));
        element.click();
		
		// 不知道是不是多线程run的原因,这里点击完要等一会儿,不然后面获取点击后的代码没有		
		try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
			
        // 获取其body下的原始html字符串,只含指定webElement下的内容
        String str = webElement.getAttribute("outerHTML");
        
        // 将上面得出来的字符串转换成Html对象
        // 其构造生成的是通过 Jsoup 解析对Html对象内部属性document进行初始化的
        Html html = new Html(str);
        System.out.println(html.xpath("//tbody/tr").all());
        // 关闭驱动,退出驱动
        driver.close();
        driver.quit();

    }

    public Site getSite() {
        return site;
    }

    public static void main(String[] args) {
        Spider.create(new CompanyProcessor())
                .addUrl("https://we.51job.com/pc/search?keyword=java&searchType=2&sortType=0&metro=")
                .thread(5)
                .run();
    }
}

测试效果

已经可以获取到职位链接和职位相关信息了。

请添加图片描述


http://www.niftyadmin.cn/n/355188.html

相关文章

昨天面了个腾讯拿 48K 出来的,让我见识到了基础的天花板

今年的春招基本已经进入大规模的开奖季了&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好&a…

12.2C集群清理环境

有套12.2C rac环境一直未使用&#xff0c;因12c已停产&#xff0c;客户要求重新部署成19c集群&#xff0c;正好有个机会做个清理过程 MOS文件&#xff1a; 如何(Deconfigure)解除配置/(Reconfigure)重新配置&#xff08;重建 OCR&#xff09;或卸载 GI (Doc ID 2016852.1) 步…

Build History

ISO 登录https://next.itellyou.cn/Original/ Window 盛千装机助手https://wwza.lanzouo.com/s/SQZJ Ubuntu Windows / Linux —— U盘启动盘制作 - 知乎准备工作&#xff1a;系统镜像&#xff1a; Windows 10 / Windows 11 & Manjaro / Ubuntu &#xff08;自行选择下载…

OA系统开发能结合人工智能打造全新体系吗?

先来说一说OA系统的 项目背景&#xff1a; 某公司是一个拥有500名员工的中等规模企业&#xff0c;其业务范围涵盖销售、生产、研发等领域。随着公司规模的不断扩大&#xff0c;日常办公流程变得越来越复杂&#xff0c;员工之间的协作需求也日益增加。为了提高办公效率&#xff…

CTF密码学总结

0x01 目录 常见编码: ASCII编码Base64/32/16编码shellcode编码Quoted-printable编码XXencode编码UUencode编码URL编码Unicode编码Escape/Unescape编码HTML实体编码敲击码(Tap code)莫尔斯电码(Morse Code)编码的故事 各种文本加密 换位加密: 栅栏密码(Rail-fence Cipher)曲路密…

c# cad二次开发,类库选择集交互

c# cad二次开发&#xff0c;类库选择集交互 using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; using System; using System.C…

GaussDB云数据库SQL应用系列-基础使用

目录 一、前言 二、前提条件 1、连接数据库实例 2、GaussDB实例正常运行 三、操作示例 1、选择实例并进入SQL执行界面 2、创建数据库用户 3、创建数据库 4、创建SCHEMA 5、创建表&#xff08;增删改查&#xff09; 1&#xff09;创建3张表&#xff0c;并初始化一些数…

argparse传参模块调用

要点&#xff1a; 官网链接&#xff1a;argparse — Parser for command-line options, arguments and sub-commands 参考博客&#xff1a;keras框架入门学习&#xff08;一&#xff09;——argparse传参模块调用 嗨课网教程&#xff1a; Python argparse命令行参数解析 需求…