1谈谈网络爬虫

1.1什么是网络爬虫

在大数据时代,信息的采集是一项重要的工作,而互联网中的数据是海量的,如果单纯靠人力进行信息采集,不仅低效繁琐,搜集的成本也会提高。如何自动高效地获取互联网中我们感兴趣的信息并为我们所用是一个重要的问题,而爬虫技术就是为了解决这些问题而生的。

网络爬虫(Web crawler)也叫做网络机器人,可以代替人们自动地在互联网中进行数据信息的采集与整理。它是一种按照一定的规则,自动地抓取万维网信息的程序或者脚

本,可以自动采集所有其能够访问到的页面内容,以获取或更新这些网站的内容和检索方式。

从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新 的URL放入队列,直到满足系统的一定停止条件。

1.2网络爬虫可以做什么

我们初步认识了网络爬虫,网络爬虫具体可以做什么呢?

可以实现搜索引擎

大数据时代,可以让我们获取更多的数据源。

快速填充测试和运营数据

为人工智能提供训练数据集

1.3网络爬虫常用的技术(Java)

1.3.1底层实现 HttpClient + Jsoup

HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。更多信息请关注http://hc.apache.org/

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数 据。

1.3.2开源框架 Webmagic

webmagic是一个开源的Java爬虫框架,目标是简化爬虫的开发流程,让开发者专注于逻辑功能的开发。webmagic的核心非常简单,但是覆盖爬虫的整个流程,也是很好的学习 爬虫开发的材料。

6a4a0b6f6d2bd5c5d7cc09501bfc63ea.png

webmagic的主要特色:

完全模块化的设计,强大的可扩展性。

核心简单但是涵盖爬虫的全部流程,灵活而强大,也是学习爬虫入门的好材料。提供丰富的抽取页面API。

无配置,但是可通过POJO+注解形式实现一个爬虫。支持多线程。

支持分布式。

支持爬取js动态渲染的页面。

无框架依赖,可以灵活的嵌入到项目中去。

2爬虫框架Webmagic

2.1架构解析

WebMagic项目代码分为核心和扩展两部分。核心部分(webmagic-core)是一个精简的、模块化的爬虫实现,而扩展部分则包括一些便利的、实用性的功能。扩展部分(webmagic-extension)提供一些便捷的功能,例如注解模式编写爬虫等。同时内置了一些常用的组件,便于爬虫开发。

WebMagic的设计目标是尽量的模块化,并体现爬虫的功能特点。这部分提供非常简 单、灵活的API,在基本不改变开发模式的情况下,编写一个爬虫。

WebMagic的结构分为Downloader、PageProcessor、Scheduler、Pipeline四大组 件,并由Spider将它们彼此组织起来。这四大组件对应爬虫生命周期中的下载、处理、管 理和持久化等功能。而Spider则将这几个组件组织起来,让它们可以互相交互,流程化的 执行,可以认为Spider是一个大的容器,它也是WebMagic逻辑的核心。

9385e6a3fd44dfd2c7dfa4a4d15bc5dd.png

四大组件

Downloader

Downloader负责从互联网上下载页面,以便后续处理。WebMagic默认使用了ApacheHttpClient作为下载工具。

PageProcessor

PageProcessor负责解析页面,抽取有用信息,以及发现新的链接。WebMagic使用Jsoup

作为HTML解析工具,并基于其开发了解析XPath的工具Xsoup。

在这四个组件中,PageProcessor对于每个站点每个页面都不一样,是需要使用者定制的部分。

Scheduler

Scheduler负责管理待抓取的URL,以及一些去重的工作。WebMagic默认提供了JDK的内存队列来管理URL,并用集合来进行去重。也支持使用Redis进行分布式管理。

Pipeline

Pipeline负责抽取结果的处理,包括计算、持久化到文件、数据库等。WebMagic默认提供了“输出到控制台”和“保存到文件”两种结果处理方案。

2.2PageProcessor

