之前我写过几篇文章介绍过有关爬虫的智能解析算法,包括商业化应用 Diffbot、Readability、Newspaper 这些库,另外我有一位朋友之前还专门针对新闻正文的提取算法 GeneralNewsExtractor,这段时间我也参考和研究了一下这些库的算法,同时参考一些论文,也写了一个智能解析库,在这里就做一个非正式的介绍。

引入

那首先说说我想做的是什么。

比如这里有一个网站,网易新闻,https://news.163.com/rank/,这里有个新闻列表,预览图如下:

任意点开一篇新闻,看到的结果如下:

我现在需要做到的是在不编写任何 XPath、Selector 的情况下实现下面信息的提取:

对于列表页来说,我要提取新闻的所有标题列表和对应的链接,它们就是图中的红色区域:

这里红色区域分了多个区块,比如这里一共就是 40 个链接,我都需要提取出来,包括标题的名称,标题的 URL。

我们看到页面里面还有很多无用的链接,如上图绿色区域,包括分类、内部导航等,这些需要排除掉。

对于详情页,我主要关心的内容有标题、发布时间、正文内容,它们就是图中红色区域:

其中这里也带有一些干扰项,比如绿色区域的侧边栏的内容,无用的分享链接等。

总之,我想实现某种算法,实现如上两大部分的智能化提取。

框架

之前我开发了一个叫做 Gerapy https://github.com/Gerapy/Gerapy 的框架,是一个基于 Scrapy、Scrapyd 的分布式爬虫管理框架,属 1.x 版本。现在正在开发 Gerapy 2.x 版本,其定位转向了 Scrapy 的可视化配置和调试、智能化解析方向,放弃支持 Scraypd,转而支持 Docker、Kubernetes 的部署和监控。

对于智能解析来说,就像刚才说的,我期望的就是上述的功能,在不编写任何 XPath 和 Selector 的情况下实现页面关键内容的提取。

框架现在发布了第一个初步版本,名称叫做 Gerapy Auto Extractor,名字 Gerapy 相关,也会作为 Gerapy 的其中一个模块。

GitHub 链接:https://github.com/Gerapy/GerapyAutoExtractor

现在已经发布了 PyPi,https://pypi.org/project/gerapy-auto-extractor/,可以使用 pip3 来安装,安装方式如下:

pip3 install gerapy-auto-extractor

安装完了之后我们就可以导入使用了。

功能

下面简单介绍下它的功能,它能够做到列表页和详情页的解析。

列表页:

•标题内容•标题链接

详情页:

•标题•正文•发布时间

先暂时实现了如上内容的提取,其他字段的提取暂时还未实现。

使用

要使用 Gerapy Auto Extractor,前提我们必须要先获得 HTML 代码,注意这个 HTML 代码是我们在浏览器里面看到的内容,是整个页面渲染完成之后的代码。在某些情况下如果我们简单用「查看源代码」或 requests 请求获取到的源码并不是真正渲染完成后的 HTML 代码。

要获取完整 HTML 代码可以在浏览器开发者工具,打开 Elements 选项卡,然后复制你所看到的 HTML 内容即可。

先测试下列表页,比如我把 https://news.163.com/rank/ 这个保存为 list.html,

然后编写提取代码如下:

import json
from gerapy_auto_extractor.extractors.list import extract_listhtml = open('list.html', encoding='utf-8').read()
print(json.dumps(extract_list(html), indent=2, ensure_ascii=False, default=str))

就是这么简单,核心代码就一行,就是调用了一个 extract_list 方法。

运行结果如下:


