跳转到主要内容

检测并分类网页上的分页链接

项目描述

PyPI Version Build Status Code Coverage

Autopager 是一个 Python 包,用于检测和分类分页链接。

许可协议是 MIT。

安装

使用 pip 安装 autopager

pip install autopager

Autopager 依赖于一些其他包,如 lxmlpython-crfsuite;它将尝试自动安装它们,但如果安装失败,您可能需要查阅这些包的安装文档。

Autopager 在 Python 3.6+ 上运行。

使用方法

autopager.urls 函数返回分页 URL 列表

>>> import autopager
>>> import requests
>>> autopager.urls(requests.get('http://my-url.org'))
['http://my-url.org/page/1', 'http://my-url.org/page/3', 'http://my-url.org/page/4']

autopager.select 函数返回所有分页 <a> 元素作为 parsel.SelectorList(与 scrapy response.css / response.xpath 方法返回的对象相同)。

autopager.extract 函数返回一个包含(link_type, link)元组的列表,其中 link_type 是“PAGE”、“PREV”、“NEXT”之一,link 是一个 parsel.Selector 实例。

这些函数接受 HTML 页面内容(作为 Unicode 字符串)、requests Response 或 scrapy Response 作为第一个参数。

默认情况下,使用预构建的提取模型。如果您想使用自己的模型,请使用 autopager.AutoPager 类;它具有相同的方法,但允许提供模型路径或模型本身

>>> import autopager
>>> pager = autopager.AutoPager('my_model.crf')
>>> pager.urls(html)

如果您从git克隆了仓库,也必须使用AutoPager类;预构建模型仅在pypi发行版中可用。

检测质量

网页可以非常不同;autopager试图为所有网站工作,但一些错误是不可避免的。作为一个非常粗略的估计,预期它在从1M国际最流行的网站(根据Alexa Top)采样的网站上工作的正确率约为 9/10 的分页器。

贡献

工作原理

Autopager使用机器学习来检测分页器。它将HTML元素分类为4个类别

  • PREV - 前一页链接

  • PAGE - 指向特定页面的链接

  • NEXT - 下一页链接

  • OTHER - 不是分页链接

为此,它使用诸如链接文本、CSS类名、URL部分和左右上下文等特征。使用CRF模型进行学习。

网页表示为<a>元素的序列。只有具有非空href属性的<a>元素才包含在此序列中。

另请参阅:https://github.com/TeamHG-Memex/autopager/blob/master/notebooks/Training.ipynb

训练数据

数据存储在autopager/data中。原始HTML源代码在autopager/data/html文件夹中。注释存储在autopager/data/data.csv文件中;元素以CSS选择器形式存储。

训练数据用5个非空类别注释

  • PREV - 前一页链接

  • PAGE - 指向特定页面的链接

  • NEXT - 下一页链接

  • LAST - 不是单纯数字的“到最后一页”链接

  • FIRST - 不是“1”数字的“到第一页”链接

由于LAST和FIRST相对较少,它们被转换为PAGE,由分页模型转换。在注释期间使用这些类别,未来在更多训练示例的情况下,模型可以预测它们。

要将新页面添加到训练数据中,将其保存为html文件,并在data.csv文件中添加一行。使用http://selectorgadget.com/扩展名获取CSS选择器很有帮助。

如果您的CSS选择器没有直接返回<a>元素(在使用SelectorGadget时偶尔会选择<a>元素的父母或孩子),请不要担心。如果一个选择本身不是<a>元素,则尝试父<a>元素和子<a>元素,这通常是想得到的结果,因为<a>标签在有效的网站上不是嵌套的。

在使用SelectorGadget时,请特别注意不要选择除分页元素以外的任何内容。始终检查SelectorGadget显示的元素数量,并将其与您想要选择的元素数量进行比较。

一些网站在渲染后会更改它们的DOM。这很少影响分页器元素,但有时会发生这种情况。为了避免这种情况,而不是使用“另存为..”浏览器菜单选项下载HTML文件,最好使用开发者工具中的“复制外部HTML”或使用无头浏览器(例如Splash)渲染HTML。如果您这样做,请确保将UTF-8编码放入data.csv中,无论HTTP头或<meta>标签中定义的页面编码如何。


define hyperiongray

更改

0.3.1 (2020-09-09)

  • 修复分发;

  • setup.py中不再需要backports.csv

0.3 (2020-09-09)

  • 最低Python要求现在是3.6。较旧版本可能仍然可以工作,但它们不再在CI上进行测试。

  • 内存使用有限,以避免在异常页面上的峰值。

0.2 (2016-04-26)

  • 更多训练示例;

  • 修复Scrapy < 1.1的支持;

  • 修复了text-before和text-after特征中的bug。

0.1 (2016-03-15)

初始发布

支持者