一诈胜、Net_Crawler-urllib庫使用

一、urllib.requet

  • urllib.request

用來發(fā)送請求獲取響應(yīng)

response_obj =urllib.request.urlopen(url) 獲得HTTPResponse object 響應(yīng)對象 

response_obj.read()       # 獲取的是二進(jìn)制數(shù)據(jù)
response_obj.read().decode()   # 將數(shù)據(jù)轉(zhuǎn)化為字符串(默認(rèn)utf8編碼)

response_obj.readline()     # 按行讀取
response_obj.readlines()    # 獲取多行 裝入列表
response_obj.getcode()      # 服務(wù)器響應(yīng)的狀態(tài)碼
response_obj.geturl()       # 響應(yīng)的來源
response_obj.getheaders()   # 獲取響應(yīng)頭   


# 傳入 url路徑 和 本地的路徑(將來獲取數(shù)據(jù)存到哪里)
# 圖片
urllib.request.urlretrieve(img_url,'./download/pengyou.jpg')


# 文本
text_url = 'http://www.baidu.com/'
urllib.request.urlretrieve(text_url,'./download/baidu.html')


# 視頻
video_url = 'http://mvvideo11.meitudata.com/5bcc0c5280f832321.mp4?k=15493c77ef25f5e2995eb033f6addc48&t=5bd168a3'
urllib.request.urlretrieve(video_url,'./download/cole.mp4')

  • urllib.parse
import urllib.parse

# 對url 中文進(jìn)行編碼
code = urllib.parse.quote('狗子')
print(code)

# 對url 中文進(jìn)行解碼
code1 = urllib.parse.unquote('%E7%8B%97%E5%AD%90')
print(code1)


url = 'https://image.baidu.com/search/index?tn=baiduimage&'
date = {
    'id':'班助',
    'sex':'男',
    'age':'十八'
}
# urlencode傳入請求的數(shù)據(jù)對象 返回url編碼后的字符串
query_string = urllib.parse.urlencode(date)
# print(query_string)
print(url+query_string) 
結(jié)果:https://image.baidu.com/search/index?tn=baiduimage&id=%E7%8F%AD%E5%8A%A9&sex=%E7%94%B7&age=%E5%8D%81%E5%85%AB

# 創(chuàng)建請求對象
# 使用Request 傳入 url(必選參數(shù)) data(請求參數(shù)璃赡,需要字節(jié)流)  headers(請求頭)
request_obj = urllib.request.Request(url,headers=headers)
# urlopen的參數(shù) 可以是簡單的字符串 也可以是請求對象
# 如果傳入的請求對象 則可以進(jìn)行更高級的設(shè)置(比如設(shè)置headers)
# 獲得相應(yīng)對象
response_obj = urllib.request.urlopen(request_obj)

表單數(shù)據(jù)處理
    # 處理表單數(shù)據(jù) 先變成符合url規(guī)則的字符串 然后再把字符串轉(zhuǎn)換成字節(jié)碼
    bytes_data = urllib.parse.urlencode(form_data).encode()
    response = urllib.request.urlopen(request, data=bytes_data)
  • urllib.error
異常處理:Exception  官方的異呈硇基類
URLError\HTTPError是Exception的子類遥倦,在向url發(fā)送請求的時(shí)候,會(huì)出現(xiàn)的一些異常情況
HTTPError是URLError的子類
所以 如果兩個(gè)異常都要捕獲 要把http放上面 否則都會(huì)被URL捕獲
import urllib.request
import urllib.error

url = 'http://www.baidu.com'
try:
    response = urllib.request.urlopen(url)
    print(response)
except urllib.error.HTTPError as e:
    print("HTTP錯(cuò)誤")
except urllib.error.URLError as e:
    print("URL地址有誤")
  • Handler處理器占锯、自定義Opener
urllib.request.urlopen() 函數(shù)實(shí)現(xiàn)簡單的發(fā)送請求袒哥,不能定制請求頭
引入了構(gòu)建請求對象
urllib.request.Request() 創(chuàng)建的request對象可以定制頭部,但不能實(shí)現(xiàn)設(shè)置代理烟央、攜帶cookie等更高級的功能
引入了 Handler和Opener
可以實(shí)現(xiàn)代理统诺、攜帶cookie等高級功能
import urllib.request
import urllib.error

