明智爬虫篇

本贴最后更新于 2625 天前,其中的信息可能已经事过境迁

这阵子主要研究的爬虫方向,主要以java为语言基础,nutch为自动框架,jsoup作为自主爬虫插件开发基础,进行了一些有针对性的实站,在这些过程中,也遇到了一些问题和心得,觉得有必要总结一下

爬虫之 nutch

nutch 使用体验与感悟

在这里之所以以 nutch 开篇,因为在接触爬虫之前就一直有听过它的大名,知道它是我们 java 语言栈中的爬虫利器,而且因为它,诞生了 hadoop 这一重器,后者在如今天大数据技术圈的名头,应该是无人不晓吧。所以,多种因素的促使下,让我入了 nutch 的坑。而本文虽是不仅针对 nutch 的总结,但主要还是以 nutch 为主。

经过一阵的实际体验,nutch 给我的感觉,老实说确实是强,百科中说 nutch 的目的是“Nutch 致力于让每个人能很容易, 同时花费很少就可以配置世界一流的 Web 搜索引擎. 为了完成这一宏伟的目标, Nutch 必须能够做到”,能有这么宏伟的目标,自然得有相应的实力来支撑。但就我体验来说,它确实是强,经过简单的配置后,几个简单的指令就能对页面进行抓取,但我觉得也有几个比较明显的让人体验不太好的地方

  1. 对动态生成的网页内容的抓取不理想,或要通过其它的插件,但插件的引入也不如想像般顺利
  2. 版本太多,且很多版本之间的差异明显。在后面会尝试说明一下。
  3. 资料太少,有很多场景国外都没有有效的解决策略(公网检索下),国内环境就更差了,为了搜集资料我多次去过国家图书馆,逛过书店等,都没太找到特别详尽且有针对性的资料,所以 nutch 的整个踩坑过程是很痛苦的,我后面会将我目前调使的 nutch 抓取服务配置和一些踩坑进行详细的总结,我觉得,就我之前对网上的搜集资料的掌握的情况来看,接下来我给出的总结,或者能带来一些更可靠的价值。
    综上,我对 nutch 的感悟是又爱又恨。爱得是它确实是能很便利的帮忙爬取一些东西,恨的是它又不完全是那么便利

nutch 搭建与踩坑回顾

前文中已经提到过 nutch 有很多版本,目前最新版本 2.3.1,它的多个版本间是有很多差异的,比如 1.X 的版本间的持久层是没有抽象出来的,所以 1.X 版本的持久化形式比较单一。而 2.X 版本中持久层被抽象出来,通过一不同的配置即可实现多元的持久层存储。如 mysql、hbase、avro 等。但在 2.3.X 开始就不支持 mysql,官网是明确公示过,或者说从 2.2.X 开始就不支持了,但就实际操作来看 2.2.X 还是能适配 mysql 的,而 2.3.X 在我的实际操作中是不行的。另在这里说一下,我的持久层主要以 mysql 为主,后面可能还会再试试 hbase,而一开始不采用 hbase 不是我没尝试,而是尝试过,发现 nutch 目前适配的 hbase 版本太低,而我服务器上已经搭建的 hbase 集群环境的版本相对高了不少,无法适配。我想没有必要为此就针对 hbase 的版本进行更替,所以采用 mysql 作为持久层,这是坑一
在使用 nutch 之前,对其是一点都不了解的,或者说对爬虫需求也都是不熟悉的。所以,对其的功能是寄于厚望,一开始就配一个网站的首页 url,就设置多线程,多层抓取。但经过多次实站后,发现有些网站中一部份或大部份都不能抓取。再随着深入观察发现,很多是动态生成的内容。更甚者,有些内容的加载是页面加载后,再发送 ajax 来加载页面的一些关键内容。而原本考虑 nutch 是支持插件扩展的,原想直接通过检索,求助于互联网,希望直接就能找到一款 ajax 扩展的插件,然而,几经周折,都未成行。这是坑二

其它还有一些小坑,具体我在下面搭建环节具体结细节处再提,虽小,但影响也挺大,而且比较坑人。以上都是主要通过人力暂未能直接解决的坑。所以先列出来,下面,我回顾下我的 nutch 搭建环节,其中会给出一些小坑与相应的解决方案

搭建

nutch 的搭建分为分布式与单机版,我目前主要涉猎的是 nutch 单机版。具体的版本选择,我尝试过 nutch1.2 与 nutch1.7 以上的所有版本,1.X 与 2.X 的主要差异在于 2.X 将持久层给抽象出来了。总得来说 nuthc2.x 的实用性相对高些。而我以我目前具体使用的版本 2.2.1 为例,进行介绍
step 1.获取 nutch2.2.1 http://archive.apache.org/dist/
这个 url 能定位到 apache 很多软件和历史版本。进入这里,然后找到 nutch,下载相应的版本(该连接有时可能打不开,翻墙试试)。
step 2. 对 ivy 下的 ivy.xml 与 ivysetting.xml 进行修改。
这里就有之前提到的坑一了,这里可能配置对持久层的依赖了。我这以 mysql 配置。

