采集器采集(严格意义来说,采集器和爬虫不是一回事:采集器编写)
优采云 发布时间: 2022-01-22 17:05采集器采集(严格意义来说,采集器和爬虫不是一回事:采集器编写)
严格来说,采集器和爬虫不是一回事:采集器是对特定结构的数据源进行解析和结构化,从中提取出需要的数据;而爬虫的主要目标更多的是页面中的链接和页面的TITLE。
采集器我已经写了很多,所以请随意写下你的经历作为自己的备忘录。
第一个是最简单的:静态页面采集器。即采集的数据源页面是静态的,至少采集器关心的部分数据是静态的,所有收录目标数据的页面代码都可以直接访问页面网址。这个采集器是最常用的,也是最基本的。已经有很多成熟的商用采集器产品,但是使用起来似乎有点复杂。我自己编写 采集器 时会注意到的一些问题似乎不适用于这些产品,或者名称不是我想要的并且无法找到。用了几次之后,还是自己写比较好,这样更省时间,效率更高。
准备知识:HTTP协议基础、HTML语言基础、正则表达式及任何支持正则表达式的编程工具(.net、java、php、Python、ruby等)
第一步是下载目标页面的 HTML。
这一步并不太难。.net中有HttpWebRequest、HttpWebResponse等类,其他语言也有类似的东西。但需要注意的是,为采集器编写下载器时,参数配置一定要灵活:User-Agent、Refer、Cookie等字段必须可配置,并且必须支持使用代理服务器. 突破目标服务器的访问限制策略或机器人识别策略。常见反机器人、反“反机器人”等相关技术将在后续文章中专门写。
页面代码下载到本地后,还得进行解析。有两种解析方法
1、 将其视为 HTML 解析
熟悉HTML的人可以直接将下载的HTML页面解析为HTML,这也是最快最高效的。遍历HTML元素和属性后,直接找到感兴趣部分的数据内容,通过访问其元素、元素属性、子元素来获取数据。.net原生没有HTML解析库,可以找第三方库,大部分都好用,至少一般用来解析页面,调出数据之类的时候是这样。唯一需要注意的是,需要考虑页面代码没有完全下载或者目标页面结构错误的情况。
2、 把它当作一个字符串,用正则表达式解析
正则表达式的优点是灵活性,当方法一失败或实现麻烦(例如目标数据的HTML元素路径可能不固定)时可以考虑。使用正则表达式的思路是找到目标数据及其上下文的特征或特征串,然后编写正则表达式提取匹配。
下面以解析bing的搜索结果页面为例,介绍静态采集器工作的基本原理。
首先是页面获取。点击两次可以找到页面参数的规则,例如:
+II&第一=31
这个URL代表“MOLLE”“II”两个关键词搜索,当前页是第四页。FIRST参数是指本页第一个显示的搜索结果的索引号,第四页显示31-40个搜索结果。
这是在GET方法中传递参数,大多数情况下都是这样。如果目标页面使用POST方式传参,可以用浏览器的开发者模式抓包看参数是什么。
然后我们下载了目标页面,在正则表达式测试器中打开:
好吧,这是很多工作,所以我自己写了一个方便的工具。
我们的目标是将链接文本和链接 URL 提取到搜索结果中。对于需要从同一个页面解析并相互对应的两条或多条数据,也有两种策略:直接根据这些数据的不同特性编写表达式,从页面中提取目标数据(例如,使用常规进程先处理页面)。, 获取所有链接标题文本,然后使用正则处理页面,获取所有链接URL),或者分析页面结构,找到收录目标数据项的最小页面结构(如html表格中的表格行元素),然后进行解析。后者更可靠,可以省去很多干扰,但也麻烦一些。后一种方法如下所述。
使用浏览器的检查工具(Chrome中以前叫View Element,新版叫Inspection,我刚搜了半天)分析页面代码,我们可以发现所有搜索的内容都收录在一个带有"b_results" 的 id 属性。写一个表达式来提取它:
对于常规的 HTML 解析,零宽度断言和环视(查找)通常用于提取具有特定前缀和后缀的字符串。技术博客园里已经有很多关于正则表达式的相关文章,这里不再赘述。
但是,应该注意,对于 .net 的正则表达式库,需要注意一些开关。在解析html时,往往需要选择SingleLine参数,这样引擎会将字符串中的所有回车视为普通字符,而不是作为一行数据的结尾。不过这也不是绝对的,需要根据实际情况灵活配置。
还有一个小技巧。在移动端盛行的今天,有些网站会根据用户浏览器请求中的USER-AGENT提供不同的页面,针对移动端发起的请求,会提供手机版的页面,出于节省客户流量的考虑,一般手机版的页面会比PC版的更干净,页面噪音也会更少。
回到页面分析,我们刚刚找到了收录所有目标元素的页面结构。其实如果我们发现目标数据的最小结构在页面中也是唯一的,直接提取出来就可以了:
这样我们就得到了所有收录目标数据的标签的内容。顺便说一句,因为截图中工具使用的诺基亚手机的USER AGENT,所以我拿到的是手机版的页面,和PC版略有不同,比较干净。
接下来我们解析每个元素。由于所有 li 标签的格式结构都是一样的,我们可以使用同一套正则解析。
我们的目标是链接标题和链接URL,说白了就是标签的href属性和标签内容。
直接写表达式即可:
然后用同样的表达式处理每个li标签的内容就OK了。
好了,采集器的基本原理介绍完了。我自己编写的这个常规工具可以在我的博客上找到。您很乐意使用它,也欢迎您报告错误和功能建议。