htmlunit抓取动态网页( 开发爬虫项目有通用性吗?如何构建基于配置化的分布式爬虫应用?)
优采云 发布时间: 2022-02-18 20:10htmlunit抓取动态网页(
开发爬虫项目有通用性吗?如何构建基于配置化的分布式爬虫应用?)
一起
在我工作的很多公司里,有很多领域,比如房地产、电商、广告等领域。虽然业务差别很大,但都涉及到爬虫领域。开发了更多爬虫项目后,自然会面临一个问题——
l 这些开发的爬虫项目通用吗?
l 是否可以以更低的成本完成一个新的爬虫需求?
l 在维护和运行过程中,是否可以工具化构建基于配置的分布式爬虫应用?
这就是我们今天要讨论的内容。
二 项目要求
在项目开始时,我们尝试从使用的脚提出一些要求。
1. 分布式爬取
由于爬取的量可能非常大,一台机器不足以处理超过一百万的爬取任务,所以分布式爬虫应用是第一个要面对和解决的问题。
2. 模块化、轻量级
我们将爬虫应用分为四个角色:“应用层、服务层、业务处理层、调度层”。
3. 可管理、可监控
管理监控是一个系统,即配置可以管理,运行可以实时监控。当系统正常运行时,可以更改爬虫的配置。一旦实时监控爬虫出现异常,可以实时修正配置进行干预。一切都可以通过UI界面进行操作。
4. 通用的,可扩展的。
爬虫业务往往是多变的,不同领域的爬取需求是不一样的。例如,房源采集包括图像采集、社区信息采集、房源去重等模块。新闻抓取包括内容抓取、文本提取、信息摘要等。
因此,系统需要能够支持业务扩展需求,能够支持不同业务使用相同的框架进行应用开发。
三模块分解
针对业务需求,我们将系统分解为多个应用模块。
应用层
应用层适用于管理员和系统维护人员。主要分为两个模块,系统配置模块和运行管理模块。
l 系统配置模块:系统配置模块包括抓取网站管理配置、在线测试等功能。
l 运营管理模块:运营管理模块包括实时抓拍量统计、分析、准确率等,甚至包括故障原因、故障数量。
系统操作人员可以根据操作模块得到实时反馈,并使用系统配置模块进行配置修正。在线测试无误后,配置生效,然后实时监控新配置的效果。
服务层
服务层是整个系统传输的中心,相当于整个分布式集中式系统总线和数据总线。服务层提供http/thrift接口,读取数据库,输出配置信息。
一种。提供网站爬虫配置界面。实时从数据库中读取配置信息,响应业务层的配置请求。
湾。提供业务层的输出写入接口。实时接收业务层爬取的信息汇总,包括正确数据量、错误数据量、错误原因等。
C。提供实时报表统计分析。响应应用层的运营管理模块,查询数据库,实时提供数据分析报告。
业务处理层
业务处理层是整个爬虫系统的核心,可以划分为多个应用服务器进行处理。业务处理层主要包括解决两件事。
l 如何获取网址
l 获取到url后如何处理
(一) 如何获取 url
对于爬虫来说,如何获取 url 非常重要。我们将此过程定义为发现系统。对于发现系统来说,目标是如何发现要爬取的网站的详细URL列表,并尽可能的发现。
假设场景 A
我们来看一个电商网站:打开首页--打开分类页面--可能有多个分类页面--逐层点击--直到最小的分类页面。
当你打开这个分类页面时,你会发现分类页面下的所有分页页面。如果一次向下滚动一页,则可以获取类别页面中的所有产品。
假设情景 B
我们去买车吧网站:打开首页——找到品牌页——然后找到车系——最后找到车型页。
通过以上场景分析,我们可以得出一个结论,人们可以非常智能的找到所有需要爬取的详细页面,即电商产品和车型页面。那么,是否可以通过配置来模拟这个过程呢?
请看下图:
备注如下:
1. 根信息:
定义发现模块的入口页面,就像人们打开公交车站的网页一样,后续的发现都是从这些入口页面开始的。
这里给出的例子是汽车网络的品牌列表页面,根据“模板化”应用变量的配置,总共有100个入口页面。
2. 步骤:
依次遍历这100个入口页面,分别执行steps中定义的步骤。查看和浏览机器模拟人类的方式。
每一步都使用“link_module”定义的类进行逻辑处理。
一种。读取入口页面的html,结合“sub_prefix”、“sub_suffix”和“select”定义的内容,获取页面子区域的html。
湾。使用“link_match_method”方法(包括前缀收录、匹配等)提取子区域的链接。
C。每个链接都匹配“link_pattern”,匹配成功的url进入下一步。
d。每一步得到的url都会自动转发到下一步处理。处理逻辑对上述ac递归,直到“last_step”为真。
这里,“last_step”为真时找到的url就是发现系统最终需要获取的url列表。发现系统总结,通过配置方法,结合人类的浏览习惯,经过数步迭代,最终得到网站的详细页面url列表。
由于每个步骤的提取链接规则和步骤数据都是手动定义的,因此可以适应网站的大部分发现系统。当然,越复杂的网站发现配置可能会越来越复杂,但同样如此。
(二)获取到url后如何处理
前提当然是每个业务的处理都不一样,包括提取页面属性、文本提取、图片获取,甚至与当前系统对接的功能。
由于业务处理不一致,自然会想到通过配置来定义责任链系统,就像著名框架Netty中的Pipeline设计一样。在处理的过程中,定义了一个Context上下文处理类,所有的中间结果都挂在这个Context中。
描述比较空洞,但还是以实际案例为准。
备注如下:
获取 url 后,读取配置并在 url 匹配“site”时应用当前的“site”规则。
1. pipeline 定义了责任链的处理
这里的定义是“爬取模块、Javascript处理模块、通用解析模块”。对应的处理如下:
先执行爬取模块获取html。然后执行Javascript处理模块,输入为html,解析html。这可能是评论或价格。简单来说就是先处理动态加载项目,再处理“通用解析模块”。
2. "parser_rules" 定义解析模块
最终的输出是kv,在java中是map,在python中是dict。即从上一步的html中,找到每个推荐的“sizzle”,执行“prefix”、“suffix”去掉前缀和后缀(过滤为“price:xxx元,前缀“price:”,后缀为元)。
顺便说一句,sizzle 也是一种开源技术。据说大名鼎鼎的Jquery也是一个“咝咝”的引擎。Java可以使用Jsoup解析处理。
你怎么知道要获取什么“嘶嘶作响”的内容?具体可以结合firebug插件,选择即可获得。选择后,可以结合应用层的管理工具进行测试。
3. “需要”
可以看到,配置项中有“isrequire”,表示是否需要这个内容。如果在实际处理中需要而无法获取,则在爬取过程中会记录错误,而错误的原因自然是“$key is null”。另外,每个模块都可能出错,一旦出错,以后就不需要再执行了。
因此,在爬取过程中,业务处理层从服务层获取一批url(默认为100个)后,处理完这100个url后,会上报给服务层,上报内容为:
当前任务处理机在什么时间处理100页。不同的网站有多少成功,有多少失败,有多少模块失败,解析模块中有多少字段失败。
所有这些信息都是实时统计的,并在运行监控系统中以图形方式绘制。必要时可发出警报,维修人员可实时介入。
Q:问个问题,如果我加了一个网站怎么办?
A:其实很简单,再增加一个配置就行了。业务定义管道。如果有解析需求,填写对应的解析项。
以上两个系统,发现系统和处理系统,在我们的实际生产中经过以下步骤运行。
一种。发现系统会累积发现要爬取的详细页面网站,因为它是一个累积和持续的过程。因此,您可以确保继续无限接近 网站 的 100% 页面。
湾。处理系统通过服务层获取配置信息(可能由维护人员实时修正)和待抓取列表进行处理。
待抓取的列表根据业务的优先级分为普通队列和优先级队列,通过任务调度系统统一管理和配置。
调度层
l 调度层主要是业务系统。
l 添加任务调度器网站
l 网站 发现频率,包括增量发现频率和完全发现频率
l 网站抢优先级被推入队列
l 断点续传管理
我...
四系统架构设计
l 从业务模块来看
应用层、服务层、业务处理层、调度层
l 从功能系统来看
发现系统、抓取系统、配置系统、监控系统
l 从可扩展性的角度
自定义责任链,自定义属性抽取
l 从实时角度
实时捕捉,实时配置有效,实时监控,实时测试
l 从系统架构来看
分布式架构,服务层主从切换设计,轻量级(只依赖队列、数据库、java)
五个传说
①
②
③
爬虫模块ui二(1.6任务配置):
定义每个爬虫任务的处理和执行责任链。不同的爬虫任务可以有不同的处理链。对于系统来说,处理每一个待爬取的url都会按照责任链的顺序执行。后处理类是在一批任务执行后(比如上面的100个url)进行批量提交的方法。比如文件登陆、存储、推送到线上系统等。通过定义任务处理,可以自定义各种场景的爬虫业务,增加系统的灵活性,无需编码。
④
属性配置:
如图,如果维护者添加了测试的url,定义了要提取的属性,就可以在线定义页面对应的属性输出,查看即可。在增加便利性和可测试性的基础上,可以灵活选择页面的任意属性。值得一提的是,sizzle的配置可以通过firefox插件获取。
⑤
1.9查看详情:
在爬虫系统运行过程中,几乎可以实时监控任务。由于爬虫任务将爬取状态实时写入数据库,因此可以通过ui界面进行管理和监控。1. 监控:监控当前时间爬虫任务成功数、错误数、什么模块出错,甚至是属性提取错误。2.管理:维护人员观察监控效果后,可以实时编辑管理(见上图),满足不同网站修改的需要。所有编辑实时生效。编辑后无需重启服务,可实时监控爬虫任务的最新效果。
高级建筑师
十余年数据研发经验,擅长数据处理,如爬虫、搜索引擎、大数据应用的高并发。历任架构师、研发经理等职务。曾主导开发大型爬虫、搜索引擎和大数据广告DMP系统。目前负责奇安科技数据平台的开发建设。