almost 2 years ago

nokogiri gem去爬google太麻煩了。
通常網頁看到的html tag,好像跟實際上的不太一樣。
所以用css selectorxpath,好像都會找不到,不知道是不是google 的搜尋頁面才會發生這種情況。

nokogiri雖然有辦法找到第一頁到第十頁的url,應該可以一頁一頁的爬下來。
不過,沒辦法找到下一頁的url,所以變成要連到第十一頁之後,再去找後面十頁的url?感覺有點蠢?
所以花了很多時間用css selector去找google的next page,可是都找不到。

mechanize gem好用很多,一下子就找到了next page裡面的url。
這樣在第一頁的時候,可以直接找到下一頁的url,用mechanize的.click的功能,就能跑到第二頁了。
第二頁爬完,還可以找到下一頁的URL,用mechanize的.click的功能,就又能跑到第三頁了。
大功告成。

不過,後來還是被google鎖IP了。
如JC大所說,一定會被鎖,可能要用curl 或是 RestClient
參考資料:用nokogiri 爬google 搜尋資料

另外,花了很多時間去試while怎麼用,比想像中難很多。
網路上可以找到的範例都是用數字去跑,都太簡單了,而我沒辦法舉一反三,只好一直試。
begin end while condition當符合condition(true)的時候,會一直跑。
我還以為這樣的寫法,是指:當condition符合的時候,要end勒...害我一直試。

search.rb
require 'mechanize'

class Search
  def self.run
  
    mechanize = Mechanize.new
    page = mechanize.get('https://www.google.com.tw/search?q=%E5%A9%A6%E7%94%A2%E7%A7%91')
    
    #google_url = "https://www.google.com.tw"

    #basic_url = "/search?q=%E5%A9%A6%E7%94%A2%E7%A7%91"

    #puts page.uri

    
    next_page = nil
    next_page = !page.link_with(text: '下一頁').nil? ? page.link_with(text: '下一頁') : nil
    
    counter = 1
    begin
    new_page = next_page.click if !next_page.nil?
      puts next_page.href
      new_page.css('//h3').each do |h|
        puts h.text
      end
      next_page = !new_page.link_with(text: '下一頁').nil? ? new_page.link_with(text: '下一頁') : nil
      puts next_page.href if !next_page.nil?
      new_page = !next_page.nil? ? next_page.click : nil
      counter += 1 if !next_page.nil?
    end while !next_page.nil?
  end
end
search.rb 記得要先require
require 'mechanize'
search.rb 必要的兩個步驟
mechanize = Mechanize.new
page = mechanize.get('https://www.google.com.tw/search?q=%E5%A9%A6%E7%94%A2%E7%A7%91')

('https://www.google.com.tw/search?q=%E5%A9%A6%E7%94%A2%E7%A7%91')
好像沒辦法改成
goole_url = "https://www.google.com.tw/search?q=%E5%A9%A6%E7%94%A2%E7%A7%91"
然後使用page = mechanize.get("google_url")

這邊有幾個mechenize的用法
link_with:找到符合條件的,new_page.link_with(text: '下一頁')
page.uri: 把頁面的url叫出來。
next_page.click:連結頁面。

Mechanize 參考資料:
Nokogiri 問題求救
The Mechanize Gem
Writing a Web Crawler

Getting Started With Mechanize

這一段還滿有趣的
agent = Mechanize.new
page = agent.get('http://google.com/')
google_form = page.form('f')
google_form.q = 'ruby mechanize'
page = agent.submit(google_form)
pp page

While 參考資料:
using while loop with nokogiri to navigate to next page
Ruby的網頁爬蟲open-uri和nokogiri庫

← Nokogiri 範例 用 Spreadsheet gem 去讀取 Excel 檔(.xls) →