修改 ${APACHE_NUTCH_HOME}/ivy/ivy.xml 文件

将以下行的注释取消

org=”mysql” name=”mysql-connector-java” rev=”5.1.18″ conf=”*->default”/>

修改以下行。从默认的
org="org.apache.gora" name="gora-core" rev="0.3" conf="*->default"/>
改成
org="org.apache.gora" name="gora-core" rev="0.2.1" conf="*->default"/>

取消以下行的注释
org="org.apache.gora" name="gora-sql" rev="0.1.1-incubating" conf="*->default" />

如果按默认的不做修改,将会在抓取网页时遇到以下错误。

e8f001bf53174dd985d3ffd36c6fb32d-image.png

然后配置 ivysetting.xml,这个文件类似 maven 的.setting.xml 文件,主要修改相应的软件仓库源,默认地址可能会出现下载缓慢的情况,建议换成国内源,贴一个我配的阿里的。
ffc49faa6d304b2694313bd5c206ee94-image.png

速度杠杠的。
这时就可以进行编译了,通过终端进 nutch 文件地址进执行 ant

然后配置持久层的配置文件,gora.properties
33e8c343b9854449897c28dd5177409f-image.png

接下来配另 mysql 的映射文件 gora-sql-mapping.xml,可以这么说,这个地方出现的坑是我遇到的坑最多的地方之一。因为我是事后总结,平日也有工任务,所以,在出现坑的时侯,我首要的考虑的是解决的它,所以解决这些问题后,可能能记得是大致是什么状况,但无法具体复现,我在这以总结,提练式的对这些小坑进行叙述,就不贴具体的错误日志了。

首先,文件中的默认配置 id 的大小是 512.这个对于以 unicode,准确的说以 utf8 为编码格式的 mysql 来说是过长的,会在 inject 就报 sql 初始化错误,id too long
解决方式
将 id 的长度改小,我设置的是 180,nutch 默认一般以 target url 拼接成 id,所以一般来讲,180 的 id 是妥妥够用的。

类似的问题还会出现一些如 text ,content 过长的问题,初次搭建我这先建议改小试试,后面还有根治的方式。

修改了 gora-sql-mapping.xml 文件后,执行抓取指令,以 bin/nutch crawl urlfile -threads number -deepth num 这是 nutch 普遍用的一个指行指令,这个指令执行时会默认将数据持久化到 webpage 的表中,这种方式缺点是不太灵活,复杂任务的时候不好操作。

另一种 bin/crawl urlfile -crawlId name (这个 name 会作为对应的表名组成部份) "solrrl" "num"用于指定解析程度
这种方式相对而言更灵活,后面我主要采用这种方式。这里有个小细节,bin/crawl 这个脚本是可以尝试更改的,它默认执行任务时只创建了 50,而这种方式无法像上面那样指定创建线程数,所以我更改了 crawl 文件的初始值,将参数调值 2000.所以可以根据自己需求,酌情更改。

bin/nutch parse 有些 fetch 任务执行完成后,parse 数据同步至数据库时可能会产生一些错误,那么可以通过这个指令尝试进行解析。
示例:bin/nutch parse -crawlId name -all
这里容易出现前面提到过的一个问题,就是在解析时,content 或 text 中的内容格式不对,或 text 内容中出现在了 emoji 等情况,都可能使解析任务中断。我经过一翻调整,算是有一个统一解决方案:在这里贴出来参考
1、将数据库编码格式设置为 utf8mb4;
2、将 text 和 content 的 gora-mapping.xml 文件中添加 jdbc-type=“text” 或 jdbc-type="blob"的设置,即指明其数据库中对应的类型,避免长度等问题
3、上两者结合的一个情况,text 存入文中的内容有编码格式,相对读取轻松,blob 以二进制形式存放,取值需要转码,所以在不出错的情况下优先设为 text,而这时,数据库设为 utf8mb4 时就不要在 jdbc url 中设置 utf8 格式了,这样反而会出现问题。
ae5a036dcc9c45a29fdfa0ed2d345eca-image.png

至此 nutch 日常的主要使用指令就这两个,还有些 如果 bin/nutch fetch bin/nutch gernate
这些相对出错较少,出错的影响和对策网上也相对较多,就不再缀述了。


至此爬虫服务的总结就要告一段落了,这篇文章体量相对较大,我是断断续续逐步完成的,所以,后面更多是凭回忆出的之前深刻影响且在网上少有明确解决方案的一些问题,给出我的解决方式,所以,如果这篇总结针对的算是 nutch 使用过程中,尝试更进一步的助力,而非特别基础的。如果看到此篇文章的你对 nutch 还有其它的一些问题,可以尝试留言,我们一起探讨。

  • 技术

    到底什么才是技术呢?

    88 引用 • 179 回帖 • 4 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...