使用Nokogiri抓取使用Javascript的网站

时间:2018-12-10 19:43:53

标签: javascript ruby web-scraping nokogiri

对于一个班级的项目,我正在尝试抓取一个网站。在此网站上,

https://disneyworld.disney.go.com/attractions/

我正在尝试提取所有引诱URL。例如,对于列表中的第一个景点,我正在尝试获取以下网址:

https://disneyworld.disney.go.com/attractions/epcot/mission-space-advanced-training-lab/

由于该网站使用Javascript,因此我很难使用Nokogiri和选择器来获取网址。类名似乎不起作用,我的尝试返回的URL与尝试获取的URL不同。我最好的是:

index_page.css("ul").children.css("li").each do |container|

但是容器返回错误的URL。有人建议我使用宝石娃娃,但我和我的导师都无法弄清楚如何使用它。

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

我假设您正在使用open-uri之类的内容加载页面。该网站有点奇怪,因为对https://disneyworld.disney.go.com/attractions/的第一个请求未返回景点列表。该列表由后续的XMLHttpRequest返回到相同的URL。因此,您可能根本看不到内容中的结果。

您可以使用mechanize之类的宝石来模拟XMLHttpRequest(并做很多其他事情)。这是一个获取这些吸引力网址的工作示例:

require 'mechanize'

url = 'https://disneyworld.disney.go.com/attractions/'
mech = Mechanize.new;

# make an XMLHttpRequest to get the page (returns attraction list)
mech.get(url, [], nil, { 'x-requested-with' => 'XMLHttpRequest' }) do |page|
  page.search('ul.finderList li').each do |attraction|
    name = attraction.at_css('h2.cardName').content
    link = attraction.at_css('a')['href']
    puts "#{name}: #{link}"
  end
end

page.search方法返回一个Nokogiri节点集,因此您可以使用Nokogiri方法进行进一步处理。

相关问题