ruby爬虫程序
写爬虫这件事,爬虫Python 出镜率太高了,程序高到很多人忘了 Ruby 也能干这活。爬虫而且干得不差。程序我最早用 Ruby 抓数据是爬虫因为手上一个 Rails 项目需要定时同步外部商品信息,与其再起一个 Python 服务,程序不如直接在主项目里写个 rake task。爬虫结果一写就是程序三年,脚本至今还在跑。爬虫 核心依赖就两个: 先看个能跑的例子。假设要抓某图书网站的分类页,提取书名和价格: 这段代码的信息密度比 Python 版还高一点。HTTParty 的 但真实场景不会这么干净。我踩过最多的坑是编码。国内不少网站返回 GBK 页面,Nokogiri 默认按 UTF-8 解析,中文全变乱码。解决办法是在 判断 另一个问题是反爬。Ruby 这边没有 Scrapy 那种全家桶,中间件、限速、重试都得自己写。我的做法是封装一个 随机延时比固定延时有效,很多网站检测的是请求间隔的规律性。重试次数别设太高,三次够了,否则被封 IP 只是时间问题。 数据存哪儿?小规模直接写 CSV,Ruby 标准库自带,不用装 gem。大规模上 PostgreSQL,配合 并发方面,Ruby 的 GIL 让多线程在 CPU 密集场景下没用,但爬虫是 IO 密集,多线程照样能提速。用 说个真实教训。有次我写了个爬虫抓某论坛帖子,跑了一晚上,第二天发现数据库里全是重复数据。原因是我没做去重,翻页时网站返回了缓存页面。后来加了个 Ruby 爬虫适合什么场景?我的判断是:已经在用 Ruby 技术栈、抓取规模不大、需要快速出结果。如果你要抓百万级页面、需要分布式调度、或者团队更熟悉 Python 生态,那还是用 Scrapy。工具选型看上下文,没有银弹。 最后提一句法律边界。httparty 或 faraday 发请求,程序nokogiri 解析 HTML。爬虫安装没什么好说的程序,gem install httparty nokogiri 一行搞定。爬虫如果你用 Bundler,程序写进 Gemfile 更省事。爬虫require 'httparty' require 'nokogiri' url = 'https://example.com/books?cat=programming' response = HTTParty.get(url, headers: { 'User-Agent' => 'Mozilla/5.0' }) doc = Nokogiri::HTML(response.body) books = doc.css('.book-item').map do |item| { title: item.at_css('.title')&.text&.strip, price: item.at_css('.price')&.text&.strip } end puts books .get 直接返回对象,.body 拿原文;Nokogiri 的 css 选择器跟 jQuery 语法一致,at_css 取第一个匹配节点。注意那个 &.,Ruby 2.3 以后的安全导航运算符,节点不存在时返回 nil 而不是炸掉,爬虫里特别实用。Nokogiri::HTML 之前手动转码:body = response.body body = body.force_encoding('GBK').encode('UTF-8') if body.encoding.name == 'ASCII-8BIT' doc = Nokogiri::HTML(body) ASCII-8BIT 是因为 HTTParty 遇到未知编码时会标成二进制。这招不优雅,但管用。fetch 方法,内置随机延时和重试:def fetch(url, retries: 3) sleep(rand(1.0..3.0)) response = HTTParty.get(url, headers: { 'User-Agent' => '...' }, timeout: 10) raise "HTTP #{ response.code}" unless response.code == 200 response rescue => e retries -= 1 retry if retries > 0 puts "Failed: #{ url} - #{ e.message}" nil end sequel 或 activerecord。我有个项目抓了 40 万条数据,用 SQLite 存,查询慢得离谱,后来迁到 PG 才顺畅。别在存储上省事。Thread 开 5 到 10 个够了,再多容易触发目标站点的频率限制。更优雅的方案是 async gem 或者 concurrent-ruby 的线程池,不过对于大多数中小规模任务,手写线程池完全够用。url 字段的唯一索引,配合 INSERT ... ON CONFLICT DO NOTHING,问题解决。爬虫的去重逻辑比解析逻辑更重要,解析错了可以重跑,数据脏了清洗成本翻倍。robots.txt 要看,频率要控,别抓个人隐私数据。技术上能做的事和应该做的事是两码事。
- 随机阅读
- 搜索
-
- 友情链接
-