接上文再繼續(xù)我們的爬蟲,這次我們來述說Urllib庫
1,什么是Urllib庫
Urllib庫是python內(nèi)置的HTTP請求庫
urllib.request 請求模塊
urllib.error 異常處理模塊
urllib.parse ? ?url解析模塊
urllib.robotparse? robots.txt解析模塊
不需要額外安裝,python自帶的庫。
注意 :
python2
import urllib2
response = urllib2.urlopen('http://baidu.com')
python3
import urllib.request
response = urilib.request.urlopen('http://www.baidu.com') ?
python2和python3使用urllib庫還是有一定區(qū)別的。
2,方法以及模塊:
1)request
基本運行:(get方式的請求)
import urllib.request
response = urilib.request.urlopen(' http://www.baidu.com ')
print(response.read().decode(' utf-8 '))
運行結(jié)果如下:
在這里我們看到,當我們輸入 urllib.request.urlopen('http://baidu.com') 時,我們會得到一大長串的文本,也就是我們將要從這個得到的文本里得到我們所需要的數(shù)據(jù)。
帶有請求參數(shù):(post方式的請求)
import ?urllib.request
import
urllib.parse
data = bytes (urllib.parse.urlencode({' username ':' cainiao '}),encoding=' utf8 ')
response = urllib.request.urlopen(' http://httpbin.org/post ',data = data )
print(response.read())?
在這里我們不難看出,我們給予的data username參數(shù)已經(jīng)傳遞過去了。
注意 data 必須為bytes類型
設(shè)置請求超時時間:
import ?urllib.request
response = urllib.request.urlopen(' http://httpbin.org/get ', timeout = 1 )
print(response.read())?
這時我們看到,執(zhí)行代碼時報出timed out錯誤。我們這時可以使用urllib.error模塊,代碼如下
import ?urllib.request
ipmort urllib.error
try :
response = urllib.request.urlopen(' http://httpbin.org/get ', timeout = 0.1 )
print(response.read())?
except urllib.error.URLError as e:
print(' 鏈接超時啦~! ') # 這里我們沒有判斷錯誤類型,可以自行加入錯誤類型判斷,然后在進行輸出。
說到這,我們就把最簡單,最基礎(chǔ)的urlopen的基礎(chǔ)全都說完了,有能力的小伙伴,可以進行詳細閱讀其源碼,更深入的了解該方法。
2)響應(yīng) response
import urllib.request
response = urllib.request.urlopen(' http://www.baidu.com ')
print(type(response))
# 得到一個類型為
import urllib.request
response = urllib.request.urlopen(' http://www.baidu.com ')
print( type (response)) # 響應(yīng)類型
print(response. status ) #上篇文章提到的狀態(tài)碼
print(response. getheaders )? # 請求頭
print(response.getheader(' Server ')) # 取得請求頭參數(shù)
import ?urllib.request
response = urllib.request.urlopen(' http://www.baidu.com ')
print(response.read().decode(' utf-8 '))?# 響應(yīng)體,響應(yīng)內(nèi)容
響應(yīng)體為字節(jié)流形式的內(nèi)容,我們需要調(diào)用decode(decode('utf-8'))進行轉(zhuǎn)碼。
?
常用的post請求基本寫法
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':' cxiaocai '
}
data = bytes (parse.urlencode( dict ),encoding=' utf8 ')
req = request.Request(url =url , data = data , headers = headers , method = ' POST ')
response = request.urlopen(req)
print(response.read().decode(' utf-8 '))
也可以寫成這樣的
from ?urllib? import ?request,parse
url = ' http://httpbin.org/post '
dict?= {
'name':' cxiaocai '
}
data =? bytes (parse.urlencode( dict ),encoding=' utf8 ')
req = request.Request(url =url , data = data , headers = headers , method = ' POST ')
req.add_header(' User-Agent':'Mozilla/4.0(compatible;MSIE 5.5;Windows NT) ')
response = request.urlopen(req)
print(response.read().decode(' utf-8 '))
說到這里,我們最基本的urllib請求就可以基本完成了,很大一部分網(wǎng)站也可以進行爬取了。
3,代理設(shè)置
代理設(shè)置我們這里簡單的說一下,后面的博客我們會用實際爬蟲來說明這個。
Hander代理
import urllib.request
proxy_hander = urllib.request.ProxyHeader({
'http':' http://127.0.0.1:1111 ' ,
'https':' https://127.0.0.1:2222'
})
opener = urllib.request.build_opener( proxy_hander )
response = opener.open(' http://www.baidu.com ')
print(response.read()) # 我這沒有代理,沒有測試該方法。
Cookie設(shè)置
import http.cookiejar, urllib.request
cookie = http.cookiejar.CookieJar()
hander = urllib.request.HTTPCookieProcessor( cookie )
opener = urllib.request.build_opener( hander )
response = opener.open("
http://www.baidu.com
")
for item in cookie:
print(item.name + "=" + item.value)
? 例如某些網(wǎng)站是需要登陸的,所有我們在這里需要設(shè)置Cookie
我們也可以將Cookie保存為文本文件,便于多次進行讀取。
?
import http .cookiejar , urllib .request
?
filename = 'cookie.txt'
cookie = http .cookiejar . MozillaCookieJar (filename )
hander = urllib .request . HTTPCookieProcessor (cookie )
opener = urllib .request . build_opener (hander )
response = opener . open ( "http://www.baidu.com " )
cookie . save (ignore_discard = True , ignore_expires = True )
代碼運行以后會在項目目錄下生成一個cookie.txt
另外一種Cookie的保存格式 ?
import http .cookiejar , urllib .request
?
filename = 'cookie.txt'
cookie = http .cookiejar . LWPCookieJar (filename )
hander = urllib .request . HTTPCookieProcessor (cookie )
opener = urllib .request . build_opener (hander )
response = opener . open ( "http://www.baidu.com " )
cookie . save (ignore_discard = True , ignore_expires = True )
運行代碼以后也會生成一個txt文件,格式如下
下面我們來讀取我們過程保存的Cookie文件
import? http .cookiejar , urllib .request
?
cookie? = http .cookiejar . LWPCookieJar ()
cookie . load ( 'cookie.txt' ,ignore_expires = True ,ignore_discard = True )
hander? = urllib .request . HTTPCookieProcessor (cookie )
opener? = urllib .request . build_opener (hander )
response? =? opener . open ( 'http://www.baidu.com ' )
print ( response .read ().decode ( 'utf-8' ))
4,異常處理
簡單事例,在這里我們來訪問一個不存在的網(wǎng)站
from urllib import request ,error
try :
? ? response = request . urlopen ( 'https://www.cnblogs.com/cxiaocai/articles/index123.html' )
except error .URLError as e :
? ? print (e .reason )
這里我們知道這個網(wǎng)站根本不存在的,會報錯,我們捕捉該異常可以保證程序繼續(xù)運行,我們可以執(zhí)行重試操作
我們也可以查看官網(wǎng) https://docs.python.org/3/library/urllib.error.html#module-urllib.error
5,URL解析
urlparse模塊
主要用戶解析URL的模塊,下面我們先來一個簡單的示例
from urllib .parse import urlparse
result = urlparse ( 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1 ' )
print ( type (result ),result )
這里我們看下輸出結(jié)果:
該方法可以進行url的拆分
也可以制定請求方式http,或者https方式請求
from urllib .parse import urlparse
?
result = urlparse ('www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1' , scheme ='https' )
print (result )
輸出結(jié)果如下所示:
在這里我們看到了,請求被制定了https請求
我們會看到輸出結(jié)果里包含一個fragents,我們想將framents拼接到query后面,我們可以這樣來做
from urllib .parse import urlparse
?
result = urlparse ( 'http://www.baidu.com/index.html;user?id=5#commont ' , allow_fragments = False )
print (result )
輸出結(jié)果為
如果沒有frament,則拼接到path內(nèi)
示例:
我們現(xiàn)在知道了URl怎么進行拆分,如果我們得到了URl的集合,例如這樣dada = ['http','www.baidu.com','index.html','user','a=6','comment']
我們可以使用urlunparse
還有urljoin,主要是來進行url的拼接的,接下來我們來看下我們的示例:
以后面的為基準,如果有就留下,如果沒有就從前面取。
如果我們的有了一個字典類型的參數(shù),和一個url,我們想發(fā)起get請求(上一期說過get請求傳參),我們可以這樣來做,
在這里我們需要注意的是,url地址后面需要自行加一個‘?’。
最后還有一個urllib.robotparser,主要用robot.txt文件的官網(wǎng)有一些示例,由于這個不常用,在這里我做過多解釋。
官網(wǎng)地址:https://docs.python.org/3/library/urllib.robotparser.html#module-urllib.robotparser 感興趣的小伙伴可以自行閱讀官方文檔。
到這里我們就把urllib的基本用法全部說了一遍,可以自己嘗試寫一些爬蟲程序了(先用正則解析,后期我們有更簡單的方法)。
想更深入的研讀urllib庫,可以直接登陸官方網(wǎng)站直接閱讀其源碼。官網(wǎng)地址: https://docs.python.org/3/library/urllib.html
注意:很多小伙伴看到我的代碼直接復(fù)制過去,但發(fā)現(xiàn)直接粘貼會報錯,還需要自己刪除多余的空行,在這里我并不建議你們復(fù)制粘貼,后期我們整理一個github供大家直接使用。
下一篇文章我會弄一篇關(guān)于Requests包的使用,個人感覺比urllib更好用,敬請期待。
感謝大家的閱讀,不正確的地方,還希望大家來斧正,鞠躬,謝謝。
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
