ruby 爬虫 一

目录
  1. kimurai
    1. 实操
      1. 1.安装
      2. 2.创建项目 demo
      3. 3.创建 spider
      4. 4.修改 spider
        1. results.json
      5. 5.application_spider.rb
      6. 6.运行

​ 拖延了半个多月,把之前写的东西整理一下发现,好多内容都在脑子里,没有形成转化后的内容,所以,吃过晚饭就决定写完在睡觉。

Time.now.to_s => "2018-10-30 20:29:36 +0800"

​ 印象中,大多数人做爬虫第一个想到的肯定是 python,“python 解决方案多,代码简洁,容易上手…”,blah…blah

​ 事实上我也写 python,但是强制缩进这点让我很伤脑筋,没用 ruby 之前,我觉得 python 可能是我做 java 以来最优雅的语言。直到我用 ruby。

10.times do |i|
puts "I Love Ruby!!"
end
=>
"I Love Ruby!!"
"I Love Ruby!!"
"I Love Ruby!!"
"I Love Ruby!!"
"I Love Ruby!!"
"I Love Ruby!!"
"I Love Ruby!!"
"I Love Ruby!!"
"I Love Ruby!!"
"I Love Ruby!!"

​ 废话不多说。

​ 为什么选择用 ruby,而不用 python 呢?

​ 不为别的,就是顺手而已。

kimurai

Kimurai 是一个用 Ruby 实现的现代网络爬虫框架,和 Headless Chromium / FirefoxPhantomJS 一样开箱即用,并且能够模拟**“用户”**访问抓取 javascript 交互的网站。

Kimurai 基于 CapybaraNokogir gems,所以你不必学习新的东西。

实操

1.安装

gem install kimurai

使用chromiumdriverphantomJS需另外安装。

2.创建项目 demo

kimurai 提供了像 rails new project 这样的命令式创建项目。

kimurai generate project demo

等待命令执行完成会生成如下结构

|demo
|config #用于存放全局配置
|application.rb #全局配置
|automaiton.yml #用于配置浏览器和部署
|schedule.rb #支持定时任务
|db #数据库文件?
|helpers #辅助方法
|lib #插件
|log #日志
|pipelines
|spiders #爬虫存放目录
|tmp #缓存文件

3.创建 spider

kimurai generate spider test_spider

#demo/spiders/test_spider.rb
class TestSpider < ApplicationSpider
@name = "test_spider"
@start_urls = []
@config = {}

def parse(response, url:, data: {})
end
end

4.修改 spider

class TestSpider < ApplicationSpider
@name = "test_spider"
@start_urls = ["https://baike.pcbaby.com.cn"]

def parse(response, url:, data: {})
items = {}
items[:links] = []
response.xpath("//div[@class='baike-th main']").each do |row|
logger.info row.to_s
items[:links] << {
title: row.css("/a").text.squish,
url: "https:#{row.css("/a").first["href"]}"
}
end

save_to "results.json", items, format: :pretty_json
end
end
results.json
[
{
"links": [
{
"title": "备孕百科",
"url": "https://baike.pcbaby.com.cn/yunqian.html"
},
{
"title": "孕期百科",
"url": "https://baike.pcbaby.com.cn/yunqi.html"
},
{
"title": "分娩百科",
"url": "https://baike.pcbaby.com.cn/fenmian.html"
},
{
"title": "月子百科",
"url": "https://baike.pcbaby.com.cn/yuezi.html"
},
{
"title": "新生儿百科",
"url": "https://baike.pcbaby.com.cn/xinshenger.html"
},
{
"title": "0-1岁百科",
"url": "https://baike.pcbaby.com.cn/yinger.html"
},
{
"title": "1-3岁百科",
"url": "https://baike.pcbaby.com.cn/youer.html"
},
{
"title": "3-6岁百科",
"url": "https://baike.pcbaby.com.cn/xuelingqian.html"
},
{
"title": "用品百科",
"url": "https://baike.pcbaby.com.cn/yongpin.html"
},
{
"title": "美食百科",
"url": "https://baike.pcbaby.com.cn/meishi.html"
},
{
"title": "生活百科",
"url": "https://baike.pcbaby.com.cn/shenghuo.html"
}
],
"position": 1
}
]

5.application_spider.rb

# ApplicationSpider is a default base spider class. You can set here
# default settings for all spiders inherited from ApplicationSpider.
# To generate a new spider, run: `$ kimurai generate spider spider_name`
require 'net/http'
require 'kimurai'
class ApplicationSpider < Kimurai::Base
include ApplicationHelper

@engine = :selenium_chrome
USER_AGENTS = []

# PROXIES = ["127.0.0.1:1086:socks5"]

@config = {
user_agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
skip_request_errors: [{ error: RuntimeError, message: "404 => Net::HTTPNotFound" }],
retry_request_errors: [Net::ReadTimeout],
restart_if: {
},
before_request: {
delay: 4..7
}
}
end

6.运行

bundle exec kimurai runner -j 3

可以依次运行多个爬虫。

按照以上步骤可以运行示例中的代码。

更多细节配置可以查看 kimurai

26.1k