Hegwin.Me

南朝四百八十寺,多少楼台烟雨中。

抓取JS延迟加载的页面内容

Catch HTML elements with delayed loading

我最近自己想做一个小网站(WoW相关),里面的数据需要从别人的公共数据库去取,但是作为大陆的战网用户,去跟暴雪申请API权限非常麻烦,于是打算直接从别人现成的数据库网页爬过来。

不就是HTML爬虫吗?于是我按部就班用open-uri和nokogiri,结果发现悲剧了!

require 'open-uri'
require 'nokogori'

url = "http://db.178.com/wow/cn/battlepets.html#battlepets:50"
doc = Nokogiri::HTML(open(url))

doc.css("div.list-table")
=> []  竟然是空的,可是我明明浏览器里打开是有的

后来仔细看了下那个页面,表格里的内容原先是存储在JS里面的,只有等JS运行完毕,内容才会显示出来。而URI这里的open,并不会运行js,所以抓去不到对应的内容。

巧的是,刚好群里有个人问,为啥他用的watir 4.x的时候,会提示没有Watir::IE。

灵感不就这么来了么,用Watir::Browser模拟人去打开这个页面,然后把这个页面撸一遍(这个动词真好用),延迟加载的内容也出来了不是,再去解析就OK了嘛~

require 'watir'
require 'nokogiri'

ff = Watir::Brower.new
ff.goto url

ff.div(:id, "footer").wd.location_once_scrolled_into_view
# location_once_scrolled_into_view 是Selenium::WebDriver::Element的一个实例方法,从名字可以看出他是滑动到这个元素的位置
# 这里我们是用它一撸到底,这样子即使是那种需要滑某处才加载的内容也能顺利显示了

doc = Nokogiri::HTML(ff.html)
# 然后按正常情况解析就好
< Back