近來工作終於稍有喘息的空間
再來碰一下python吧,這次要學的,是網頁資料處理的urllib這個函式庫
也就是撰寫所謂的網路爬蟲程式
寫網路爬蟲程式會用到的模組是urllib模組其中的request
最簡單的使用法如下,以中央氣象局的網頁為例
1 2 3 4 5 | import urllib.request as req
print (response.read())
|
然後就會看到中央氣象局的網頁原始碼(HTML)顯示在畫面上
這樣就成功了
接下來就是把讀下來的資料拿去HTMLParser分析然後抓出想要的資料了
可是不是每一個網頁都這麼好處理
有不少是希望你用瀏覽器去看,而不是單純抓資料下來
這時就會拒絕存取,顯示urllib.error.HTTPError: HTTP Error 403: Forbidden
該怎麼辦呢?這時候就需要加入Header資料去
騙一下告訴伺服器
其實我是瀏覽器啦 XD
作法有兩種,一種直接在request的部分填入所需要的header資訊
1 2 3 4 5 6 7 8 9 | import urllib.request as req
header_request.add_header( "User-Agent" , "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" )
response = req.urlopen(header_request)
print (response.read())
|
另一種是建立handler與opener後,再開網頁
1 2 3 4 5 6 7 8 9 10 11 12 13 | import urllib.request as req
handler = req.BaseHandler()
opener = req.build_opener(handler)
opener.addheaders = [( 'User-Agent' , 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36' )]
req.install_opener(opener)
response = req.urlopen(url)
print (response.read())
|
這樣看來,似乎第2個寫法比較麻煩多了
不過如果程式上需要以同一個header多抓幾個網址的話
那麼第2個寫法就顯得比較簡單,不用每一個網址都要再建一個帶有Header的Request
另外第2個寫法也可以解決需要帳號密碼的網頁
不過要加個密碼管理器
寫法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import urllib.request as req
pwdmgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
pwdmgr.add_password( None ,url ,user ,password)
handler = req.HTTPBasicAuthHandler(pwdmgr)
opener = req.build_opener(handler)
opener.addheaders = [( 'User-Agent' , 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36' )]
req.install_opener(opener)
response = req.urlopen(url)
print (response.read())
|
基礎大概就這些了,剩下的都是變化形了
就我目前的使用來說,夠用了