需求:编写爬虫程序,爬取csdn中博客–工人智能的内容

2.2.1爬取页面全部内容

https://blog.csdn.net/nav/ai

(1)创建工程,引入依赖

us.codecraftwebmagic‐core0.7.3us.codecraftwebmagic‐extension0.7.3

(2)编写类实现网页内容的爬取

package cn.itcast.demo;import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider;import us.codecraft.webmagic.processor.PageProcessor;/*** 爬取类*/public class MyProcessor implements PageProcessor {public void process(Page page) {System.out.println(page.getHtml().toString());}public Site getSite() {return Site.me().setSleepTime(100).setRetryTimes(3);}public static void main(String[] args) {Spider.create( new MyProcessor()).addUrl("https://blog.csdn.net").run();}}

Spider是爬虫启动的入口。在启动爬虫之前,我们需要使用一个PageProcessor创建一个Spider对象,然后使用run()进行启动。

9040a7034429edc1c4a3ba299970d6ac.png

同时Spider的其他组件(Downloader、Scheduler、Pipeline)都可以通过set方法来 进行设置。

Page代表了从Downloader下载到的一个页面——可能是HTML,也可能是JSON或者其他文本格式的内容。Page是WebMagic抽取过程的核心对象,它提供一些方法可供抽 取、结果保存等。

Site用于定义站点本身的一些配置信息,例如编码、HTTP头、超时时间、重试策略 等、代理等,都可以通过设置Site对象来进行配置。

ad941c97d209d301906542c2195e7062.png

2.2.2爬取指定内容(XPath)

如果我们想爬取网页中部分的内容,需要指定xpath。

XPath,即为XML路径语言(XMLPathLanguage),它是一种用来确定XML文档中某 部分位置的语言。XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。 语法详见附录A

我们通过指定xpath来抓取网页的部分内容

System.out.println(page.getHtml().xpath("//* [@id="nav"]/div/div/ul/li[5]/a").toString());

以上代码的含义:id为nav的节点下的div节点下的div节点下的ul下的第5个li节点下的a节点看一下输出结果

人工智能

2.2.3添加目标地址

我们可以通过添加目标地址,从种子页面爬取到更多的页面

public void process(Page page) {page.addTargetRequests( page.getHtml().links().all() );//将当前页面里的所有链接都添加到目标页面中System.out.println(page.getHtml().xpath("//* [@id="nav"]/div/div/ul/li[5]/a").toString());}

运行后发现好多地址都出现在控制台

2.2.4目标地址正则匹配

需求:只提取播客的文章详细页内容,并提取标题

package cn.itcast.demo;import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider;import us.codecraft.webmagic.processor.PageProcessor;/*** 爬取类*/public class MyProcessor implements PageProcessor {public void process(Page page) {//page.addTargetRequests( page.getHtml().links().all() );//将当前页面里的所有链接都添加到目标页面中// page.addTargetRequests(page.getHtml().links().regex("https://blog.csdn.net/[a‐z 0‐9‐]+/article/details/[0‐9]{8}").all() );System.out.println(page.getHtml().xpath("//* [@id="mainBox"]/main/div[1]/div[1]/h1/text()").toString());}public Site getSite() {return Site.me().setSleepTime(100).setRetryTimes(3);}public static void main(String[] args) { Spider.create( new MyProcessor()).addUrl("https://blog.csdn.net/nav/ai").run();}}

2.3Pipeline

2.3.1ConsolePipeline 控制台输出

/*** 爬取类*/public class MyProcessor implements PageProcessor {public void process(Page page) {//page.addTargetRequests( page.getHtml().links().all() );//将当前页面里的所有链接都添加到目标页面中// page.addTargetRequests(page.getHtml().links().regex("https://blog.csdn.net/[a‐z 0‐9‐]+/article/details/[0‐9]{8}").all() );//System.out.println(page.getHtml().xpath("//* [@id="mainBox"]/main/div[1]/div[1]/h1/text()").toString());page.putField("title
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