爬蟲進階Post與cookies
Last updated
Was this helpful?
Last updated
Was this helpful?
[1]"台北市" "新北市" "基隆市" "宜蘭縣" "桃園市" "新竹市" "新竹縣" "苗栗縣"
[9]"台中市" "彰化縣" "南投縣" "雲林縣" "嘉義市" "嘉義縣" "台南市" "高雄市"
[17]"屏東縣" "花蓮縣" "台東縣" "澎湖縣" "金門縣" "連江縣" "南海諸島"
有了所有的縣市名稱後,就可以進入下一步撈取所有縣市的ibon所在地址。打開Chrome DevTools後,開啟network分頁後,在原先的介面切換並載入新北市的資料。結果發現只跳出三個頁面,資料在最後一個頁面。觀察一下,他的Request Method是POST,而不是GET。只要是POST的,代表你得傳送一些表單資料(Form data)給他,把Headers分頁拉到最下方,可以找到Form data。這邊可以看見,網頁送出了新北市和COUNTY兩個表單資料給該兩個欄位。
至於實際把資料抓回來的部分,我選擇把每個表格的地址欄儲存為character vector,反正地址欄都有縣市鄉鎮市區名稱,我可以之後再解析即可。
但事實上,你也可以用html_table()這個rvect的指令把整個table抓回來並轉為一個data.frame。
上述方法可以撈回一個縣市的所有ibon地址,於是我用for迴圈把所有縣市跑過,並且把所有抓到的地址組合成一個大的vector。注意下列程式碼,除了for-loop附近的程式碼外,其他都與前述程式碼相同。一共會撈回5459個ibon地址。
但事實上,你也可以用html_table()這個rvect的指令把整個table抓回來並轉為一個data.frame,
doc <- read_html(content(res, "text")) addr.node <- html_nodes(doc, "table tr td:nth-child(3)") addrs <- html_text(addr.node) %>% trimws()
至於實際把資料抓回來的部分,我選擇把每個表格的地址欄儲存為character vector,反正地址欄都有縣市鄉鎮市區名稱,我可以之後再解析即可。
url <- "http://www.ibon.com.tw/retail_inquiry_ajax.aspx" res <- POST(url, body = list(strTargetField='COUNTY', strKeyWords='台北市'))
print(content(res, "text"))
cat(content(res, "text"), file="temp.html")
我可以用content()把抓回來的response轉字串,然後用print()列印出來。但是如果HTML檔案的內容過多的時候,會很容易找不到目標資料。另一個方法是,用cat()指令。cat()指令的用法和print()幾乎相同,唯獨cat()不會自動插入一個換行符號在列印結果的最末。除此之外,cat()指令可以把文字「列印」到檔案中,如以下的指令就把抓回來的文字,寫到一個html中,我們就可以用電腦的瀏覽器把他打開來觀看。打開後應該就可以所要抓的表格。
打開Chrome DevTools後,開啟network分頁後,在原先的介面切換並載入新北市的資料。結果發現只跳出三個頁面,資料在最後一個頁面。觀察一下,他的Request Method是POST,而不是GET。只要是POST的,代表你得傳送一些表單資料(Form data)給他,把Headers分頁拉到最下方,可以找到Form data。這邊可以看見,網頁送出了新北市和COUNTY兩個表單資料給該兩個欄位。
接下來,我們要模仿POST送出表單資料的過程把資料撈回來。從Headers可以找到Request URL 我們可以用content()來觀察一下抓回來的東西對不對。我可以用content()把抓回來的response轉字串,然後用print()列印出來。但是如果HTML檔案的內容過多的時候,會很容易找不到目標資料。另一個方法是,用cat()指令。cat()指令的用法和print()幾乎相同,唯獨cat()不會自動插入一個換行符號在列印結果的最末。除此之外,cat()指令可以把文字「列印」到檔案中,如以下的指令就把抓回來的文字,寫到一個html中,我們就可以用電腦的瀏覽器把他打開來觀看。打開後應該就可以所要抓的表格。
接下來,我們要模仿POST送出表單資料的過程把資料撈回來。從Headers可以找到Request URL 我們可以用content()來觀察一下抓回來的東西對不對。