手把手教你用JAVA爬取百度百科”中秋节“信息

Java
212
0
0
2024-01-21

前言

网上一搜 ” java 爬虫框架有哪些”,一般就会出现以下这几款: Apache Nutch WebMagic WebCollector Heritrix3 Selenium

这些框架有哪些优缺点?

– Nutch

支持分布式抓取,并有 Hadoop 支持,可以进行多机分布抓取,存储和索引。另外很吸引人的一点在于,它提供了一种插件框架,使得其对各种网页内容的解析、各种数据的采集、查询、集群、过滤等功能能够方便的进行扩展,正是由于有此框架,使得 Nutch 的插件开发非常容易,第三方的插件也层出不穷,极大的增强了 Nutch 的功能和声誉。

缺点:定制能力较弱、同时社区活跃度较低,网上的资料大多都是几年前的资料。

– WebMagic

  1. 简单的API,可快速上手
  2. 模块化的结构,可轻松扩展
  3. 提供多线程和分布式支持 缺点:现在有部分主流网站通过js渲染页面,不支持JS页面抓取,只能获取到JS渲染之前的页面。

– WebCollector

1.基于文本密度的网页正文自动抽取

2.支持断点重爬

3.支持代理

缺点:

1.不支持分布式,只能单机

2.无URL优先级调度

3.活跃度不高

– Heritrix3

Heritrix 的爬虫定制参数多

缺点

1.单实例的 爬虫 ,之间不能进行合作。

2.在有限的机器资源的情况下,却要复杂的操作。

3.只有官方支持,仅仅在 Linux 上进行了测试。

4.每个爬虫是单独进行工作的,没有对更新进行修订。

5.在硬件和系统失败时,恢复能力很差。

6.很少的时间用来优化性能。

7.相对于Nutch,Heritrix仅仅只是一个爬虫工具,没有提供搜索引擎。如果要对抓取的站点排序必须要实现类似于Pagerank的复杂算法。

Selenium

  • 框架底层使用 Java Script模拟真实用户对浏览器进行操作。 测试脚本 执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。
  • 使 浏览器兼容性 测试自动化成为可能,尽管在不同的浏览器上依然有细微的差别。
  • 使用简单,可使用Java,Python语言实现爬虫 缺点:速度慢,适合每天爬取数据量要求不高的爬虫工作, 因为selenium框架是必须要打开浏览器,然后模拟点击网页,这个过程和您用手打开浏览器打开网址去访问网站一样的速度。这个速度是比较慢。如果您要采集的数据,每天也就1-2万条那么可以用这个selenium框架。但是是我认为是最靠谱的爬虫框架,对于采集的数据量不大的话非常推荐。

在这之外 okhttp , httpUtil 也能实现基本的爬虫功能。

进入正题

这里就使用我极力推荐的 Selenium 框架。 java环境肯定是需要的,然后这里使用的spring boot + maven 。

大致思路:

访问 百度

查询中秋节

获取中秋节百度百科链接

访问中秋节 百度百科 页面并获取对应信息

在 pom 文件中引入 Selenium 依赖:

 <dependency> 
    <groupId>org.seleniumhq.selenium</groupId> 
    <artifactId>selenium-java</artifactId>
    <version>.4.0</version> 
</dependency>
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>.12.1</version>
</dependency>

Selenium 是模拟真实用户对浏览器进行操作,所以需要安装对于的浏览器并且下载对应的驱动,这里使用最新版本的火狐浏览器

驱动下载:

百度云下载链接:pan.baidu.com/s/1ugNF1l51… 提取码:zqkl

阿里云盘 链接:www.aliyundrive.com/s/JjJZCfwGK…