[{"title": "1家6口5年\"结离婚\"10次:儿媳\"嫁\"公公岳","url": "https://news.163.com/20/0705/05/FGOFE1HJ0001875P.html"},{"title": "\"港独\"议员泼水阻碍教科书议题林郑月娥深夜斥责","url": "https://news.163.com/20/0705/02/FGO66FU90001899O.html"},{"title": "感动中国致敬留德女学生:街头怒怼\"港独\"有理有","url": "https://news.163.com/20/0705/08/FGOPG3AM0001899O.html"},{"title": "香港名医讽刺港警流血少过月经受访时辩称遭盗号","url": "https://news.163.com/20/0705/01/FGO42EK90001875O.html"},{"title": "李晨独居北京复式豪宅没想到肌肉男喜欢小花椅子","url": "https://home.163.com/20/0705/07/FGOLER1200108GL2.html"},{"title": "不战东京!林丹官宣退役正式结束20年职业生涯","url": "https://sports.163.com/20/0704/12/FGML920300058782.html"},{"title": "香港美女搬运工月薪1.6万每月花6千租5平出租","url": "https://home.163.com/20/0705/07/FGOLEL1100108GL2.html"},{"title": "杭州第一大P2P\"凉了\":近百亿未还!被警方立案","url": "https://money.163.com/20/0705/07/FGON5T7B00259DLP.html"},...
]

可以看到想要的内容就提取出来了,结果是一个列表,包含标题内容和标题链接两个字段,由于内容过长,这里就省略了一部分。

接着我们再测试下正文的提取,随便打开一篇文章,比如 https://news.ifeng.com/c/7xrdz0kysde,保存下 HTML,命名为 detail.html。

编写测试代码如下:

import json
from gerapy_auto_extractor.extractors import extract_detail
html = open('detail.html', encoding='utf-8').read()
print(json.dumps(extract_detail(html), indent=2, ensure_ascii=False, default=str))

运行结果如下:

{"title": "内蒙古巴彦淖尔发布鼠疫疫情Ⅲ级预警","datetime": "2020-07-05 18:54:15","content": "2020年7月4日,乌拉特中旗人民医院报告了1例疑似腺鼠疫病例,根据《内蒙古自治区鼠疫疫情预警实施方案》(内鼠防应急发﹝2020﹞7号)和《自治区鼠疫控制应急预案(2020年版)》(内政办发﹝2020﹞17号)的要求,经研究决定,于7月5日发布鼠疫防控Ⅲ级预警信息如下:\n一、预警级别及起始时间\n预警级别:Ⅲ级。\n2020年7月5日起进入预警期,预警时间从本预警通告发布之日持续到2020年底。\n二、注意事项\n当前我市存在人间鼠疫疫情传播的风险,请广大公众严格按照鼠疫防控“三不三报”的要求,切实做好个人防护,提高自我防护意识和能力。不私自捕猎疫源动物、不剥食疫源动物、不私自携带疫源动物及其产品出疫区;发现病(死)旱獭及其他动物要报告、发现疑似鼠疫病人要报告、发现不明原因的高热病人和急死病人要报告。要谨慎进入鼠疫疫源地,如有鼠疫疫源地的旅居史,出现发热等不适症状时及时赴定点医院就诊。\n按照国家、自治区鼠疫控制应急预案的要求,市卫生健康委将根据鼠疫疫情预警的分级,及时发布和调整预警信息。\n巴彦淖尔市卫生健康委员会\n2020年7月5日\n来源:巴彦淖尔市卫生健康委员会"
}

成功输出了标题、正文、发布时间等内容。

这里就演示了基本的列表页、详情页的提取操作。

算法

整个算法的实现比较杂,我看了几篇论文和几个项目的源码,然后经过一些修改实现的。

其中列表页解析的参考论文:

•面向不规则列表的网页数据抽取技术的研究[1]•基于块密度加权标签路径特征的Web新闻在线抽取[2]

详情页解析的参考论文和项目:

•基于文本及符号密度的网页正文提取方法[3]•GeneralNewsExtractor[4]

这些都是不完全参考,然后加上自己的一些修改最终才形成了现在的结果。

算法在这里就几句话描述一下思路,暂时先不展开讲了。

列表页解析:

