Nokogiri 問題求救


#21

嘛 … 我就說你會被擋了哩 … 基本上 cookie 要從頭帶到尾的,且很多邪惡的手法可以拿來做機器人判定,因為『cookie 是累加的』

一個網頁開起來,可能有網頁有圖片,都可以回 set-cookie 的 header
類似

HTML => set-cookie : SESSIONID = 123
logo.jpg => set-cookie : CHECKSUM = 234
verify.css => set_cookie : VID= 345
testme.js => set-cookie : SESSIONID = 999

則你下次送出的 cookie 必須是

SESSIONID=999&CHECKSUM=234&VID=345

而不管你用 open-uri / mechanize 都不會抓圖片或是額外的附加檔案,所以下次最多只會送出這樣的 cookie

SESSIONID=123 # open-uri 連這個都不會送出

更別說用 etag / webstorage / AJAX reset cookie | session 之類的方式來做二次追蹤了…

so~ 通常想不開還有十足的把握才會去掃 Google 就是,那邊失敗率太高了,當然以前有試過有趣的神奇解法,但…要花費很多的心力來偽裝,而非單一個 open-uri / mechanize 所能完成的就是(要用 curl 或是 RestClient 來完整偽裝 header 和重新 init cookie 封裝和持續和連續的更換 UA 和 cookie 等等)


#22

https://ma.mohw.gov.tw/masearch/
這個好像更難爬耶,
"診療科別"選"婦產科"後,
我連個“下一頁”的連結都找不到…

衛福部有1014筆的婦產科,
可是google只有26頁…


#23

嘛,自己的作業要自己寫哩,and 你給的網址我沒辦法打開就是了


#24

要跑很久才打開,我也一度以為打不開。
大不了我一筆一筆輸入吧…:joy:


#25

從除夕搞到今天,還是弄不出來…只好來求救了。

我現在有一個 Hospitals Model,Attributes 有 name 跟 website,name 已經都存在資料庫裡面了,可是還沒有website (衛福部的資料庫裡面只有醫院名稱,沒有醫院的網址,有很多醫院其實都沒有網站)

以Mechanize ( 放棄用 Nokogiri ) 用 Yahoo 搜尋每間醫院的網址(google太麻煩了,yahoo的網頁比較單純),然後再分別把網址存到各別醫院的website attribute裡面去。

在console裡面,篩選過後,到 url_list.uniq! 這一步時,可以找出來我想要的網址。

不過,如果我要把網址存進去相對應的醫院的時候,
執行後,
不是把所有的醫院都叫出來一次,然後就停了,
就是把所有的醫院的website都存成第一間醫院的website。

請各位大大救命~

require 'Mechanize'
agent = Mechanize.new

page = agent.get('https://tw.yahoo.com/')
yahoo_form = page.form

url_list = [] 
@hospitals = Hospital.all

@hospitals.each do |h|
  name = h.name
  yahoo_form.p = name
  page = agent.submit(yahoo_form, yahoo_form.buttons.first)

  page.links.each do |link|
    url = link if link.text.start_with?(name[0,4]) && link.href.exclude?("yahoo") && link.href.exclude?("doctor01") && link.href.exclude?("ezlife") && link.href.exclude?("5151") && link.href.exclude?("facebook") && link.href.exclude?("ipeen") && link.href.exclude?("104hc") && link.href.exclude?("verywed") && link.href.exclude?("bizpo") && link.href.exclude?("1111") && link.href.exclude?("twypage") && link.href.exclude?("tw16") && link.href.exclude?("google") && link.href.exclude?("businessweekly") && link.href.exclude?("goo")
    url_list << url.href if !url.nil?
    url_list.uniq!
  end
#以上跑的出來
#以下跑不出來
  @hospital = Hospital.find_by(:name => name)
  if url_list.empty?
    @hospital.website = "N/A"
    @hospital.save
  else  
    @hospital.website = url_list[0]
    @hospital.save
  end
    
 end; true

#26

… 基本的程式問題 … 請把基本學好哩 …|||

我把旁枝末節全部移除,然後凸顯你的邏輯缺失好了

lists = []
100.times do
  if rand > 0.5
    lists << rand(99)
    lists.uniq!
  end
  if lists.empty?
    puts 'N/A'
  else
    puts lists[0]
  end
end

把上面的 code 存成 Ruby 後執行看看,或是複製貼上到 irb 上也行

如果你連基本的程式流程都有問題時 … Rails 是寫不好的哩,所以先從基本的 Ruby 開始寫唄


#27

原來把url_list = []改個地方就好了,真的是玩死我了。
有大大建議我看這篇

@hospitals = Hospital.all

@hospitals.each do |h|    
  url_list = [] 

  name = h.name
  yahoo_form.p = name
  page = agent.submit(yahoo_form, yahoo_form.buttons.first)

  page.links.each do |link|
    url = link if link.text.start_with?(name[0,4]) && link.href.exclude?("yahoo") && link.href.exclude?("doctor01") && link.href.exclude?("ezlife") && link.href.exclude?("5151") && link.href.exclude?("facebook") && link.href.exclude?("ipeen") && link.href.exclude?("104hc") && link.href.exclude?("verywed") && link.href.exclude?("bizpo") && link.href.exclude?("1111") && link.href.exclude?("twypage") && link.href.exclude?("tw16") && link.href.exclude?("google") && link.href.exclude?("businessweekly") && link.href.exclude?("goo")
    url_list << url.href if !url.nil?
    url_list.uniq!
  end

  @hospital = Hospital.find_by(:name => name)
  if url_list.empty?
    @hospital.website = "N/A"
    @hospital.save
  else  
    @hospital.website = url_list[0]
    @hospital.save
  end

 end; true

#28

和那些東西都無關,吃太多添加物很容易中毒的,把基本功練好比啥都重要,否則只會一直繞圈圈和撞牆而已|||

對我而言,基本功就是單純的程式語言(Ruby),可以寫機器人還是啥鬼的題型來做練習



https://codefights.com/

一票線上網站可以讓你練,之後啥鬼問題碰到都有得解,否則都會只知其然不知其所以然,技術債持續累積的向下循環,so…