前言
网上一搜 ” java 爬虫框架有哪些”,一般就会出现以下这几款: Apache Nutch 、 WebMagic 、 WebCollector 、 Heritrix3 、 Selenium
这些框架有哪些优缺点?
– Nutch
支持分布式抓取,并有 Hadoop 支持,可以进行多机分布抓取,存储和索引。另外很吸引人的一点在于,它提供了一种插件框架,使得其对各种网页内容的解析、各种数据的采集、查询、集群、过滤等功能能够方便的进行扩展,正是由于有此框架,使得 Nutch 的插件开发非常容易,第三方的插件也层出不穷,极大的增强了 Nutch 的功能和声誉。
缺点:定制能力较弱、同时社区活跃度较低,网上的资料大多都是几年前的资料。
– WebMagic
- 简单的API,可快速上手
- 模块化的结构,可轻松扩展
- 提供多线程和分布式支持 缺点:现在有部分主流网站通过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
- 简单的API,可快速上手
- 模块化的结构,可轻松扩展
- 提供多线程和分布式支持 缺点:现在有部分主流网站通过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.注意指定浏览器驱动路径时是指定下载的驱动路径,而不是启动文件路径