场景:
我正在用爬虫做一些HTML信息提取。现在,大多数提取规则都是硬编码的(不是标签之类的,而是循环、嵌套元素等等)。
例如,一项共同任务如下:
我目前的做法是:
与一般解析器相比,所有这些硬编码(列名、表ids等除外)给我带来了好处或易于实现,效率也比一般解析器高,但是,它的可配置性较低,目标网站中的一些更改迫使我处理代码,这使得委派任务变得更加困难。
问题
是否有任何语言(最好有一个可用的java实现)允许一致地定义这样的提取规则?我在某些任务中使用css风格的选择器,但其他任务并不那么简单,所以我最好的猜测是,一定有一些扩展,非程序员维护人员可以根据需要添加/修改规则。
如果有这样的答案的话,我会接受一个基于nutch的答案,因为我们正在研究如何将爬虫迁移到nutch,尽管我更喜欢一个通用的java解决方案。
我正在考虑编写一个Parser生成器,并创建我自己的一组规则,允许用户/维护人员生成解析器,但这真的像无缘无故地重新发明轮子。
发布于 2019-11-18 13:20:41
我正在做一些类似的事情--不完全是你在寻找什么,但也许你能得到一些想法。
首先是爬行部分:我在Python3.7上使用刮痕。对于我的项目,这带来了优势,它非常灵活,易于爬行框架的建设。例如请求之间的延迟、HTTP头语言等,大多数情况下都可以配置。
对于信息提取部分和规则:在我的上一代爬虫中(我现在正在开发第3代,第2代还在运行,但不是可伸缩的),我已经使用JSON文件为每个页面输入了XPath / CSS规则。因此,在启动我的爬虫时,我已经为当前正在爬行的一个特定页面加载了JSON文件,并加载了一个通用爬虫,知道了基于加载的JSON文件提取什么。
这种方法不易扩展,因为每个域必须创建一个配置文件。目前,我仍然在使用Scrapy,有700个域名的开始列表,爬虫现在只负责下载整个网站作为HTML文件。这些文件由shell脚本存储在tar存档中。之后,Python脚本将遍历shell脚本的所有成员,并分析我要提取的信息的内容。
在这里,正如您所说的,这有点像重新发明轮子或者为现有的库编写一个包装器。
在Python中,可以使用BeautifulSoup删除所有标记,如脚本和样式等,然后可以提取所有文本。或者,您首先只关注表,将所有表提取到数据块中,然后可以使用regex或类似的方法进行分析。有像DragNet这样的库来删除样板。并且有一些关于如何提取表结构信息的具体方法。
https://stackoverflow.com/questions/56723719
复制相似问题