- 网络爬虫的是做什么的?
- 手动写一个简单的网络爬虫;
-
网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚
本。
-
另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
-
网络爬虫是通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取网页的内容,找到
在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有
的网页都抓取完为止。
-
如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。
-
所以要想抓取网络上的数据,不仅需要爬虫程序还需要一个可以接受”爬虫“发回的数据并进行处理过滤的服务
器,爬虫抓取的数据量越大,对服务器的性能要求则越高。
-
网络爬虫是做什么的? 他的主要工作就是 跟据指定的url地址 去发送请求,获得响应, 然后解析响应 , 一方面从
响应中查找出想要查找的数据,另一方面从响应中解析出新的URL路径,然后继续访问,继续解析;继续查找需要的
数据和继续解析出新的URL路径 .
-
这就是网络爬虫主要干的工作. 下面是流程图:
通过上面的流程图 能大概了解到 网络爬虫 干了哪些活 ,根据这些 也就能设计出一个简单的网络爬虫出来.
一个简单的爬虫 必需的功能:
- 发送请求和获取响应的功能 ;
- 解析响应的功能 ;
- 对 过滤出的数据 进行存储 的功能 ;
- 对解析出来的URL路径 处理的功能 ;
- 爬虫需要关注的三个点:
- 对抓取目标的描述或定义;
- 对网页或数据的分析与过滤;
- 对URL的搜索策略
- 网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:
- 通用网络爬虫(General Purpose Web Crawler)
- 聚焦网络爬虫(Focused Web Crawler)
- 增量式网络爬虫(Incremental Web Crawler)
- 深层网络爬虫(Deep Web Crawler)。
- 实际的网络爬虫系统通常是几种爬虫技术相结合实现的。
-
下面我用我们的官网将跟大家一起来分析下如何实现这样的一个爬虫:
首先观察我们爬虫的起始页面是:
-
分析页面
所有的喜报信息的URL用XPath表达式来表示就是:
相关数据
-
标题:用XPath表达式来表示
-
描述:用XPath表达式来表示
-
图片:用XPath表达式来表示
好了,我们上面已经将在代码中需要获取的关键信息的XPath表达式都找到了,接下来就可以正式写代码来实现了
代码实现部分采用webmagic框架,因为这样比使用基本的的Java网络编程要简单得多 注:关于webmagic框架可以看一下面讲义
Demo.java
- WanhoPageProcessor.java
- WanhoPipeline.java
- ArticleVo.java
在开源社区搜索java爬虫框架 : 共有83种
我们使用的是
-
webmagic的是一个无须配置、便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代码即可实现一
个爬虫
-
webmagic采用完全模块化的设计,功能覆盖整个爬虫的生命周期(链接提取、页面下载、内容抽取、持久
化),支持多线程抓取,分布式抓取,并支持自动重试、自定义UA/cookie等功能
-
webmagic包含强大的页面抽取功能,开发者可以便捷的使用css selector、xpath和正则表达式进行链接和内
容的提取,支持多个选择器链式调用
注:官方中文文档:http://webmagic.io/docs/zh/
6.2.1. jar包下载:
可以使用maven构建依赖,如:
当然,也可以自行下载jar包,其地址是:http://webmagic.io/
6.2.2. 观察目标数据所处的HTML页面位置:
一般来说,如果我们需要抓取的目标数据不是通过ajax异步加载进来的话,那么我们都可以在页面的HTML源代码中的某个位置找到我们所需要的数据
注:如果数据是通过异步加载到页面中,那么一般有以下两种方式来获取数据:
- 观察页面加载完成之前请求的所有URL(F12 –> Network选项),然后找到加载数据的那些json请求,最后直接请求那些URL获取数据即可
- 模拟浏览器请求,等待一定时间之后从完全加载完成的页面中获取数据即可。这类爬虫通常需要内嵌浏览器内核,如:webmagic、phantom.js、HttpUnit等
下面我用我们的官网将跟大家一起来分析下如何实现这样的一个爬虫:
首先观察我们爬虫的起始页面是:
- 分析页面
从上图可以看出,我们是可以直观地从首页的HTML源代码中找到我们所需要的标题、内容、图片链接等信息的。那么接下来我们可以通过哪种方式将这些目标数据提取出来呢?
其实,关于页面元素的抽取webmagic框架主要支持以下三种方式:
- XPath
- 正则表达式
- CSS选择器
当然,选择哪种方式来抽取数据需要根据具体页面具体分析。在这个例子中,很显然使用XPath来抽取数据是最方便的
因此,接下来我就直接给出我们需要抓取的数据的所在XPath路径了:
- 所有的喜报信息的URL用XPath表达式来表示就是:
- 标题:用XPath表达式来表示
- 描述:用XPath表达式来表示
- 图片:用XPath表达式来表示
注:“//”表示从相对路径开始,最前面以“/”开始则表示从页面的跟路经开始;后面的两个/之间的内容表示一个元素,中括号里面的内容则表示该元素的执行属性,如:h1[@class=’entry-title’] 表示:拥有class属性为“entry-title”的h1元素
6.2.3. 页面数据抽取:
使用webmagic抽取页面数据时需要自定义一个类实现PageProcessor接口。
这个实现了PageProcessor接口的类主要功能为以下三步曲:
- 爬虫的配置:抓取页面的相关配置,包括编码、抓取间隔、重试次数等
- 页面元素的抽取:使用正则表达式或者XPath等方式来抽取页面元素
- 新链接的发现:从一个页面发现待爬取的其他目标页面的链接
6.2.4. 爬虫的启动与停止:
Spider是爬虫启动的入口。在启动爬虫之前,我们需要使用一个PageProcessor创建一个Spider对象,然后使用run()进行启动。同时Spider的其他组件(Downloader、Scheduler、Pipeline)都可以通过set方法来进行设置
注:更多详细参数介绍可以参考这里的官方文档:http://webmagic.io/docs/zh/posts/ch4-basic-page-processor/spider-config.html
Demo.java
对于抽取逻辑比较复杂的爬虫我们通常像上面那样实现PageProcessor接口自己来写页面元素的抽取逻辑。但是对于抽取逻辑比较简单的爬虫来说,这时我们可以选择在实体类上添加注解的方式来构建轻量型的爬虫
6.3.1. 实体类的构造:
从上面的代码可以看出,这里除了添加了几个注解之外,这个实体类就是一个普通的POJO,没有依赖其他任何东西。关于上面使用到的几个注解的大概含义是:
- @TargetUrl:我们需要抽取的数据所有的目标页面,其值是一个正则表达式
- @HelpUrl:为了得到目标页面的链接所需要访问的页面
- @ExtractBy:一个用于抽取元素的注解,它描述了一种抽取规则。它表示“使用这个抽取规则,将抽取到的结果保存到这个字段中”。可以使用XPath、CSS选择器、正则表达式和JsonPath等方式来抽取元素
6.3.2. 数据的持久化:
虽然在PageProcessor中我们可以实现数据的持久化(PS:基于注解的爬虫可以实现AfterExtractor 接口达到类似的目的),将爬虫抓取到的数据保存到文件、数据库、缓存等地方。但是很显然PageProcessor或者实体类主要负责的是页面元素的抽取工作,因此更好的处理方式是在另一个地方单独做数据的持久化。这个地方也就是——Pipeline
为了实现数据的持久化,我们通常需要实现Pipeline 或者PageModelPipeline接口。普通爬虫使用前一个接口,基于注解的爬虫则使用后一个接口
6.3.3. 爬虫的启动:
基于注解的爬虫,其启动类就不是Spider了,而是OOSpider类了,当然二者的使用方式类似。示例代码如下:
jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据
Jsoup是Java世界的一款HTML解析工具,它支持用CSS Selector方式选择DOM元素,也可过滤HTML文本,防止XSS×××。
下载Jsouphttp://jsoup.org/download
查看官方提供的手册:http://jsoup.org/cookbook/
Jsoup是Java世界用作html解析和过滤的不二之选。支持将html解析为DOM树、支持CSS Selector形式选择、支持html过滤,本身还附带了一个Http下载器。
Jsoup的代码相当简洁,Jsoup总共53个类,且没有任何第三方包的依赖,对比最终发行包9.8M的SAXON,实在算得上是短小精悍了。
- 从一个URL,文件或字符串中解析HTML;
- 使用DOM或CSS选择器来查找、取出数据;
- 可操作HTML元素、属性、文本;
Jsoup的入口是类。examples包里提供了两个例子,解析html后,分别用CSS Selector以及NodeVisitor来操作Dom元素。
这里用里的例子来说明如何调用Jsoup:
Jsoup使用了自己的一套DOM代码体系,这里的Elements、Element等虽然名字和概念都与Java XML
API类似,但并没有代码层面的关系。就是说你想用XML的一套API来操作Jsoup的结果是办不到的,
但是正因为如此,才使得Jsoup可以抛弃xml里一些繁琐的API,使得代码更加简单。
- 第一种形式
- /AAA/DDD/BBB:表示一层一层的,AAA下面DDD下面的BBB
- 第二种形式
- //BBB:表示和这个名称相同,表示只要名称是BBB,都得到
- 第三种形式
- /*:所有元素
- 第四种形式
- BBB[1]: 表示第一个BBB元素
- BBB[last()]:表示最后一个BBB元素
- 第五种形式
- //BBB[@id]:表示只要BBB元素上面有id属性,都得到
- 第六种形式
- //BBB[@id='b1']表示元素名称是BBB,在BBB上面有id属性,并且id的属性值是b1
- 例如:
- /students/student[@id='1002']
- 根students标记下student标记下属性名为id且属性值为1002的student元素
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/48836.html