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

news/2024/10/31 9:28:00/

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 驱动。
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.ppmy.cn/news/78410.html

相关文章

HackTheBox-关卡Fawn

1. 连接靶场&#xff0c;打开FAWN实例场景&#xff0c;检查是否互通 TASK1 3 个字母的首字母缩写词 FTP 代表什么&#xff1f; 答案是&#xff1a;File Transfer Protocol TASK2 问题是&#xff1a;FTP服务通常监听哪个端口&#xff1f; FTP监听的TCP端口号为21,监听的数据端…

为什么我在领英上搜到的客户都是显示领英会员(Linkedin Member)?

LinkedIn领英上找客户&#xff0c;开发客户已经越来越成为主流&#xff0c;但是很多刚注册使用LinkedIn领英的人会摸不着头脑&#xff0c;束手无策。 因为他会发现自己搜索出来的结果&#xff0c;找出来的客户都是显示领英会员&#xff08;Linkedin Member&#xff09;&#x…

Spring Security入门

1. Spring Security 简介 Spring Security 是一个高度可定制的身份验证和访问控制框架&#xff0c;它基于 Spring 框架&#xff0c;并可与 Spring 全家桶无缝集成。该框架可以精确控制用户对应用程序的访问&#xff0c;控制用户的角色和权限等。 Spring Security 最早是由 Be…

锁 笔记

锁分类LockAQS同步器 锁分类 公平锁&#xff1a;按申请顺序获得锁。FIFO 非公平锁&#xff1a;不按申请顺序获得锁。优先级反转&#xff0c;饥饿现象&#xff0c;吞吐量大 一个线程请求锁时&#xff0c;只要获取同步状态则成功获取锁&#xff0c;在该前提下&#xff0c;刚释放…

Vicuna:斯坦福开源一个性能相当于90%ChatGPT的聊天机器人

自从Meta公司发布LLaMA以来&#xff0c;围绕它微调和开发的模型越来越多&#xff0c;这得益于它的性能和效果&#xff0c;2023年3月份发布的草泥马&#xff08;Alpaca&#xff09;是由Meta的LLaMA 7B微调而来的全新模型&#xff0c;仅用了52k数据&#xff0c;性能约等于GPT-3.5…

【HarmonyOS】元服务混淆打包以及反混淆mapping文件生成

大家所知的Android中的“混淆”可以分为两部分&#xff0c;一部分是 Java 代码的优化与混淆&#xff0c;依靠 proguard 混淆器来实现&#xff1b;另一部分是资源压缩&#xff0c;从而可以减少包体积。 一般应用release发布的时候都会选择开启混淆&#xff0c;防止应用被反编译…

Apache Kafka教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Apache Kafka由Scala写成。Kafka最初是由LinkedIn开发&#xff0c;并于2011年初开源。2012年10月从Apache Incubator毕业。该项目的目标是为处理实时数据提供一个统一、高通量、低等待的平台。 Kafka是一个分布式的、分区的、多复本的日志提交服务。它通过一种独一无…

docker创建emqx容器,emqx版本4.4.9

题记&#xff1a;网上找了很多文章&#xff0c;都没能怎么说明白如何对mqtt连接通信做认证&#xff0c;也就是tcp方式的时候&#xff0c;携带user、password&#xff0c;很苦恼&#xff0c;最后找了一大圈&#xff0c;说emqx的4.4.9版本的Dashboard有插件&#xff0c;果然顺藤摸…