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