httpunit 抓取网页(网络爬虫的是做什么的?手动写一个简单的)
优采云 发布时间: 2021-10-27 21:18httpunit 抓取网页(网络爬虫的是做什么的?手动写一个简单的)
网络爬虫有什么作用?手动编写一个简单的网络爬虫;网络爬虫(又称网络蜘蛛、网络机器人)是一种程序或足,根据一定的规则自动抓取万维网上的信息
书。其他不太常用的名称是蚂蚁、自动索引、模拟器或蠕虫。网络爬虫通过网页的链接地址搜索网页。从某个页面(通常是首页)开始,它读取网页的内容并找到
在网页中的其他链接地址,然后通过这些链接地址找到下一个网页,这样一直循环下去,直到你把这个网站全部
的所有页面都被抓取到最后。如果把整个互联网看作一个网站,那么网络蜘蛛就可以利用这个原理抓取互联网上的所有网页。因此,如果要抓取互联网上的数据,不仅需要一个爬虫程序,还需要一个能够接受“爬虫”发回的数据并对其进行处理和过滤的服务。
爬虫爬取的数据量越大,对服务器的性能要求越高。网络爬虫有什么作用?他的主要工作是根据指定的URL地址发送请求,得到响应,然后解析响应。一方面,从
在响应中找到你要查找的数据,另一方面从响应中解析出新的URL路径,然后继续访问,继续解析;继续寻找您需要的东西
数据并继续解析出新的URL路径。这是网络爬虫的主要工作。以下是流程图:
通过上面的流程图,您可以大致了解网络爬虫是做什么的,并基于这些,您可以设计一个简单的网络爬虫。
一个简单爬虫的必要功能:
发送请求和获取响应的功能;解析响应的功能;存储过滤数据的功能;处理解析出的URL路径的功能;爬虫需要注意的三点:
爬取目标的描述或定义;网页或数据的分析和过滤;URL 搜索策略。网络爬虫根据系统结构和实现技术大致可以分为以下几种类型:
General Purpose Web Crawler (General Purpose Web Crawler) Focused Web Crawler (Focused Web Crawler) Incremental Web Crawler (Incremental Web Crawler) Deep Web Crawler。实际的网络爬虫系统通常是通过多种爬虫技术的组合来实现的。下面我就用我们的官网来跟大家分析一下如何实现这样的爬虫:
首先观察我们爬虫的起始页面是:
分析页面
所有好消息的 URL 用 XPath 表达式表示如下:
相关资料
标题:使用XPath表达式表达描述:使用XPath表达式表达图片:使用XPath表达式表达
好了,我们已经在上面的代码中找到了需要获取的关键信息的XPath表达式,接下来就可以正式的编写代码来实现了。
代码实现部分使用了webmagic框架,因为它比使用基本的Java网络编程要简单得多。注:对于webmagic框架,可以阅读以下讲座
演示.java
WanhoPageProcessor.javaWanhoPipeline.javaArticleVo.java
在开源社区搜索java爬虫框架:共有83种
我们正在使用
webmagic是一个爬虫框架,不需要配置,方便二次开发。它提供了简单灵活的 API,可以用少量代码实现。
爬虫webmagic采用完全模块化设计,功能覆盖爬虫整个生命周期(链接提取、页面下载、内容提取、持久化)
),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/cookie等功能。Webmagic 包括强大的页面提取功能。开发人员可以轻松使用 css 选择器、xpath 和正则表达式。链接和内部
内容提取,支持多个选择器的链式调用
注:官方中文文档:
可以使用maven构建依赖,例如:
当然你也可以自己下载jar包,地址是:
一般来说,如果我们需要抓取的目标数据不是通过ajax异步加载的,那么我们都可以在页面的HTML源代码中的某个位置找到我们需要的数据
注意:如果数据是异步加载到页面中的,一般有两种方式获取数据:
观察页面加载前请求的所有URL(F12->网络选项),然后找到那些加载数据的json请求,最后直接请求那些URL获取数据来模拟浏览器请求,等待一段时间满载页面 把数据进去就行了。这类爬虫通常需要内嵌浏览器内核,比如webmagic、phantom.js、HttpUnit等。
下面我就用我们的官网来跟大家分析一下如何实现这样的爬虫:
首先观察我们爬虫的起始页面是:
分析页面
从上图可以看出,我们可以从首页的HTML源代码中直观的找到我们需要的标题、内容、图片链接等信息。那么,我们可以通过哪些方式提取这些目标数据呢?
其实提取页面元素的webmagic框架主要支持以下三种方法:
XPath 正则表达式 CSS 选择器
当然,选择哪种方式提取数据需要根据具体页面进行分析。在这个例子中,很明显使用XPath提取数据是最方便的
所以,接下来我直接给出我们需要爬取的数据的XPath路径:
所有好消息的URL都用XPath表达式表示: Title:XPath表达式用于表达描述:XPath表达式用于图片表达:XPath表达式用于表达
注意:“//”表示从相对路径开始,第一个“/”表示从页面路径开始;后面两个/之间的内容代表一个元素,方括号中的内容表示该元素的执行属性,如:h1[@class='entry-title']表示:一个h1元素的class属性为“条目标题”
使用webmagic提取页面数据时,需要自定义一个类来实现PageProcessor接口。
该类实现PageProcessor接口的主要功能是以下三个步骤:
爬虫配置:爬取页面的配置,包括编码、爬取间隔、重试次数等页面元素的提取:使用正则表达式或者XPath提取页面元素。发现新链接:找到要爬取的页面 获取其他目标页面的链接
Spider是爬虫启动的入口点。在启动爬虫之前,我们需要使用一个 PageProcessor 创建一个 Spider 对象,然后使用 run() 来启动它。同时可以通过set方法设置其他Spider组件(Downloader、Scheduler、Pipeline)
注:更详细的参数介绍请参考这里的官方文档:
演示.java
对于提取逻辑比较复杂的爬虫,我们通常会实现上面的PageProcessor接口来编写页面元素的提取逻辑。但是对于提取逻辑比较简单的爬虫,这时候我们可以选择在实体类中添加注解来构建轻量级爬虫
从上面的代码可以看出,这个实体类除了添加了几个注解之外,就是一个普通的POJO,不依赖其他任何东西。上面使用的几个注解的一般含义是:
@TargetUrl:我们需要提取的数据的所有目标页面,其值是一个正则表达式@HelpUrl:需要访问的页面以获得目标页面的链接@ExtractBy:用于提取元素的注解,它描述了一种抽取规则。意思是“使用此提取规则将提取的结果保存在该字段中”。您可以使用 XPath、CSS 选择器、正则表达式和 JsonPath 来提取元素
虽然在PageProcessor中我们可以实现数据的持久化(PS:基于注解的爬虫可以通过AfterExtractor接口实现类似的目的),将爬虫抓取到的数据保存到文件、数据库、缓存等中。但是很明显PageProcessor还是实体类主要负责提取页面元素,所以更好的处理方法是在另一个地方做数据持久化。这个地方是-管道
为了实现数据的持久化,我们通常需要实现 Pipeline 或 PageModelPipeline 接口。普通爬虫使用前一个接口,基于注解的爬虫使用后一个接口
对于基于注解的爬虫,启动类不是Spider,而是OOSpider。当然,两者的用法是类似的。示例代码如下:
jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似JQuery的操作方法来检索和操作数据
Jsoup 是 Java 世界中的 HTML 解析工具。它支持使用 CSS Selector 选择 DOM 元素,还可以过滤 HTML 文本以防止 XSS 攻击。
下载 Jsoup
查看官方手册:
Jsoup是Java世界中html解析过滤的最佳选择。支持将html解析成DOM树,支持CSS Selector表单选择,支持html过滤,自带Http下载器。
Jsoup 的代码相当简洁。Jsoup 共有 53 个类,不依赖任何第三方包。和最终发布包9.8M的SAXON相比,真是短小精悍。
从 URL、文件或字符串解析 HTML;使用 DOM 或 CSS 选择器来查找和检索数据;操作 HTML 元素、属性和文本;
Jsoup 的入口点是类。示例包中提供了两个示例。解析html后,使用CSS Selector和NodeVisitor来操作Dom元素。
下面是一个例子来说明如何调用Jsoup:
Jsoup 使用自己的一套 DOM 代码系统。虽然 Elements 和 Elements 的名称和概念与 Java XML 相同
API 类似,但没有代码级别的关系。也就是说,如果要使用一组XML API来操作Jsoup,结果是不可能的。
但正因为如此,Jsoup 可以摒弃 xml 中一些繁琐的 API,让代码更简单。
第一种形式
/AAA/DDD/BBB:表示AAA下的BBB和AAA下的DDD的第二种形式
//BBB: 意思和这个名字一样,意思就是只要名字是BBB就会得到第三种形式
/*:所有元素的第四种形式
BBB[1]:代表第一个BBB元素 BBB[last()]:代表最后一个BBB元素的第五种形式
//BBB[@id]:表示只要BBB元素上有id属性,就得到第六种形式
//BBB[@id='b1']表示元素名称为BBB,BBB上有一个id属性,id属性值为b1。例如:
/students/student[@id='1002'] 根student标签下student标签下属性名为id,属性值为1002的student元素
如需转载,请注明文章的出处和出处地址: