一、urllib庫
urllib是一個用來處理網絡請求的python數據庫,它包含四個模塊
urllib.requests 請求模塊,用於發起網絡請求
urllib.parse 解析模塊,用於解析URL
urllib.error 異常處理模塊,用於處理request引起的異常
urllib.robotparse 用於解析robots.txt文件
1.urllib.requests 模塊
request模塊主要負責構造和發起網絡請求,並在其中添加Headers,Proxy等。
利用它可以模擬瀏覽器的請求發起過程。
a.發起網絡請求
b.添加Headers
c.操作cookie
d.使用代理
1.1urlopen方法
urlopen是一個簡單發送網絡請求的方法。它接收一個字符串格式的url,它會向傳入的url發送網絡請求,然後返回結果。
from urllib import request
response = request.urlopen(url='http://httpbin.org/get')
urlopen 默認會發送get請求,當傳入data數據時,則會發生POST請求。data參數是字節類型、這類文件對象或可迭代對象。
response = request.urlopen(url='http://httpbin.org/post'),
data=b'uesrname=jay&password=123456'
還可以設置超時,如果請求超過設置時間,則拋出異常。timeout沒有指定則用系統默認設置,
timeout只對,http,https以及ftp連接起作用。以秒爲單位,比如可以設置timeout=0.1 超時時間爲0.1秒。
response = request.urlopen(url='http://www.baidu.com', timeout=0.1)
2.Request對象
利用openurl可以發起最基本的請求,但這幾個簡單的參數不足以構建一個完整的請求,可以利用更強大的Request對象來構建更加完整的請求。
req == resquest.Request('http://www.baidu.com')
response = request.urlopen(req)
2.1請求頭添加
通過urllib發送的請求會有一個默認的Headers: “User-Agent”:“Python-urllib/3.6”,指明請求是由urllib發送的。所以遇到一些驗證User-Agent的網站時,需要我們自定義Headers把自己僞裝起來。
headers = {
'user-Agent':'Mozilla/5.0(Window NT 10.0; Win64;) AppleWebkit/537.36(KHTML, like Gecko)'
}
print(heaeders)
url = 'http://www.baidu.com'
req = request.Request('http://www.baidu.com', headers)
2.2操作cookie
在開發得過程中,對cookie得處理非常重要,urllib得cookie處理如下:
from urllib import request
from http import cookiejar
# 創建一個cookie 對象
cookie = cookiejar.CookieJar()
# 創建一個cookie處理器
coolie = request.HTTPCookieProcessor(cookie)
# 以它爲參數,創建Openner對象
opener = request.build_opener(cookies)
# 使用這個openner來發請求
res = opener.opeen('http://www.baidu.com')
print(coolie.cookiejar)
2.3設置代理
運行爬蟲的時候,經常出現被封的情況,這時候我們就需要用ip代理來處理,
urllib的IP處理如下:
from urllib import request
url = 'http://httpbiin.org/ip'
# 代理地址
proxy = {'http':'180.76.111.69:3128'}
# 代理處理器
proxies = request.baidu_opener(proxies)
res = oprner.open(url)
print(res.read().decode())
3.Response對象
urllib庫中的類或或者方法,在發送網絡請求後,都會返回一個urllib.response的對象。它包含了請求回來的數據結果。它包含了一些屬性和方法,供我們處理返回的結果。
a.read() 獲取響應的數據,只能用一次
print(response.read())
b.readline 讀取一行
while True:
data = response.readlin()
if data:
print(data)
c.info() 獲取響應頭信息
print(response.info())
d.geturl() 獲取訪問的url
print(response.geturl())
e,getcode() 返回狀態碼
print(response.getcode())
4.parse 模塊
parse模塊是一個工具模塊,提供了需要對url處理的方法,用於解析url。
a.parse.quote()
url中只能包含ascii字符,在實際操作過程中,get請求通過url傳遞的參數中會有大量的特殊字符,例如漢字,那麼就需要進行url編碼。
例如https://baike.baidu.com/item/URL編碼/3703727?fr=aladdin
我們需要將編碼進行url編碼
from urllib import parse
url = 'http://httpbin.org/get?aaa={}'
safe_url = url.format(parse.quote('人生苦短,我用Python'))
print(safe_url)
運行結果 ✳也可以用parse.unquote()反編碼回來
http://httpbin.org/get?aaa=%E4%BA%BA%E7%94%9F%E8%8B%A6%E7%9F%AD%EF%BC%8C%E6%88%91%E7%94%A8Python
b.parse.urlencode()
在發送請求的時候,往往會需要傳遞很多的參數,如果用字符串方法去拼接會比較麻煩,parse.urlencode()方法就是用來拼接url參數的。
params = {'wd':'測試','code':1,'height':'100'}
res = parse.urlencode(params)
print(res)
'''
運行結果
wd=%E6%B5%8B%E8%AF%95&code=1&height=100
'''
也可以通過parse.parse_qs()方法將它轉回字典
print(parse.parse_qs('wd=%E6%B5%8B%E8%AF%95&code=1&height=100'))
'''
運行結果
{'wd': ['測試'], 'code': ['1'], 'height': ['100']}
'''
5.urllib.error模塊
error模塊主要負責處理異常,如果請求出現錯誤,我們可以用error模塊進行處理
主要包含URLError和HTTPError。
a.URLError:是error異常模塊的基類,由request模塊產生的異常都可以用這個類來處理
b.HTTPError:是URLError的子類,主要包含三個屬性:
(1) code:請求的狀態碼
(2) reason:錯誤原因
(3) headers:響應的報頭
6.urllib.robotparse模塊
robotparse模塊主要負責處理爬蟲協議文件,robots.txt.的解析。
Robots協議(也稱爲爬蟲協議、機器人協議等)的全稱是“網絡爬蟲排除標準”(Robots Exclusion Protocol),網站通過Robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。
robots.txt文件是一個文本文件,使用任何一個常見的文本編輯器,比如Windows系統自帶的Notepad,就可以創建和編輯它 [1] 。robots.txt是一個協議,而不是一個命令。robots.txt是搜索引擎中訪問網站的時候要查看的第一個文件。robots.txt文件告訴蜘蛛程序在服務器上什麼文件是可以被查看的。