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

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



在上一篇说WebMagic框架的时候(

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

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

资源

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

java 爬取地址 java爬取动态网页_java

根据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也说了,后者下载的更加稳定。

java 爬取地址 java爬取动态网页_java 爬取地址_02


注意:下载完的驱动会有一个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();
    }
}

测试效果

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

java 爬取地址 java爬取动态网页_java_03