#回顧 由上一篇文章知道:經過python代碼向服務器發送request,而後經過獲取response就能夠獲取到網頁的內容了。那麼python如何向網站發起請求呢?這個過程又是如何實現的呢?html
python的Urllib庫爲咱們實現了想瀏覽器發起請求的過程,Urllib是python內置的一個http請求庫(不須要額外的手動安裝),除了發起request,Urllib還提供了比較強大的url解析函數。 java
其中:python
import urllib.requst
response = urllib.request.urlopen('http://www.baidu.com')
複製代碼
urllib其實不太好用,後面會介紹其餘更好用的庫:它是基於Urllib庫來實現的。urllib做爲最基本的請求庫,這裏仍是介紹一下urllib庫的基本原理和使用。面試
##request.urlopen()函數介紹 urllib.request.urlopen( url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None )json
其中瀏覽器
###urlopen返回的response對象提供方法: - read() , readline() ,readlines() , fileno() , close() :對HTTPResponse類型數據進行操做,返回的是byte類型的數據,須要使用decode方法轉換爲字符串,獲取響應體的內容 - info():返回HTTPMessage對象,表示遠程服務器返回的頭信息 - getcode():返回Http狀態碼。若是是http請求,200請求成功完成 ; 404網址未找到 - geturl():返回請求的url服務器
####案例:cookie
from urllib import request
response = request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8'))
複製代碼
上面代碼打印出來的是瀏覽器訪問「www.baidu.com」時返回的第一個html頁面: socket
注:若是你在瀏覽器中看不到上面的源代碼,能夠清除cookie試試函數
2.測試post請求
from urllib import request
from urllib import parse
#request.urlopean(url,data,)
data = bytes(parse.urlencode({'word':'hello'}),encoding='utf-8')
response = request.urlopen('http://httpbin.org/post',data=data);#這是一個HTTP測試網站
print(response.read().decode('utf-8'))
複製代碼
上面代碼的輸出的是json格式:
3.超時設置:在規定時間沒有獲得響應就會拋出異常
from urllib import request
response = request.urlopen('http://httpbin.org/get',timeout=0.1);#這是一個HTTP測試網站,超時時間設置爲0.1秒
print(response.read().decode('utf-8'))
複製代碼
上面代碼會報異常:socket.timeout: timed out
下面代碼輸出的是:TimeOut
from urllib import request
from urllib import error
import socket
try:
response = request.urlopen('http://httpbin.org/get',timeout=0.1);#超時0.1s
except error.URLError as e:
if isinstance(e.reason,socket.timeout):
print('TimeOut')
複製代碼
上面是urlopen使用,即發如何發起request請求,下面介紹response相關知識點
#response
from urllib import request
response = request.urlopen('http://www.python.org');
print(type(response))
複製代碼
輸出的結果是: 打印出來的是: class 'http.client.HTTPResponse'
2.response中的主要成員:狀態碼和響應頭
from urllib import request
response = request.urlopen('http://www.python.org');
print(response.status)
print(response.getheaders());
print(response.getheader('server'))#獲取響應頭中的某一個取值
複製代碼
輸出結果:
上面結果對應瀏覽器的下面結果:
3.獲取response響應體的內容
from urllib import request
response = request.urlopen('http://www.python.org');
print(response.read.decode('utf-8'))
複製代碼
輸出的內容在文章開頭的get請求中以已經介紹了
#Request對象
執行結果:
另一種添加header的方式:
#代理:Handle
from urllib import request
proxy_handle = request.ProxyHandle({
‘http':http://代理ip
'https':https://代理IP
})
opener = request.builder_opener(proxy_handle)
response = opener.open('www.baidu.com')
複製代碼
##cookie 在爬蟲中,cookie主要是用來維持用戶帳號的登陸狀態 1.cookie的獲取
#---------------獲取cookie
from http import cookiejar
from urllib import request
cookie = cookiejar.CookieJar()
handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
response = opener.open('http://www.baidu.com')
for item in cookie:
print(item.name+' = '+item.value)
複製代碼
2.**cookie保存:**由於cookie能夠用來保持登陸信息的,因此能夠把cookie保存成文本文件。若是cookie沒有失效,咱們能夠從文件讀取cookie,並將cookie附加在request中:
#---------------保存cookie
from http import cookiejar
from urllib import request
filename= 'cookie.txt'
cookie = cookiejar.MozillaCookieJar(filename)
handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True,ignore_expires=True)
複製代碼
3.cookie:cookie能夠保存成不一樣的格式,可是這不過重要,你使用什麼格式存儲的就使用什麼格式讀取就好,下面是另一種cookie保存格式,主要是類
#---------------保存cookie另一種格式
from http import cookiejar
from urllib import request
filename= 'cookie.txt'
cookie = cookiejar.LWPCookieJar(filename)
handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True,ignore_expires=True)
複製代碼
#---------------讀取cookie
from http import cookiejar
from urllib import request
filename= 'cookie.txt'
cookie = cookiejar.LWPCookieJar(filename)
cookie.load('cookie.txt',ignore_discard=True,ignore_expires=True);
handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
response = opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))
複製代碼
#異常處理
from urllib import request,error
try:
response = request.urlopen('網址')#當網頁不存在的時候,異常能夠捕獲到,程序不會終止退出
except error.URLError as e:
print(e.reason)
複製代碼
上面的異常也能夠像java那樣分類捕捉異常,主要有三個error: 1.URLError 2.HTTPError(URLError的子類) 3.ContentTooShortError
#parse,URL解析
from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(type(result,result))
複製代碼
type:class 'urllib.parse.ParseResult' result: scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment'
from urllib.parse import urunlparse
data = ['http','www.baidu.com','index.html','a=6','comment']
print(urlunparse(data))
#http://www.baidu.com/index.html?a=6#comment
複製代碼
urlencode將以字典形式組織的參數拼接到url上
歡迎關注我的公衆號【菜鳥名企夢】,公衆號專一:互聯網求職面經、java、python、爬蟲、大數據等技術分享**: 公衆號**菜鳥名企夢
後臺發送「csdn」便可免費領取【csdn】和【百度文庫】下載服務; 公衆號菜鳥名企夢
後臺發送「資料」:便可領取5T精品學習資料**、java面試考點和java面經總結,以及幾十個java、大數據項目,資料很全,你想找的幾乎都有