•找到具有公共父节点的连续相邻子节点,父节点作为候选节点。•根据节点特征进行聚类融合,将符合条件的父节点融合在一起。•根据节点的特征、文本密度、视觉信息(尚未实现)挑选最优父节点。•从最优父节点内根据标题特征提取标题。

详情页解析:

•标题根据 meta、title、h 节点综合提取•时间根据 meta、正则信息综合提取•正文根据文本密度、符号密度、视觉信息(尚未实现)综合提取。

后面等完善了之后再详细介绍算法的具体实现,现在如感兴趣可以去看源码。

说明

本框架仅仅发布了最初测试版本,测试覆盖度比较少,目前仅仅测试了有限的几个网站,尚未大规模测试和添加对比实验,因此准确率现在还没有标准的保证。

参考:关于详情页正文的提取我主要参考了 GeneralNewsExtractor[5] 这个项目,原项目据测试可以达到 90% 以上的准确率。

列表页我测试了腾讯、网易、知乎等都是可以顺利提取的,如:

后面会有大规模测试和修正。

项目初版,肯定存在很多不足,希望大家可以多发 Issue 和提 PR。

待开发功能

•视觉信息的融合•文本相似度的融合•分类模型的融合•下一页翻页的信息提取•正文图片、视频的提取•对接 Gerapy

最后感谢大家的支持!

References

[1] 面向不规则列表的网页数据抽取技术的研究: http://www.cnki.com.cn/Article/CJFDTotal-JSYJ201509023.htm
[2] 基于块密度加权标签路径特征的Web新闻在线抽取: https://kns.cnki.net/kcms/detail/detail.aspx?filename=PZKX201708010&dbcode=CJFQ&dbname=CJFD2017&v=
[3] 基于文本及符号密度的网页正文提取方法: https://kns.cnki.net/KCMS/detail/detail.aspx?dbcode=CJFQ&dbname=CJFDLAST2019&filename=GWDZ201908029&v=MDY4MTRxVHJXTTFGckNVUkxPZmJ1Wm5GQ2poVXJyQklqclBkTEc0SDlqTXA0OUhiWVI4ZVgxTHV4WVM3RGgxVDM=
[4] GeneralNewsExtractor: https://github.com/kingname/GeneralNewsExtractor
[5] GeneralNewsExtractor: https://github.com/kingname/GeneralNewsExtractor

作者:华为云云享专家 崔庆才静觅

相关推荐

爬虫智能解析库 Readability 和 Newspaper 的用法

Python爬虫偷懒神器 — 快速构造请求头!

一线大厂在用的反爬虫方法,看我如何破了它!

40行代码教你利用Python网络爬虫批量抓取小视频

用前考虑清楚,伤敌一千自损八百的字体反爬虫

