1. 程式人生 > >【筆記】3、初學python3網路爬蟲——urllib庫的使用

【筆記】3、初學python3網路爬蟲——urllib庫的使用

python3網路爬蟲——urllib庫的使用

學習指引:視訊教程《python3網路爬蟲實戰》

為了避免學習後短時間內遺忘,讓自己隨時可以查閱前方自己學過的知識,特意註冊csdn部落格,方便自己學習時做筆記,也方便隨時回顧。也希望自己的學習過程能給同樣初學python爬蟲的你帶來一點指引!由於自己是新手,只有一點點的python基礎,所以筆記中難免會有很多紕漏,還望各路大神多多包涵,多多指教,如有不正確的地方,歡迎指出。

一眨眼我們就到了第三課了,這一次應該是正式開始python程式碼的編寫了吧,廢話不多說,Let’s go!

urllib庫是什麼

這是一個Python內建的http請求庫,裡面包含了幾個模組:

  1. urllib.request —— 請求模組
  2. urllib.error —— 異常處理模組
  3. urllib.parse —— url解析模組
  4. 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語法的,不知道對不對,大家可以試試:

https://guides.github.com/features/mastering-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)