Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在Mechanize中进行迭代以抓取页面_Ruby_Web Crawler_Nokogiri_Mechanize - Fatal编程技术网

Ruby 在Mechanize中进行迭代以抓取页面

Ruby 在Mechanize中进行迭代以抓取页面,ruby,web-crawler,nokogiri,mechanize,Ruby,Web Crawler,Nokogiri,Mechanize,我希望使用Mechanize自动化一个过程来抓取一些网页并保存信息 这一页是 我希望遍历ulid=“looks”并在该迭代中单击looks中的每个用户。所以元素看起来像这样: <a href="/luciamouet" data-page-track="user name click" data-track="user name click | byline" target="_blank" title="Lucia Mouet">Lucia M.</a> 您拥有构建详

我希望使用Mechanize自动化一个过程来抓取一些网页并保存信息

这一页是

我希望遍历
ulid=“looks”
并在该迭代中单击looks中的每个用户。所以元素看起来像这样:

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

您拥有构建详细页面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
=>


注意:为了得到
Mechanize::Page
响应,我使用了
#pluggable_解析器。通常你不需要它,但他们没有正确设置内容类型。

与其像@radubogdan建议的那样乱用base+path,不如使用page.uri:

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

除非您使用的是非常旧的Ruby版本,否则您不需要
要求“rubygems”
。您不需要
要求“nokogiri”
,因为它已经是Mechanize的依赖项。另外,您可能不需要
要求“openuri”
,因为Mechanize提供了自己的获取页面的机制。是的,这对我来说很清楚,但我发现初学者很困惑。很好,你提出了这个,但是你可以在一个注释中这样做。我可以在一个注释中放5行代码?那会很混乱。
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
page.search('#looks h1 a').each do |a|
  url = page.uri.merge a[:href]
  page2 = agent.get url
  puts page2.title
end