【筆記】3、初學python3網路爬蟲——urllib庫的使用
python3網路爬蟲——urllib庫的使用
學習指引:視訊教程《python3網路爬蟲實戰》
為了避免學習後短時間內遺忘,讓自己隨時可以查閱前方自己學過的知識,特意註冊csdn部落格,方便自己學習時做筆記,也方便隨時回顧。也希望自己的學習過程能給同樣初學python爬蟲的你帶來一點指引!由於自己是新手,只有一點點的python基礎,所以筆記中難免會有很多紕漏,還望各路大神多多包涵,多多指教,如有不正確的地方,歡迎指出。
一眨眼我們就到了第三課了,這一次應該是正式開始python程式碼的編寫了吧,廢話不多說,Let’s go!
urllib庫是什麼
這是一個Python內建的http請求庫,裡面包含了幾個模組:
- urllib.request —— 請求模組
- urllib.error —— 異常處理模組
- urllib.parse —— url解析模組
- urllib.robotparser —— robot.txt解析模組
urllib庫其實沒有request庫好用,不過作為初學者,我們有必要了解一下urllib庫中的一些基本原理的。文章以實踐為主,理論為輔,主要的理論我會上網搜尋相關文件並把連結貼上來。
urlopen函式
格式:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None , capath=None, cadefault=False, context=None)
嘗試一下
我先在cmd輸入命令jupyter notebook
打開了一個web筆記本,第一篇我們安裝過的一個軟體,這個筆記本能夠比較方便地儲存我們的程式碼,並且介面美觀。在筆記本里,我新建了一個資料夾(右上角的‘New’可以新建資料夾),用來存放我學習過程中的程式碼,在新的資料夾裡面,我新建了一個python3檔案,進入後我就可以敲程式碼了,注意shift+enter是執行程式碼哦!裡面還支援markdown語法,具體用法網上有教程,可以直接百度到一些基本的markdown語法。找到了一篇講markdown語法的,不知道對不對,大家可以試試:
如果沒有安裝jupyter的童鞋,可以用其他的編輯器,安裝的時候自帶額IDLE就非常不錯,開啟IDLE命令列後,點選Ctrl+N就可以新建一個.py檔案,在裡面輸入程式碼還有高亮顯示,想想就很棒。如果想要追求高效率的話,可以下載一些編輯器,比如notepad++等。
#請求百度頁面並打印出來
import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8'))
這裡我嘗試的時候發現utf-8反編碼失敗,錯誤是:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
我上網找了不少資料,沒能完美解決,不過我嘗試同一段程式碼多執行幾次,結果成功了。
這節課沒有太多實踐的知識,主要是講解了urllib庫的一些基本用法,我就把練習用到的一些程式碼貼上來把。
#傳送一個post請求,攜帶data資料
import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({'word':'hello'}),encoding='utf-8')
response =urllib.request.urlopen('http://httpbin.org/post',data = data)
print(response.read())
Request
只單純用urlopen,只能請求一個網址,沒有辦法攜帶更多的資料,那麼我們要攜帶更多資料去請求伺服器的話,可以將網址等資料包裝成request物件,再將整個物件傳送過去
#這是隻攜帶網址的一個例子
import urllib.request
request = urllib.request.Request('https://www.python.org')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
#這個是攜帶一些其他header資訊的例子
from urllib import request,parse
url = 'http://httpbin.org/post'
headers = {
'User-Agent':'Mozilla/4.0(compatible;MSIE 5.5;Windows NT',
'Host':'httpbin.org'
}
dict = {
'name':'Germey'
}
data = bytes(parse.urlencode(dict),encoding = 'utf-8')
req = request.Request(url = url, data=data, headers=headers, method='POST')
response = request.urlopen(req)
print(response.read().decode('utf-8'))
URL解析
urlparse
urllib.parse.urlparse(urlstring, scheme=”, allow_fragments=True)
這個命令能將url連結進行解析,解析成不同的部分,下面有例子。
from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=123456#comment')
print(type(result), result)
urlunparse
用來拼接url連結
from urllib.parse import urlunparse
data = ['http','www.baidu.com','index.html','user','a=6','comment']
print(urlunparse(data))
urlencode
這個可以將字典形式的檔案拼接成連結,平時比較有用
from urllib.parse import urlencode
params = {
'name':'Benko',
'age':21
}
base_url = 'http://www.baidu.com?'
url = base_url + urlencode(params)
print(url)