java爬虫抓取动态网页(网络爬虫的基本介绍和使用方法介绍-苏州安嘉 )
优采云 发布时间: 2022-04-16 00:16java爬虫抓取动态网页(网络爬虫的基本介绍和使用方法介绍-苏州安嘉
)
一、网络爬虫基本介绍1.什么是网络爬虫
网络爬虫(也称为网络蜘蛛、网络机器人,在社区中,更常称为网页追逐者)是一种程序或脚本,它根据一定的规则自动从万维网上爬取信息。其他不太常用的名称是 ant、autoindex、emulator 或 worm。
2. 常见问题
爬虫可以爬取ajax信息吗?
网页上有一些异步加载的数据。爬取数据有两种方式:使用模拟浏览器,或者分析ajax的http请求,自己生成ajax请求的url,获取返回的数据。如果你自己生成ajax请求,那么使用开源爬虫有什么意义呢?其实就是利用开源爬虫的线程池和URL管理功能(比如断点爬取)。
如果我已经可以生成我需要的ajax请求(列表),我该如何使用这些爬虫来爬取这些请求呢?
爬虫往往被设计成广度遍历或深度遍历的方式来遍历静态或动态页面。爬取ajax信息属于深网(deep web)的范畴,虽然大部分爬虫并不直接支持。但它也可以通过某些方式完成。例如,WebCollector 使用广度遍历来遍历 网站。爬虫的第一轮爬取就是爬取*敏*感*词*集(seeds)中的所有url。简单来说就是将生成的ajax请求作为*敏*感*词*,放入爬虫中。使用爬虫对这些*敏*感*词*进行深度为 1 的广度遍历(默认为广度遍历)。
爬虫是否支持多线程,爬虫是否可以使用代理,爬虫是否可以爬取重复数据,爬虫是否可以爬取JS生成的信息?
js生成的信息能否被爬取与爬虫本身关系不大。爬虫主要负责遍历网站和下载页面。爬取js产生的信息与网页信息提取模块有关,往往需要通过模拟浏览器(htmlunit、selenium)来完成。这些模拟浏览器通常需要花费大量时间来处理一个页面。因此,一种策略是利用这些爬虫遍历网站,当遇到需要解析的页面时,将网页的相关信息提交给模拟浏览器,完成对JS生成信息的提取。
爬虫是如何保存网页信息的?
有一些爬虫带有一个负责持久性的模块。例如,webmagic 有一个名为 pipeline 的模块。通过简单的配置,爬虫提取的信息可以持久化到文件、数据库等。还有一些爬虫不直接为用户提供数据持久化模块。比如 crawler4j 和 webcollector。让用户在网页处理模块中添加提交数据库的操作。至于用管道模块好不好,就类似于用ORM操作数据库好不好的问题,看你的业务。
爬虫如何爬取待登录的网站?
这些开源爬虫都支持在爬取时指定cookies,而模拟登录主要依赖cookies。至于如何获取cookies,就不是爬虫管理的问题了。您可以手动获取cookies,使用http请求模拟登录,或者使用模拟浏览器自动登录。
爬虫如何从网页中提取信息?
开源爬虫一般会集成网页提取工具。主要支持两种规范:CSS SELECTOR 和 XPATH。至于哪个更好,我这里就不评论了。
明明代码写对了,但是数据爬不进去。爬虫有问题吗?另一个爬虫可以解决吗?
如果代码写得正确,无法爬取数据,其他爬虫也将无法爬取。在这种情况下,要么是 网站 阻止了您,要么您抓取的数据是由 javascript 生成的。如果无法爬取数据,则无法通过更改爬虫来解决。
履带速度如何?
单机开源爬虫的速度基本可以用到本地网速的极限。爬虫速度慢往往是因为用户减少了线程数,网速慢,或者数据持久化时与数据库的交互慢。而这些东西往往是由用户的机器和二次开发的代码决定的。
爬虫被网站拦截了怎么办?
爬虫被网站阻塞,可以通过使用多个代理(随机代理)来解决。但是这些开源爬虫一般不直接支持随机代理IP的切换。
二、java常用爬虫框架介绍1.Apache Nutch
(1)分布式支持:是
(2)扩展性:中等。Apache Nutch 不是一个高度可扩展的爬虫,它是专门为搜索引擎定制的网络爬虫。Apache Nutch 虽然有强大的插件机制,但它是自定义插件无法修改爬虫的遍历算法、去重算法和爬取过程。
(3)适用性:Apache Nutch是为搜索引擎定制的爬虫,有一套适合搜索引擎的URL维护机制(包括URL去重、网页更新等),但该机制不适用于当前大部分是精细化提取业务(即结构化数据采集)。
(4)易上手:难。用户需要熟悉网络爬虫原理、hadoop开发基础和linux shell,需要熟悉Apache Ant
2. 网络采集器
(1)可扩展性:强
(2)适用性:WebCollector适用于精准提取业务。
(3)容易上手:容易
3. 网络魔术
(1)分布式支持:否
(2)可扩展性:强
(3)适用性:WebMagic适用于精准提取业务。
(4)容易上手:容易。
4. 爬虫4j
(1) 分布式支持:否
(2)可扩展性:低。Crawler4j其实是一个*敏*感*词*的垂直爬虫,它的遍历算法是泛爬的算法。虽然可以加一些限制,但还是不能满足目前的大部分需求提取业务 另外Crawler4j没有提供自定义http请求的接口,所以Crawler4j不适合爬取需要自定义http请求的服务(如模拟登录、多代理切换)。
(3)容易上手:容易
三、WebCollector实战1.WebCollector与传统网络爬虫的区别
传统的网络爬虫倾向于下载整个站点,目的是将网站内容原封不动地下载到本地,最小的数据单位是单个网页或文件。而WebCollector可以通过设置爬取策略采集进行定向,可以提取网页中的结构化信息。
2. WebCollector 与 HttpClient 和 Jsoup 的区别
WebCollector是爬虫框架,HttpClient是Http请求组件,Jsoup是网页解析器(内置Http请求功能)。
一些程序员通过单线程中的迭代或递归方法调用 HttpClient 和 Jsoup 获取数据 采集。虽然这样也能完成任务,但存在两大问题:
(1)单线程速度慢,多线程爬虫比单线程爬虫快很多。
(2)需要自己编写任务维护机制,该机制包括URL去重、断点爬取(即异常中断处理)等功能。
WebCollector 框架带有多线程和 URL 维护。用户在编写爬虫时不需要考虑线程池、URL去重和断点爬取。
3. WebCollector 可以处理的量级
WebCollector目前有*敏*感*词*和Hadoop版(WebCollector-Hadoop)。*敏*感*词*可以处理上千万的URL,对于大部分精细的数据采集任务来说已经足够了。WebCollector-Hadoop 可以处理的数量级高于独立版本,具体取决于集群的大小。
4. WebCollector 的遍历
WebCollector采用粗略的广度遍历,但这里的遍历与网站的拓扑树结构无关,用户无需关心遍历方式。
网络爬虫在访问页面时会从页面中探索新的 URL 并继续爬取。WebCollector 提供了两种机制来探索新的 URL,自动解析和手动解析。
5. 代码实战
maven 引入依赖
cn.edu.hfut.dmic.webcollector
WebCollector
2.73-alpha
自动解析
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;import cn.edu.hfut.dmic.webcollector.model.Page;import cn.edu.hfut.dmic.webcollector.plugin.berkeley.BreadthCrawler;public class AutoNewsCrawler extends BreadthCrawler { public AutoNewsCrawler(String crawlPath, boolean autoParse) { super(crawlPath, autoParse); this.addSeed("http://news.hfut.edu.cn/list-1-1.html");//*敏*感*词*页面,起始页面
//正则规则设置 寻找符合http://news.hfut.edu.cn/show-xxxxxxhtml的url
this.addRegex("http://news.hfut.edu.cn/show-.*html"); this.addRegex("-.*\\.(jpg|png|gif).*"); //不要爬取包含 #的URL
this.addRegex("-.*#.*");
setThreads(50);//线程数
getConf().setTopN(100);//设置每次迭代中爬取数量的上限
//设置是否为断点爬取,如果设置为false,任务启动前会清空历史数据。
//如果设置为true,会在已有crawlPath(构造函数的第一个参数)的基础上继
//续爬取。对于耗时较长的任务,很可能需要中途中断爬虫,也有可能遇到
//死机、断电等异常情况,使用断点爬取模式,可以保证爬虫不受这些因素
//的影响,爬虫可以在人为中断、死机、断电等情况出现后,继续以前的任务
//进行爬取。断点爬取默认为false*/// setResumable(true);
} /*
visit函数定制访问每个页面时所需进行的操作
*/
@Override
public void visit(Page page, CrawlDatums next) {
String url = page.url(); //如果页面地址如何我们要求
if (page.matchUrl("http://news.hfut.edu.cn/show-.*html")) {
String title = page.select("div[id=Article]>h2").first().text();//获取url标题
String content = page.selectText("div#artibody");
System.out.println("URL:\n" + url);//地址
System.out.println("title:\n" + title);//标题
System.out.println("content:\n" + content);//内容
/*如果你想添加新的爬取任务,可以向next中添加爬取任务,
这就是上文中提到的手动解析*/
/*WebCollector会自动去掉重复的任务(通过任务的key,默认是URL),
因此在编写爬虫时不需要考虑去重问题,加入重复的URL不会导致重复爬取*/
/*如果autoParse是true(构造函数的第二个参数),爬虫会自动抽取网页中符合正则规则的URL,
作为后续任务,当然,爬虫会去掉重复的URL,不会爬取历史中爬取过的URL。
autoParse为true即开启自动解析机制*/
//next.add("http://xxxxxx.com");
}
} public static void main(String[] args) throws Exception {
AutoNewsCrawler crawler = new AutoNewsCrawler("crawl", true);
crawler.start(4);//启动爬虫
}
}
运行访问如下所示:
手动解析
<p>import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;import cn.edu.hfut.dmic.webcollector.model.Page;import cn.edu.hfut.dmic.webcollector.plugin.berkeley.BreadthCrawler;public class ManualNewsCrawler extends BreadthCrawler { public ManualNewsCrawler(String crawlPath, boolean autoParse) { super(crawlPath, autoParse); /*add 10 start pages and set their type to "list"
"list" is not a reserved word, you can use other string instead
*/
for(int i = 1; i