Gem Nokogiri 如何抓取原网页通过 js 或者 ajax 加载至网页的内容

xiaogui · 2013年09月12日 · 最后由 lakuy 回复于 2015年06月22日 · 7863 次阅读

在试着用 Nokogiri 抓取一网页,代码类似下面。然后在调试中,发现 Nokogiri 抓取的页面内容与浏览器中显示的不一致。就是原网页通过 js 或者 ajax 加载至网页的一些内容 Nokogiri 抓不到,不知道大家是否碰到过这样的问题,以及如何解决掉的?

agent = Mechanize.new
agent.user_agent_alias = 'Mac Safari'

detail_page_url = 'http://www.example.com'
doc = Nokogiri::HTML.parse(agent.get(detail_page_url).body, nil, 'utf-8')

如果需要的內容是異步加載的,就直接抓它 ajax 請求的地址。

你搞错了一件事情,Nokogiri 是 HTML/XML 解析器,不是网页抓取器。在你的代码中,Mechanize 是真正负责抓取目标网页的东东。

如果你要获取通过 AJAX 加载的内容,那你就要分析目标地址的 AJAX 请求的 endpoint 是哪里,然后模拟这一请求去拿到内容,这期间可能还要考虑 session/cookie 的状态,因为 AJAX 请求有可能是依赖保存在其中的某些数据的。Mechanize 可以做到这一点,因为它设计的时候就考虑到了管理 session/cookie 的状态,所以你应该去看看 Mechanize 的文档寻求答案。

一旦你完成了请求模拟,Nokogiri 就可以做剩下的事儿了——解析你拿到的 HTML。

#2 楼 @nightire 这么说下,清楚多了,感谢。

#3 楼 @xiaogui 其实可以用一些像 selenium 一样的东东来像浏览器一样 run js,而不用自己去解析 js 中的 ajax。社区里黄亿华先生写的通用爬虫 https://github.com/code4craft/webmagic

#4 楼 @wujian_hit 感谢,学习下去。 也感谢 #1 楼 @yesmeck

可以用一个模拟浏览器,进行事件触发,java 方面类似于 htmlunit 这种东西

Watir-WebDriver 有一篇相关的博客 http://betacs.pro/blog/2013/05/05/jitr/

我也碰到了这个问题,不过我这里抓取的信息是在页面加在完成以后才显示在页面的。不知道该如何获取

处理了一个 js 生成的 login frame 借鉴https://gist.github.com/zealot128/6524687 capybara+ poltergeist(PhantomJS)

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