具体代码实现:

 public  void  askBaidu() throws  Exception {
    DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
    // ssl 证书支持
    desiredCapabilities.setCapability("acceptSslCerts", true);
    //css搜索支持
    desiredCapabilities.setCapability("cssSelectorsEnabled", true);
    //js支持
    desiredCapabilities.setJavascriptEnabled(true);
    // 注意这里指定的路径为下载的火狐驱动路径
    System.setProperty("webdriver.gecko.driver", "D:/java/geckodriver.exe");
    WebDriver driver = new FirefoxDriver();
     String  href = "#34;;
    //、访问目标网站
    driver.get(href);
    //、获取输入框,输入selenium
    driver.findElement(By.id("kw")).sendKeys("中秋节");
    //、获取“百度一下”按钮,进行搜索
    driver.findElement(By.id("su")).click();
    //、获取中秋节百度百科链接
    // 获取页面源码
    String pageSource = driver.getPageSource();
     document  document = Jsoup.parse(pageSource);
    // 拿到对应class下面的内容
    Elements tables = document.getElementsByClass("t c-gap-bottom-small");
    //获取A标签的href 网址  select 获取到当前A标签 attr href 获取到地址
    String zhongQiu = tables.get().select("a").attr("href");
    //、访问获取到的中秋节百度百科链接
    driver.get(zhongQiu);
    //、获取百度百科中秋节基本信息内容
    String zhongQiuStr = driver.getPageSource();
    Document zhongQiuDoc = Jsoup.parse(zhongQiuStr);
    Elements zqInfo = zhongQiuDoc.getElementsByClass("lemma-summary");
    //根据 div 标签来划分
    Elements div = zqInfo.select("div");
    for(int i =; i < div.size(); i++){
        String info = div.get(i).text();
        // 最后得到的中秋节信息
        System.out.println(info);
    }

}

具体流程在代码中写的有注释,其中要注意以下两点

1.由于只是需要访问中秋节百度百科一个页面所以直接取了下标为0的内容,偶尔访问报下标越界重新请求下,原因 是请求的时候页面没有完全加载出来就获取页面 html 代码,解决办法 在获取页面源码的时候 线程 休眠1秒。

2.注意指定浏览器驱动路径时是指定下载的驱动路径,而不是启动文件路径

作者:骑电动车的小黄

链接:

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。前言

网上一搜 “JAVA爬虫框架有哪些”,一般就会出现以下这几款: Apache Nutch WebMagic WebCollector Heritrix3 Selenium

这些框架有哪些优缺点?

– Nutch

支持分布式抓取,并有Hadoop支持,可以进行多机分布抓取,存储和索引。另外很吸引人的一点在于,它提供了一种插件框架,使得其对各种网页内容的解析、各种数据的采集、查询、集群、过滤等功能能够方便的进行扩展,正是由于有此框架,使得 Nutch 的插件开发非常容易,第三方的插件也层出不穷,极大的增强了 Nutch 的功能和声誉。

缺点:定制能力较弱、同时社区活跃度较低,网上的资料大多都是几年前的资料。

– WebMagic

  1. 简单的API,可快速上手
  2. 模块化的结构,可轻松扩展
  3. 提供多线程和分布式支持 缺点:现在有部分主流网站通过js渲染页面,不支持JS页面抓取,只能获取到JS渲染之前的页面。

– WebCollector

1.基于文本密度的网页正文自动抽取

2.支持断点重爬

3.支持代理

缺点:

1.不支持分布式,只能单机

2.无URL优先级调度

3.活跃度不高

– Heritrix3

Heritrix的爬虫定制参数多

缺点

1.单实例的爬虫,之间不能进行合作。

2.在有限的机器资源的情况下,却要复杂的操作。

3.只有官方支持,仅仅在Linux上进行了测试。

4.每个爬虫是单独进行工作的,没有对更新进行修订。

5.在硬件和系统失败时,恢复能力很差。

6.很少的时间用来优化性能。

7.相对于Nutch,Heritrix仅仅只是一个爬虫工具,没有提供搜索引擎。如果要对抓取的站点排序必须要实现类似于Pagerank的复杂算法。

