在抓取时从youtube重复结果

时间:2017-09-21 11:15:33

标签: ruby web-crawler

我正在尝试从Google获取结果并将其保存到文件中。但结果却在重复。 此外,当我将它们保存到文件时,只有最后一个链接打印到文件。

require 'rubygems'
require 'mechanize'

agent = Mechanize.new
page = agent.get('http://www.google.com/videohp')

google_form = page.form('f')
google_form.q = 'ruby'

page = agent.submit(google_form, google_form.buttons.first)
linky = page.links
for link in linky do
  if link.href.to_s =~/url.q/
    str=link.href.to_s
    strList=str.split(%r{=|&})
    $url=strList[1].gsub("h%3Fv%3D", "h?v=")
    $heading = link.text
    $res = $url
    if ($url.to_s.include? "webcache")
      next
    elsif ($url.to_s.include? "channel")
      next
    end
    puts $res
  end
end

for link in linky do
  File.open("aaa.htm", 'w') { |file| file.write($res) }
end

3 个答案:

答案 0 :(得分:0)

看起来你真的不懂Ruby。

请不要使用全局变量,除非你真的需要它们 - 在这种情况下你不是,它不是PHP。简单的分配就足够了。 :)

要遍历集合,请使用专用的#each方法。在您的情况下,您希望过滤链接集合并留下符合您需求的链接valid_links = links.filter {| link | ......}。

如果他们不符合您的需求,则返回false,如果他们符合您的陈述,则返回true。

File.open中,您需要浏览File.open块内的集合(您将拥有valid_links)。

答案 1 :(得分:0)

这真的有两个问题,很明显你刚刚开始使用Ruby-你会在练习中变得更好但是这将有助于继续阅读语言的基础知识,这看起来像有点像用Ruby编写的PHP。

首先,链接很可能会多次显示,因为它们在页面中不止一次出现。你没有做任何事情来抓住它。

其次你有一个全局变量(这些往往会导致问题,只有在你找不到替代方案时才能使用它),你将每个URL放入其中,但每次这样做时,你都会覆盖什么你以前有过。因此,每次你去$res = $url时,你都会覆盖$res中最后$url所有的内容。

如果您创建了一个数组而不是单个值$res(它也可以是一个局部变量),那么您可以使用myArray.push(url)向其添加每个新URL。

如果您拥有阵列中的所有网址,则可以使用myArray.uniq删除重复项,然后再将其写入文件。

答案 2 :(得分:0)

require 'rubygems'
require 'mechanize'

agent = Mechanize.new
page = agent.get('http://www.google.com/videohp')

google_form = page.form('f')
google_form.q = 'ruby'

page = agent.submit(google_form, google_form.buttons.first)
linky = page.links
for link in linky do
  if link.href.to_s =~/url.q/
    str=link.href.to_s
    strList=str.split(%r{=|&})
    $url=strList[1].gsub("h%3Fv%3D", "h?v=")
    $heading = link.text
    $res = $url
    if ($url.to_s.include? "webcache")
      next
    elsif ($url.to_s.include? "channel")
      next
    end
    puts $res
    File.open("aaa.htm", 'w') { |file| file.write($res) }
  end
end