人人争说大数据,我先做个小爬虫。
哪家工具强?
先 google,再翻书,github 里探一探,论坛、知乎 Q 群走一遭
结论:python 风头劲,ruby 少人问。
不服!
要想爬,先上路。
ruby 社区里的 http 牌老司机可真不少,DSL 手法个个好,用了就别想跑
总的来讲,这些库封装了 http 协议的诸多功能,诸如:form parameters, file uploads and custom body entities、gzip、Basic Authentication natively、timeout、redirect、cache etc.
可惜 http client 生来只认 http,不识 html。多用于做 API 的客户端,或者 json 爬虫,譬如:
不识 html? 不要紧,老司机给你造。
nokogiri 神器在手,百万网页任你爬,不但如此,你还可以在锯子上玩各种花式爬:
开着 http client 上了路,拿出锯子滤信息,美女照片哗哗哗...停!我要和美女打个招呼
要想和美女互动,form 这个码头必须拜
Mechanize automatically stores and sends cookies, follows redirects, and can follow links and submit forms
信息已发送,美女不回复...why?
你可真是老司机,现在是啥年代,开一辆上世纪的老奔驰(服务端渲染)就想泡到妞?现在车上不装个 js 平板(客户端渲染),你也好意思上路?
javascript 是个棘手的问题,因为它不是 html 这类文本(常),而是代码(变)。然而爬虫只吃文本,所以必须先要想法将代码执行,变成文本。好比,你要吃包子,你妈拿给你一包面粉,一块肉,一个菜谱,一口锅,来,自己造。
类似的困难在 WEB 界面自动化测试中也存在,selenium 是解决这类问题的一个 test suit,其原理是:"当浏览器启动时,向其中注入 javascript,从而使用这些 js 来驱动浏览器中的 AUT(Application Under Test)..." 嗯,听起来好复杂,而且还要安装一个真实的浏览器! (实质上,就是 selenium 为浏览器提供一个特别扩展或插件,从而允许 selenium 的测试脚本可以对浏览器的内部对象进行操纵)
除了测试场景,近年来兴起的 spa 应用同样面临这类问题,即 google 等搜索引擎无法收录这类客户端渲染网页。咋办,有老司机提出:开发一个 headless browser,当 google 等来访问时,就将请求重定向给它,由其生成静态页面后,再返还给 google.
headless browser,所谓无头浏览器,就是不要脸:)。就是网页的渲染只在内存中进行,而并不输出到输出设备,譬如屏幕(所以你可以按需换头,譬如输出为 html 文件,屏幕截图等等)。
phantomjs 就是这样一个专供程序员使用的不要脸浏览器,其实质上是基于 WebKit 引擎的一组 JavaScript API 封装,从而方便程序员们去程序化操纵浏览器中的各类对象
以上的解决方案都是典型的太监方案。不过太监热情太高,终于能感动皇帝。
假如能通过调用浏览器原生 API 以直接驱动浏览器,岂非更好!
WebDriver 正是这样一个项目:它通过原生浏览器支持以直接控制和操纵浏览器,并且可利用操作系统级的调用模拟用户输入。重要的是,它获得了来自浏览器厂商的原生支持(WebDriver 提供 FirefoxDriver、InternetExplorerDriver、OperaDriver、ChromeDriver 等以及 AndroidDriver、IPhoneDriver 等移动应用测试)。
实质上,WebDriver 更类似于一个浏览器无关性 API 集(类似于 ODBC 或 DOM),也不与任何测试框架进行绑定,事实上今天它已成长为一项 w3c 标准 https://w3c.github.io/webdriver/webdriver-spec.html
终于,Selenium 和 WebDriver 两个项目合并了,即 Selenium 2,它既支持 Selenium API,又支持 WebDriver API,集 api、工具、环境于一体。 Selenium 本身虽然是 java 编写,但它提供各种语言绑定,譬如 Selenium-WebDrive for ruby
换句话,老司机们不用换车,也能使用 ruby + selenium2 搞定使用 js 客户端渲染的网页了。
然而,这还不够。
watir 是和 selenium 类似的工具,它早期使用 IE-only implementation(本质上是一个封装了 MS COM(Component Object Model) 接口的 Ruby 类库,IE 的 COM 接口允许程序访问 IE 浏览器的文档对象模型等)。 随着 WebDriver 的兴起,出现了 Watir-WebDriver 项目,是完全基于 Ruby 语言开发的 WebDriver API 封装(不是 Selenium-WebDrive for ruby binds),最终,2016 年 8 月 Watir 和 Watir-WebDriver 两项目彻底合并,形成了足以对抗 selenium 的另一个完整生态平台。
why watir?去看看 watir 的示例...
老司机最爱 ruby,车慢不要紧,驾车姿势要酷炫!
https://github.com/teamcapybara/capybara
最后,capybara,一个用户接受度测试框架(Acceptance test framework),同样使用 ruby 开发,rails 应用界面测试的标配,同样必须支持 browser automation。当前它支持如下后台实现:
提一下这个,似乎也不错,支持 jquery query interface :)
绕了一大圈,我的小爬虫在哪呢?
等我定一个小目标先
烂尾起高楼,待续...