# 1. 創(chuàng)建handler對象
handler = urllib.request.HTTPHandler()  # 用于保存http的cookie
# 2. 將handler傳入函數(shù)獲取opener
opener = urllib.request.build_opener(handler) 
url = "http://www.baidu.com/"
# 3. 通過open()函數(shù)來發(fā)送請求
# response = opener.open(url)  # 可以傳url字符串 也可以傳request對象
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " \
             "(KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
headers = {"User-Agent": user_agent}
request = urllib.request.Request(url, headers=headers)
response = opener.open(request)
print(response)
  • 設(shè)置代理
代理:作為中間人,幫助客戶端(瀏覽器)訪問其他服務(wù)器的服務(wù)器

代碼請求中設(shè)置代理

import urllib.request
proxy = {"http": "114.226.65.220:6666"}  # {"協(xié)議":"地址:端口"}
# 1. 設(shè)置代理使用 ProxyHandler
handler = urllib.request.ProxyHandler(proxy)
# 2. 把創(chuàng)建的handler傳入build函數(shù) 創(chuàng)建出opener
opener = urllib.request.build_opener(handler)
url = "http://www.baidu.com/s?wd=ip"  # 請求字符串
# 客戶端信息
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " \
             "(KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
headers = {"User-Agent": user_agent}
request = urllib.request.Request(url, headers=headers)
# 3. 使用opener打開
response = opener.open(request)
# 4. 寫入本地文件 以便查看效果
with open("ip.html", "wb") as fp:
    fp.write(response.read())
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疑俭,一起剝皮案震驚了整個(gè)濱河市粮呢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钞艇,老刑警劉巖啄寡,帶你破解...
    沈念sama閱讀 210,835評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異哩照,居然都是意外死亡挺物,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評論 2 383
  • 文/潘曉璐 我一進(jìn)店門飘弧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來识藤,“玉大人砚著,你說我怎么就攤上這事〕彰粒” “怎么了稽穆?”我有些...
    開封第一講書人閱讀 156,481評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赶撰。 經(jīng)常有香客問我舌镶,道長,這世上最難降的妖魔是什么豪娜? 我笑而不...
    開封第一講書人閱讀 56,303評論 1 282
  • 正文 為了忘掉前任餐胀,我火速辦了婚禮,結(jié)果婚禮上瘤载,老公的妹妹穿的比我還像新娘否灾。我一直安慰自己,他們只是感情好惕虑,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,375評論 5 384
  • 文/花漫 我一把揭開白布坟冲。 她就那樣靜靜地躺著,像睡著了一般溃蔫。 火紅的嫁衣襯著肌膚如雪健提。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,729評論 1 289
  • 那天伟叛,我揣著相機(jī)與錄音私痹,去河邊找鬼。 笑死统刮,一個(gè)胖子當(dāng)著我的面吹牛紊遵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侥蒙,決...
    沈念sama閱讀 38,877評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼暗膜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鞭衩?” 一聲冷哼從身側(cè)響起学搜,我...
    開封第一講書人閱讀 37,633評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎论衍,沒想到半個(gè)月后瑞佩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,088評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坯台,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,443評論 2 326
  • 正文 我和宋清朗相戀三年炬丸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜒蕾。...
    茶點(diǎn)故事閱讀 38,563評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稠炬,死狀恐怖焕阿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酸纲,我是刑警寧澤捣鲸,帶...
    沈念sama閱讀 34,251評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站闽坡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏愁溜。R本人自食惡果不足惜疾嗅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,827評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冕象。 院中可真熱鬧代承,春花似錦、人聲如沸渐扮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽墓律。三九已至膀估,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耻讽,已是汗流浹背察纯。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留针肥,地道東北人饼记。 一個(gè)月前我還...
    沈念sama閱讀 46,240評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像慰枕,于是被迫代替她去往敵國和親具则。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,435評論 2 348

推薦閱讀更多精彩內(nèi)容