Gem the_scrap - 提取了个网页抓取的 Gem

hjleochen · 2014年08月19日 · 最后由 qq19621678 回复于 2019年04月03日 · 6936 次阅读
本帖已被管理员设置为精华贴

从之前的项目提取了个抓取的功能,稍微改了下放到 GitHub 上了。

说来惭愧学习 Ruby&Rails 差不多 9 年了(05 年开始应该,算业余爱好吧)还是第一次写 Gem。

这两个类用了挺久了,综合了自己的一些需求,满足个人大概 85% 以上的场景需求。

项目地址:

https://github.com/hjleochen/the_scrap

Why

网页数据的抓取最基本的工作流程为:

  1. 确定要抓取的起始 URL,如:https://ruby-china.org/topics
  2. 抓取列表信息,一般列表信息按照 tr,li,div,dd 等呈现,每个节点为一条记录,如:上述 URL 中的 CSS Selector 为:".topics .topic"
  3. 提取记录的相关信息,标题,作者,分类,详细页面的 URL 等。
  4. 抓取详细页面信息,一般列表只有部分信息,完整获取需要进入详细页面进行数据提取。
  5. 数据源有分页的情况还需要循环抓取多页信息。
  6. 数据加工。
  7. 数据入库或输出,排重处理等。

在处理以上任务是往往会遇到如下问题:

  1. 源 HTML 无法直接使用,需要进行一些处理
  2. 抓取的条目需要过滤无效数据。
  3. 需要对抓取的各种 URL 进行处理,如:链接或者图片往往不是完整的 URL,需要通过当前页面地址进行合并处理。
  4. 提取的数据需要进行特殊处理。还是 RubyChina 的例子比如帖子阅读次数:".info leader" 下的内容为: "· 618 次阅读",需要的只是:618
  5. 每个网站都有不同的分页机制,和分页 URL 的规则,处理起来相当麻烦。
  6. 输出过程往往需要将之前提取的单个信息组合成一个对象或者 Hash 等。

很久之前使用 Perl 进行数据抓取,由于个人 Perl 水平问题和语言上的一些限制,处理起来偏麻烦。后来用了很多 Ruby 写的框架都不是很满意 (Scrubyt 应该是我用过的比较不错的一个) 故根据实际需要慢慢总结形成了现在的方式:

  1. 定义列表和详细页面抓取规则
  2. 需要提取的信息和提取规则通过 Method missing 方式存入 Hash 中。
  3. 规则可以根据需要提取不同属性和数据,Link 的 href 和 IMG 的 src 自动进行 URI.join(current_url) 处理
  4. 实现列表多个节点的 Join 或者返回 Array,如 tags。
  5. 实现多种分页方式支持。
  6. 自动通过抓取列表数据取得的详细页面地址抓取详细信息,并合并到同一个结果记录中。
  7. 抓取的结果为一个 Hash,适当定义名称可以直接使用各种 ORMapping 实现进行入库,无需重新组装。
  8. 使用 Ruby 的 lambda 实现 Html 处理、数据过滤、结果处理等,自定义程度和适应性有所提高 (以上内容属于自我感觉良好,请自动忽略)。

之前写 READMD.md 的时候就觉得这么简单的两个类写清楚还挺麻烦的,一直没写完整。 听从 @huacnlee 的意见完善了下文档。

哟! 👍

基于 Nokogiri 的网页数据抓取的框架

建议楼主修改帖子详细介绍这个 Gem 的用户优点,GitHub 上面的 README 文件也是不仔细看示例代码,还不知道这东西具体是解决什么问题的。

然后此帖就可以加精华了

很不错哇,@hjleochen 你人在哪里呢?

另推荐两个其他语言版本的爬虫开源框架: (Java) WebMagic: https://github.com/code4craft/webmagic (Python) Scrapy: https://github.com/scrapy/scrapy

@huacnlee 是的,确实没写明白,多谢。主要之前自己没想好怎么写。

@caojunvincent

我在福州呢,在这么个三四线城市基本没有公司用 Ruby,Rails 的,也没听说什么人在用,半年前我发了个招聘信息,到目前没有一个投递。

所以这么多年来感觉好孤独啊,呵呵。。。(刚刚特意去博客数据库翻了一下历史,中间拉过几个朋友做 Rails 后来他们都放弃了,真是很孤独)

Scrapy 之前听说过,了解不深不发表意见,主要是对于 Python 的个人喜好问题。 WebMagic 我刚刚大概看了一下,想法应该是差不多的,不过似乎不是很完整支持我遇到的情况(当然可能是我没深入了解)

鼎力支持,后面打算使用下。

赞!! 很久以前想过做这么一个东西..!! 有空研究下。

8 楼 已删除
9 楼 已删除
10 楼 已删除
11 楼 已删除

支持一个

很不错呀,赞一个

支持啊,我也做过类似需求的。有用 ruby 写过,有用 php 写过,一直没总结出来比较通用的。有空研究研究。

如果爬虫没加上多线程,实际的使用价值不大。

ruby 现在有做爬虫的产业么?

支持一下

mark 一下,哈哈哈哈哈

怎么是这样回复

#4 楼 @hjleochen 楼主你好,我也在福州哦~好巧合

请问你是怎么处理目标网站更新的呢?

支不支持 session

有谁会爬取或者渗透网站会员登录信息手机号和姓名。你有技术,我有需求诚心合作 Q19621678

需要 登录 后方可回复, 如果你还没有账号请 注册新账号