发布一个网页智能解析算法库相关推荐

  1. python算法库执行效率_Python智能优化算法库小汇总

    最近查了一圈python的智能优化算法库,发现在python里面这样的库相对一些传统的语言还真是不太多(比如Matlab).总的看起来似乎起步都还比较晚(个人认为有可能是因为智能算法本身相对复杂并且过 ...

  2. html制作网页怎么建站点,建站实操:如何发布一个网页

    "如何发布一个网页",这个题目笔者换了好几个,又换回来了.或许这个描述不是特别标准,或许在站长朋友前不值一提.但我觉着这是很多想踏入站长圈的准菜鸟的心声,这就足够了,本文就是为他们 ...

  3. Python主要智能优化算法库汇总

    最近几年简单浏览和对比了一些智能算法的库.现将各种库的主要信息.相关优缺点简单整理如下,各位同学可根据自己的需求和喜好进行选择. 文章目录 1.DEAP 2.mealpy 3.scikit-opt ( ...

  4. (原创)发布一个C++版本的ORM库SmartDB(一)

    先简单说说ORM的优点: 提高开发效率,减少重复劳动,只和业务实体打交道,由业务实体自动生成sql语句,不用手写sql语句. 简单易用, 可维护性好. 隔离数据源,使得我们更换数据源时不用修改代码. ...

  5. 自研!东鸽用 Go 语言写了一个能够自动解析新闻网页的算法

    这是「进击的Coder」的第 593 篇技术分享 作者:韦世东 来源:NightTeam " 阅读本文大概需要 8 分钟. " 输入网页文本(不需要输入 xpath),自动结构化输 ...

  6. 爬虫智能解析库 Readability 和 Newspaper 的用法

    舆情爬虫是网络爬虫一个比较重要的分支,舆情爬虫往往需要爬虫工程师爬取几百几千个新闻站点.比如一个新闻页面我们需要爬取其标题.正文.时间.作者等信息,如果用传统的方式来实现,每一个站点都要配置非常多的规 ...

  7. python爬虫智能解析库详解

    文章很长 请耐心阅读 什么是爬虫 爬虫是做什么的?是帮助我们来快速获取有效信息的.然而做过爬虫的人都知道,解析是个麻烦事.比如一篇新闻吧,链接是这个: https://news.ifeng.com/c ...

  8. 快速了解日志概貌,详细解读13种日志模式解析算法

    云智慧 AIOps 社区是由云智慧发起,针对运维业务场景,提供算法.算力.数据集整体的服务体系及智能运维业务场景的解决方案交流社区.该社区致力于传播 AIOps 技术,旨在与各行业客户.用户.研究者和 ...

  9. 常用的AI人工智能算法库

    1. Libnabo libnabo 是一个快速为低维度空间提供K最近邻居算法库.它提供了一个干净的,传统的无标量类型无关的C ++模板API. 示例代码: #include "nabo/n ...

最新文章

  1. MooTools Class 使用、继承详解
  2. dell主板40针开机针脚_电脑主板各种接口的介绍最新版
  3. linux hiredis升级,Redis平滑升级
  4. mesh渲染到ui_在Unity中使用UGUI修改Mesh绘制几何图形
  5. AKKA Router路由
  6. ansys流固耦合分析与工程实例_ansys workbench 流固耦合教程
  7. C语言 FileStreaming fwritefread
  8. 聊一下C#开发者如何过渡到JAVA 开发者
  9. MYSQL 最大连接数设置
  10. 免签约即时到账支付接口 个人二维码收款系统源码【多种模式】
  11. go字符串转byte_go语言中int和byte转换方式
  12. VScode自动格式化代码减少build时的问题
  13. 个人网站音乐服务器,自己的私人音乐流媒体服务,这才是多少音乐者的梦寐以求的...
  14. 雅虎十四条:网站前端网页优化的14条原则
  15. 【转载】冗余与热备的概念区别
  16. Type-C蓝牙音箱单口可充可OTG方案
  17. 隐藏终端和暴露终端浅析
  18. 12306所有车次及时刻表的爬取中
  19. 【解决问题】413错误 413 Request Entity Too Large 接口返回413 报413nginx
  20. 计算机编程数学不好能学吗,高中数学学的不好,对学习计算机编程有影响吗?...

热门文章

  1. 2016河北省职称计算机考试试题及答案,2016河北省职称计算机考试操作题答案.doc...
  2. 视觉SLAM十四讲学习笔记-第六讲学习笔记总结(1)---非线性优化原理
  3. ROS2官网安装教程补充
  4. JAVA中的适配器应用_Java适配器模式详解和实际应用.md
  5. linux race window,java开发环境(QTrace)
  6. sql统计系统时间那一个月数量_关于BE00007图书借阅管理系统bug修复总结
  7. 职称计算机承诺书,职称申报承诺书范本
  8. 牛客 - 17968 - xor序列 - 线性基
  9. 【转载】前后端分离的思考与实践(二)
  10. cocos2dx 3.0研究(1)-- hello world程序