python之urllib庫

 

urllib庫

urllib庫是Python中一個最基本的網絡請求庫。能夠模擬瀏覽器的行爲,向指定的服務器發送一個請求,並能夠保存服務器返回的數據。html

urlopen函數:

Python3urllib庫中,全部和網絡請求相關的方法,都被集到urllib.request模塊下面了,以先來看下urlopen函數基本的使用:python

from urllib import request resp = request.urlopen('http://www.baidu.com') print(resp.read()) 

實際上,使用瀏覽器訪問百度,右鍵查看源代碼。你會發現,跟咱們剛纔打印出來的數據是如出一轍的。也就是說,上面的三行代碼就已經幫咱們把百度的首頁的所有代碼爬下來了。一個基本的url請求對應的python代碼真的很是簡單。
如下對urlopen函數的進行詳細講解:c#

  1. url:請求的url。
  2. data:請求的data,若是設置了這個值,那麼將變成post請求。
  3. 返回值:返回值是一個http.client.HTTPResponse對象,這個對象是一個類文件句柄對象。有read(size)readlinereadlines以及getcode等方法。

urlretrieve函數:

這個函數能夠方便的將網頁上的一個文件保存到本地。如下代碼能夠很是方便的將百度的首頁下載到本地:瀏覽器

from urllib import request request.urlretrieve('http://www.baidu.com/','baidu.html') 

urlencode函數:

用瀏覽器發送請求的時候,若是url中包含了中文或者其餘特殊字符,那麼瀏覽器會自動的給咱們進行編碼。而若是使用代碼發送請求,那麼就必須手動的進行編碼,這時候就應該使用urlencode函數來實現。urlencode能夠把字典數據轉換爲URL編碼的數據。示例代碼以下:服務器

from urllib import parse data = {'name':'爬蟲基礎','greet':'hello world','age':100} qs = parse.urlencode(data) print(qs) 

parse_qs函數:

能夠將通過編碼後的url參數進行解碼。示例代碼以下:網絡

from urllib import parse qs = "name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=hello+world&age=100" print(parse.parse_qs(qs)) 

urlparse和urlsplit:

有時候拿到一個url,想要對這個url中的各個組成部分進行分割,那麼這時候就可使用urlparse或者是urlsplit來進行分割。示例代碼以下:函數

from urllib import request,parse url = 'http://www.baidu.com/s?username=zhiliao' result = parse.urlsplit(url) # result = parse.urlparse(url) print('scheme:',result.scheme) print('netloc:',result.netloc) print('path:',result.path) print('query:',result.query) 

urlparseurlsplit基本上是如出一轍的。惟一不同的地方是,urlparse裏面多了一個params屬性,而urlsplit沒有這個params屬性。好比有一個url爲:url = 'http://www.baidu.com/s;hello?wd=python&username=abc#1'
那麼urlparse能夠獲取到hello,而urlsplit不能夠獲取到。url中的params也用得比較少。post

request.Request類:

若是想要在請求的時候增長一些請求頭,那麼就必須使用request.Request類來實現。好比要增長一個User-Agent,示例代碼以下:網站

from urllib import request headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36' } req = request.Request("http://www.baidu.com/",headers=headers) resp = request.urlopen(req) print(resp.read())

ProxyHandler處理器(代理設置)

不少網站會檢測某一段時間某個IP的訪問次數(經過流量統計,系統日誌等),若是訪問次數多的不像正常人,它會禁止這個IP的訪問。
因此咱們能夠設置一些代理服務器,每隔一段時間換一個代理,就算IP被禁止,依然能夠換個IP繼續爬取。
urllib中經過ProxyHandler來設置使用代理服務器,下面代碼說明如何使用自定義opener來使用代理:ui

from urllib import request # 這個是沒有使用代理的 # resp = request.urlopen('http://httpbin.org/get') # print(resp.read().decode("utf-8")) # 這個是使用了代理的 handler = request.ProxyHandler({"http":"218.66.161.88:31769"}) opener = request.build_opener(handler) req = request.Request("http://httpbin.org/ip") resp = opener.open(req) print(resp.read()) 

經常使用的代理有:

 proxyHandler處理器(代理):

1.代理的原理:在請求目的網址以前,先請求代理服務器,而後讓代理服務器去請求目的網站,代理服務器拿到目的網站的數據後,再轉發給咱們的代碼。

2.http://httpbin.org:這個網站能夠方便查看http請求的一些參數。

3.在代碼中使用代理:

  1)使用urllib.request.ProxyHandler,傳入一個代理,這個代理是一個字典,字典的key依賴於代理服務器可以接收的類型,通常是'http'或者'https',值是'ip:port'。

  2)使用上一步建立的handler,以及'request.build_opener'建立一個'opener'對象。

  3)使用上一步建立的'opener',調用'open'函數,發起請求。

示例代碼以下:

from urllib import request

url = 'http://httpbin.org/ip'

handler = request.ProxyHandler({"http":"233.241.78.43:8010"})

opener = request.build_opener(handler)

resp = opener.open(url)

print(resp.read())

 

 

 

 

>>>>>>待續

相關文章
相關標籤/搜索