2017-09-21 8 views
0

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 
+1

'file.write ($ res)'는 항상'$ res'의 값을 파일에 씁니다. 대신에'link'를 사용하여 무언가를하기를 원할 것입니다. 게다가'for' 대신'each'를 사용하고 전역 변수 ('$'로 시작하는 변수)를 피해야합니다. – Stefan

+0

감사합니다. 스탄 나는 그들을 바로 잡을 것입니다. –

답변

0

이것은 정말로 두 가지 질문이며 방금 Ruby를 시작한 것이 분명합니다. 연습을하면 더 좋아 지겠지만 언어의 기본 사항을 계속 읽는 데 도움이됩니다.이 글은 PHP와 비슷합니다. 루비.

첫 번째 링크는 페이지에 두 번 이상 나타나기 때문에 링크가 여러 번 나타날 가능성이 큽니다. 당신은 그것을 잡으려고 아무것도하지 않습니다.

두 번째로 각 변수를 넣는 전역 변수 (문제가 발생하기 쉽고 대안을 찾을 수없는 경우에만 사용해야 함)가 있지만 그럴 때마다 무엇을 덮어 씁니 까? 전에 있었어. 그래서 $res = $url이 올 때마다 $res에 마지막으로 $url이 있었는지 덮어 쓰게됩니다.

단일 값 $res (로컬 변수 일 수도 있음) 대신 배열을 만든 경우 myArray.push(url)을 사용하여 각 새 URL을 추가 할 수 있습니다.

배열에있는 모든 URL을 가져 오면 myArray.uniq을 사용하여 파일에 쓰기 전에 중복을 제거 할 수 있습니다.

0

루비에 대해 잘 모르는 것 같습니다.

정말 필요하지 않는 한 전역 변수를 사용하지 마십시오.이 경우에는 그렇지 않습니다. PHP가 아닙니다. 간단한 할당만으로 충분합니다. :)

컬렉션을 통해 반복하려면 전용 #each 메서드를 사용하십시오. 귀하의 경우에는 링크 모음을 필터링하고 귀하의 필요에 맞는 모음을 남겨야합니다. valid_links = links.filter {| link | ...}.

사용자의 요구 사항과 일치하지 않는 경우 false를 반환하고 사용자의 요구 사항과 일치하면 true를 반환합니다.

File.open에는 File.open 블록 내의 콜렉션을 거쳐야합니다 (통과하려면 valid_links가 있어야합니다).

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