1. 程式人生 > >python爬蟲從入門到放棄(三)- Urllib庫的基本使用方法1

python爬蟲從入門到放棄(三)- Urllib庫的基本使用方法1

Urllib 是Python自帶的標準庫,無需安裝,直接可以用。
提供瞭如下功能:

  • 網頁請求
  • 響應獲取
  • 代理和cookie設定
  • 異常處理
  • URL解析

爬蟲所需要的功能,基本上在urllib中都能找到,學習這個標準庫,可以更加深入的理解後面更加便利的requests庫。

----------------------------------------------------------------------我是分割線--------------------------------------------------------------------

先來一個最簡單的例子:

from urllib import request

response = urllib.request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8'))

執行後就可以得到百度首頁的  HTML 。

response物件有一個read方法,可以返回獲取到的網頁內容。

如果不加read直接列印會直接打印出了該物件的描述

上面使用了一個 urlopen的函式,urlopen()函式用於實現對目標url的訪問

urlopen 語法

urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)
#url:訪問的網址

#data:額外的資料,如header,form data

從上一篇文章可以看到資料傳送主要分為POST和GET兩種方式。那這兩種方式有什麼區別呢?

最重要的區別:

GET方式直接以連結形式訪問,連結中包含了所有的引數,若包含了密碼的話是不安全的,不過你可以直觀地看到自己提交了什麼內容。POST則不會在網址上顯示所有的引數,不過如果你想直接檢視提交了什麼就不太方便了。

POST方式:

先演示一下吧:

import urllib.parse
import urllib.request

values = {"username":"1559186****","password":"*********"}
data = urllib.parse.urlencode(values)
url = "https://passport.csdn.net/account/login"
response = urllib.request.urlopen(url,data)
print(response.read())

urlencode是一個函式,可將字串以URL編碼,用於編碼處理。

可以看到核心的程式碼是 response = urllib.request.urlopen(url,data)

這裡用到了data引數(或者說POST方式用到了data引數)。例子上的data引數中的內容十分簡單、所以並不能真正的登入。

GET方式:

同樣的,先舉個例子:

import urllib.parse
import urllib.request

values = {"username":"15591861964","password":"yanhang1235813"}
data = urllib.parse.urlencode(values)
url = "https://passport.csdn.net/account/login"
geturl = url + "?"+data
response = urllib.request.urlopen(geturl)
print(response.read())
可以看到這次的核心程式碼是這樣的 :response = urllib.request.urlopen(geturl)

沒有了data引數、只是url引數。而URL引數的內容是原來的url加  ?然後加編碼後的引數。

從上面的POST和GET兩種不同方式的例子就驗證了一個結論,

GET方式直接以連結形式訪問,連結中包含了所有的引數

POST則不會在網址上顯示所有的引數

------------------------------------------上面就是我學習到的些許爬蟲原理----------------------------------------

------------------------------------------下面是擴充套件學習的一些東西(Urllib庫的其他內容)-----------------------------------

timeout引數的使用

最終返回了報錯資訊

urllib.error.HTTPError: HTTP Error 503: Service Unavailable

那如果給請求設定一個超時時間應該會好一點,urlopen有一個timeout引數

from urllib import request

response = request.urlopen('http://httpbin.org/get', timeout=0.1)
print(response.read())
這次的錯誤返回資訊是:
urllib.error.URLError: <urlopen error timed out>

也可以將這個作為異常、捕獲處理

import socket
import urllib.request
import urllib.error

try:
    response = urllib.request.urlopen('http://httpbin.org/get', timeout=0.1)
except urllib.error.URLError as e:
    if isinstance(e.reason, socket.timeout):
        print('TIME OUT')