httpunit 抓取网页(网络爬虫的是做什么的?手动写一个简单的)

优采云 发布时间: 2021-10-27 21:18

  httpunit 抓取网页(网络爬虫的是做什么的?手动写一个简单的)

  网络爬虫有什么作用?手动编写一个简单的网络爬虫;网络爬虫(又称网络蜘蛛、网络机器人)是一种程序或足,根据一定的规则自动抓取万维网上的信息

  书。其他不太常用的名称是蚂蚁、自动索引、模拟器或蠕虫。网络爬虫通过网页的链接地址搜索网页。从某个页面(通常是首页)开始,它读取网页的内容并找到

  在网页中的其他链接地址,然后通过这些链接地址找到下一个网页,这样一直循环下去,直到你把这个网站全部

  的所有页面都被抓取到最后。如果把整个互联网看作一个网站,那么网络蜘蛛就可以利用这个原理抓取互联网上的所有网页。因此,如果要抓取互联网上的数据,不仅需要一个爬虫程序,还需要一个能够接受“爬虫”发回的数据并对其进行处理和过滤的服务。

  爬虫爬取的数据量越大,对服务器的性能要求越高。网络爬虫有什么作用?他的主要工作是根据指定的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元素

  如需转载,请注明文章的出处和出处地址:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线