htmlunit抓取动态网页( 开发爬虫项目有通用性吗?如何构建基于配置化的分布式爬虫应用?)

优采云 发布时间: 2022-02-18 20:10

  htmlunit抓取动态网页(

开发爬虫项目有通用性吗?如何构建基于配置化的分布式爬虫应用?)

  

  一起

  在我工作的很多公司里,有很多领域,比如房地产、电商、广告等领域。虽然业务差别很大,但都涉及到爬虫领域。开发了更多爬虫项目后,自然会面临一个问题——

  l 这些开发的爬虫项目通用吗?

  l 是否可以以更低的成本完成一个新的爬虫需求?

  l 在维护和运行过程中,是否可以工具化构建基于配置的分布式爬虫应用?

  这就是我们今天要讨论的内容。

  二 项目要求

  在项目开始时,我们尝试从使用的脚提出一些要求。

  1. 分布式爬取

  由于爬取的量可能非常大,一台机器不足以处理超过一百万的爬取任务,所以分布式爬虫应用是第一个要面对和解决的问题。

  2. 模块化、轻量级

  我们将爬虫应用分为四个角色:“应用层、服务层、业务处理层、调度层”。

  3. 可管理、可监控

  管理监控是一个系统,即配置可以管理,运行可以实时监控。当系统正常运行时,可以更改爬虫的配置。一旦实时监控爬虫出现异常,可以实时修正配置进行干预。一切都可以通过UI界面进行操作。

  4. 通用的,可扩展的。

  爬虫业务往往是多变的,不同领域的爬取需求是不一样的。例如,房源采集包括图像采集、社区信息采集、房源去重等模块。新闻抓取包括内容抓取、文本提取、信息摘要等。

  因此,系统需要能够支持业务扩展需求,能够支持不同业务使用相同的框架进行应用开发。

  三模块分解

  针对业务需求,我们将系统分解为多个应用模块。

  应用层

  应用层适用于管理员和系统维护人员。主要分为两个模块,系统配置模块和运行管理模块。

  l 系统配置模块:系统配置模块包括抓取网站管理配置、在线测试等功能。

  l 运营管理模块:运营管理模块包括实时抓拍量统计、分析、准确率等,甚至包括故障原因、故障数量。

  系统操作人员可以根据操作模块得到实时反馈,并使用系统配置模块进行配置修正。在线测试无误后,配置生效,然后实时监控新配置的效果。

  服务层

  服务层是整个系统传输的中心,相当于整个分布式集中式系统总线和数据总线。服务层提供http/thrift接口,读取数据库,输出配置信息。

  一种。提供网站爬虫配置界面。实时从数据库中读取配置信息,响应业务层的配置请求。

  湾。提供业务层的输出写入接口。实时接收业务层爬取的信息汇总,包括正确数据量、错误数据量、错误原因等。

  C。提供实时报表统计分析。响应应用层的运营管理模块,查询数据库,实时提供数据分析报告。

  业务处理层

  业务处理层是整个爬虫系统的核心,可以划分为多个应用服务器进行处理。业务处理层主要包括解决两件事。

  l 如何获取网址

  l 获取到url后如何处理

  (一) 如何获取 url

  对于爬虫来说,如何获取 url 非常重要。我们将此过程定义为发现系统。对于发现系统来说,目标是如何发现要爬取的网站的详细UR​​L列表,并尽可能的发现。

  假设场景 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系统。目前负责奇安科技数据平台的开发建设。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线