2015-04-16 49 views
0

我希望使用机械抓取某些网页和保存信息来自动化一个进程。迭代机械化抓取页面

该页面是 look book north america

我希望遍历ul id="looks",并在该迭代中单击外观中的每个用户。所以元素看起来是这样的:

<a href="/luciamouet" data-page-track="user name click" data-track="user name click | byline" target="_blank" title="Lucia Mouet">Lucia M.</a> 

我希望去每个用户和存储该页面的一些信息。

这是我迄今为止,但我难倒如何遍历和跟随链接为每个用户:

require 'rubygems' 
require 'mechanize' 
require 'nokogiri' 
require 'open-uri' 

agent = Mechanize.new 

page = agent.get('http://lookbook.nu/north-america') 

looks = page.parser.css('#looks p') 

looks.each do |x| 
    puts x 
end 
+0

除非您使用的是很旧版本的Ruby,你不需要'要求' rubygems''。你不需要'需要'nokogiri',因为它已经是Mechanize的依赖。另外,您可能不需要'require'open-uri'',因为Mechanize提供了自己的抓取页面的机制。 –

回答

1

你什么都有了构建详细信息页面的URL。抓住相对URL(我将称之为路径)附加基本URL并发出新请求。

require 'mechanize' 

agent = Mechanize.new 
agent.pluggable_parser.default = Mechanize::Page 

base = 'http://lookbook.nu' 
page = agent.get(base + '/north-america') 

detail_pages = page.search("//div[contains(@class, 'look_meta_container')]/p/a[1]/@href").map(&:text) 
# ["/user/1069907-Veronica-P", "/elliott_alexzander", "/neno", "/skirtsofurban", "/tovogueorbust", "/dthutt", "/ryapie", "/lovebetweentheracks", "/lonleyboy", "/bobbyraffin", "/tsangtastic", "/user/737385-Katia-H"] 

detail_pages.each do |path| 
    page = agent.get(base + path) 

    name = page.search("//div[@id='userheader']//h1/a").text 
    fans = page.search("//span[contains(text(), 'Fans')]/../span[1]").text 

    puts name + " have " + fans + " fans" 
end 

=>

Veronica P have 26,044 fans 
Elliott Alexzander have 3,409 fans 
Neno Neno have 15,304 fans 
Laura P have 975 fans 
Alexandra G. have 620 fans 
Dayeanne Hutton have 336 fans 
Mariah Alysz have 288 fans 
Lina Dinh have 11,675 fans 
Talal Amine have 882 fans 
Bobby Raffin have 72,469 fans 
Jenny Tsang have 8,909 fans 
Katia H. have 282 fans 

注:我为了得到一个Mechanize::Page响应使用#pluggable_parser.default。通常你不需要,但他们没有正确设置内容类型。

1

,而不是与基地+路径勾搭由@radubogdan建议,只需使用page.uri:

page.search('#looks h1 a').each do |a| 
    url = page.uri.merge a[:href] 
    page2 = agent.get url 
    puts page2.title 
end 
+0

是的,这对我来说很清楚,但我觉得这对初学者来说很困惑。好的事情你提出来,但你可以在评论中做到这一点。 – radubogdan

+1

我可以在评论中放5行代码?那本来会很麻烦。 – pguardiario