使用Ruby为使用Javascript加载的数据刮取URL

时间:2014-11-04 21:45:27

标签: ruby web-scraping nokogiri mechanize scrape

我正在尝试使用Ruby脚本抓取此页面以租用listings。我尝试过的一些方法不成功的是使用Nokogiri和Mechanize但是浏览器只加载了14个列表,其余的是通过我认为是嵌入式javascript加载的。我简要地看了rkelly但没有运气阅读可用的课程。

这是我到目前为止所做的:

##First Solution only returned 14 Results
require 'mechanize'
require 'nokogiri'
require 'open-uri'

url = "http://streeteasy.com/for-rent/soho/"

listings = Nokogiri::HTML(open(url))

# agent = Mechanize.new
# agent.get(url)
# pp signin_page = agent.page.link_with(:text => 'Sign In').click
# # pp signin_page.forms

listing_sorted = listings.css('.item_inner')

object = listing_sorted.map do |listing|
    object = {}
        object[:address] = listing.css("div.details_title a").first.inner_html
        object[:price] = listing.css("span.price").inner_html.gsub(/[^0-9.]/, '')
    object
end

sorted_object = object.sort! { |a,b| a[:price].to_i <=> b[:price].to_i }.last 20


puts @json_object = sorted_object.to_json
puts "There are #{sorted_object.length} listings"

还有一个xls文件可以导出列表,但是你需要登录并且登录是一个javascript模式,所以我真的在这里找到了一个难点。什么是解决这个问题的最佳方法。

2 个答案:

答案 0 :(得分:1)

我设法做的是使用Watir,一个用于Selenium的Ruby Wrapper在浏览器中打开页面,然后将加载的html传递给Nokogiri进行解析。

答案 1 :(得分:0)

您可以将http://streeteasy.com/for-rent/soho?page=n的链接编号为n,从1到最大页码。然后,您可以从网页收集所有列表。