Selenium

  • 框架底层使用JavaScript模拟真实用户对浏览器进行操作。测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。
  • 使浏览器兼容性测试自动化成为可能,尽管在不同的浏览器上依然有细微的差别。
  • 使用简单,可使用Java,Python语言实现爬虫 缺点:速度慢,适合每天爬取数据量要求不高的爬虫工作, 因为selenium框架是必须要打开浏览器,然后模拟点击网页,这个过程和您用手打开浏览器打开网址去访问网站一样的速度。这个速度是比较慢。如果您要采集的数据,每天也就1-2万条那么可以用这个selenium框架。但是是我认为是最靠谱的爬虫框架,对于采集的数据量不大的话非常推荐。

在这之外 okhttp , httpUtil 也能实现基本的爬虫功能。

进入正题

这里就使用我极力推荐的 Selenium 框架。 java环境肯定是需要的,然后这里使用的spring boot + maven。

大致思路:

访问百度

查询中秋节

获取中秋节百度百科链接

访问中秋节百度百科页面并获取对应信息

在 pom 文件中引入 Selenium 依赖:

 <dependency> 
    <groupId>org.seleniumhq.selenium</groupId> 
    <artifactId>selenium-java</artifactId>
    <version>.4.0</version> 
</dependency>
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>.12.1</version>
</dependency>

Selenium 是模拟真实用户对浏览器进行操作,所以需要安装对于的浏览器并且下载对应的驱动,这里使用最新版本的火狐浏览器

驱动下载:

百度云下载链接:pan.baidu.com/s/1ugNF1l51… 提取码:zqkl

阿里云盘链接:www.aliyundrive.com/s/JjJZCfwGK…

具体代码实现:

 public void askBaidu() throws Exception{
    DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
    //ssl证书支持
    desiredCapabilities.setCapability("acceptSslCerts", true);
    //css搜索支持
    desiredCapabilities.setCapability("cssSelectorsEnabled", true);
    //js支持
    desiredCapabilities.setJavascriptEnabled(true);
    // 注意这里指定的路径为下载的火狐驱动路径
    System.setProperty("webdriver.gecko.driver", "D:/java/geckodriver.exe");
    WebDriver driver = new FirefoxDriver();
    String href = "#;;
    //、访问目标网站
    driver.get(href);
    //、获取输入框,输入selenium
    driver.findElement(By.id("kw")).sendKeys("中秋节");
    //、获取“百度一下”按钮,进行搜索
    driver.findElement(By.id("su")).click();
    //、获取中秋节百度百科链接
    // 获取页面源码
    String pageSource = driver.getPageSource();
    Document document = Jsoup.parse(pageSource);
    // 拿到对应class下面的内容
    Elements tables = document.getElementsByClass("t c-gap-bottom-small");
    //获取A标签的href 网址  select 获取到当前A标签 attr href 获取到地址
    String zhongQiu = tables.get().select("a").attr("href");
    //、访问获取到的中秋节百度百科链接
    driver.get(zhongQiu);
    //、获取百度百科中秋节基本信息内容
    String zhongQiuStr = driver.getPageSource();
    Document zhongQiuDoc = Jsoup.parse(zhongQiuStr);
    Elements zqInfo = zhongQiuDoc.getElementsByClass("lemma-summary");
    //根据 div 标签来划分
    Elements div = zqInfo.select("div");
    for(int i =; i < div.size(); i++){
        String info = div.get(i).text();
        // 最后得到的中秋节信息
        System.out.println(info);
    }

}

具体流程在代码中写的有注释,其中要注意以下两点

1.由于只是需要访问中秋节百度百科一个页面所以直接取了下标为0的内容,偶尔访问报下标越界重新请求下,原因 是请求的时候页面没有完全加载出来就获取页面html代码,解决办法 在获取页面源码的时候线程休眠1秒。

2.注意指定浏览器驱动路径时是指定下载的驱动路径,而不是启动文件路径