网络请求urllib库使用总结
網(wǎng)絡(luò)請求urllib庫使用總結(jié)
目錄
- 網(wǎng)絡(luò)請求urllib庫使用總結(jié)
- 1.概述
- 2.Urllib庫基本使用
- 2.1.Urllib庫快速上手
- 1.完成一次簡單的get請求
- 2.read()函數(shù)介紹
- 3.獲取其他響應(yīng)信息
- 2.2.urlretrieve()函數(shù)下載數(shù)據(jù)
- 1.urlretrieve()函數(shù)基本使用
- 2.3.構(gòu)建請求對象
- 1.請求一個(gè)https網(wǎng)站
- 2.攻破UA反爬策略
- 2.4.字符編碼集轉(zhuǎn)換
- 1.發(fā)送中文參數(shù)請求例子
- 2.字符編碼表介紹
- 3.字符編碼表轉(zhuǎn)換
- 2.5.發(fā)送post請求
- 2.6.Handler處理器定制動(dòng)態(tài)參數(shù)請求頭
- 1.Handler基本使用
- 2.Handler實(shí)現(xiàn)代理訪問
- 3.代理池
1.概述
Urllib庫是python自帶的發(fā)送網(wǎng)絡(luò)請求庫,可以滿足日常接口請求接收響應(yīng)數(shù)據(jù)任務(wù),在實(shí)際場景中發(fā)揮出它的價(jià)值還需要對這個(gè)庫做一些了解,才能熟練使用它完成我們的需求,關(guān)于urllib庫的使用都在這篇文章中進(jìn)行總結(jié)。
2.Urllib庫基本使用
2.1.Urllib庫快速上手
1.完成一次簡單的get請求
通過發(fā)送一個(gè)get請求,獲取響應(yīng)內(nèi)容的示例快速掌握urllib庫使用
import urllib.request# 定義訪問的url地址 url = 'http://www.baidu.com'# 模擬瀏覽器向服務(wù)器發(fā)送請求,獲取響應(yīng)response ''' urlopen 返回類型是 http.client.HTTPResponse 類對象 ''' response = urllib.request.urlopen(url)# 獲取響應(yīng)中頁面的源碼 content = response.read() print(content)運(yùn)行g(shù)et請求查看返回結(jié)果
b'<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name="referrer"><meta name="theme-color" content="#ffffff"><meta name="description" content="\xe5\x85\xa8\xe7\x90\x83\xe9\xa2\x86\xe5\x85\x88\xe7\x9a\x84\xe4\xb8\xad\xe6\x96\x87\xe6\x90\x9c\xe7\xb4\xa2\xe5\xbc\x95\xe6\x93\x8e\xe3\x80\x81\xe8\x87\xb4\xe5\x8a\x9b\xe4\xba\x8e\xe8\xae\xa9\xe7\xbd\x91\xe6\xb0\x91\xe6\x9b\xb4\xe4\xbe\xbf\xe6\x8d\xb7\xe5\x9c\xb0\xe8\x8e\xb7\xe5\x8f\x96\xe4\xbf\xa1\xe6\x81\xaf\xef\xbc\x8c\xe6\x89\xbe\xe5\x88\xb0\xe6\x89\x80\xe6\xb1\x82\xe3\x80\x82\xe7\x99\xbe\xe5\xba\xa6\xe8\xb6\x85\xe8\xbf\x87\xe5\x8d\x83\xe4\xba\xbf\xe7\x9a\x84\xe4\xb8\xad\xe6\x96\x87\xe7\xbd\x91\xe9\xa1\xb5\xe6\x95\xb0\xe6\x8d\xae\xe5\xba\x93\xef\xbc\x8c\xe5\x8f\xaf\xe4\xbb\xa5\xe7\x9e\xac\xe9\x97\xb4\xe6\x89\xbe\xe5\x88\xb0\xe7\x9b\xb8\xe5\x85\xb3\xe7\x9a\x84\xe6\x90\x9c\xe7\xb4\xa2\xe7\xbb\x93\xe6\x9e\x9c\xe3\x80\x82"><link rel="shortcut icon" href="/favicon.ico" ...省略后面的內(nèi)容 ...查看返回的數(shù)據(jù)發(fā)現(xiàn)開頭有個(gè)b字母,這個(gè)代表當(dāng)前數(shù)據(jù)是二進(jìn)制的字節(jié)碼,是將字符串編譯后給機(jī)器看的,中文顯示格式為\xe5\x85。
這是因?yàn)閞ead()函數(shù)返回的數(shù)據(jù)就是一個(gè)字節(jié)碼,需要解碼轉(zhuǎn)為字符串后才會(huì)顯示中文。可以使用decode()函數(shù)解碼,解碼時(shí)輸入它的字符編碼要和返回信息的編碼一致中文才不會(huì)顯示亂碼。
如何知道使用什么編碼那,在返回?cái)?shù)據(jù)的請求頭都會(huì)顯示它的編碼字符集,例如上面返回結(jié)果數(shù)據(jù)的第一行charset=utf-8 就是他的字符集,使用它來解碼。
# 獲取響應(yīng)中頁面的源碼 ''' read()返回的信息是字節(jié)碼,通過decode()函數(shù)將字節(jié)碼轉(zhuǎn)為字符串 ''' content = response.read().decode('utf-8')查看字節(jié)碼解碼為字符串運(yùn)行結(jié)果
<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name="referrer"><meta name="theme-color" content="#ffffff"><meta name="description" content="全球領(lǐng)先的中文搜索引擎、致力于讓網(wǎng)民更便捷地獲取信息,找到所求。百度超過千億的中文網(wǎng)頁數(shù)據(jù)庫,可以瞬間找到相關(guān)的搜索結(jié)果。"><link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /><link rel="search" type="application/opensearchdescription+xml" href="/content-search.xml" title="百度搜索" />請求返回的數(shù)據(jù)中開頭的b已經(jīng)不在了,說明現(xiàn)在是字符串類型,再看中文已經(jīng)正確顯示。現(xiàn)在使用urllib庫完成了get請求。
2.read()函數(shù)介紹
上面的示例中已經(jīng)使用read函數(shù)獲取了響應(yīng)數(shù)據(jù),下面介紹下read函數(shù)的其他使用方式。
# read函數(shù)默認(rèn)是按照一個(gè)字節(jié)一個(gè)字節(jié)讀取數(shù)據(jù) content = response.read().decode('utf-8') print(content)# 獲取指定長度的字節(jié) content = response.read(5) print(content) # 結(jié)果輸出5個(gè)字節(jié) b'<!DOC'# 讀取一行數(shù)據(jù) content = response.readline() print(content)# 讀取多行數(shù)據(jù) content = response.readlines() print(content)3.獲取其他響應(yīng)信息
# 返回狀態(tài)碼 print(response.getcode()) # 返回url地址 print(response.geturl())# 獲取header頭 print(response.getheaders())2.2.urlretrieve()函數(shù)下載數(shù)據(jù)
如果我們需要將返回?cái)?shù)據(jù)中的文件、圖片、視頻等下載到本地,使用urlretrieve()函數(shù)可以下載我們需要的內(nèi)容。
1.urlretrieve()函數(shù)基本使用
# 下載圖片 url_img = 'http://pic3.zhimg.com/v2-a08aad3a5f85058844f4237919449ee4_r.jpg?source=172ae18b' # url:下載文件路徑 filename:保存文件的名稱 urllib.request.urlretrieve(url=url_img, filename='cat.jpg')# 下載視頻 url_video = 'https://tv.sohu.com/v/dXMvMTY0NzEzNTc3LzU2NzEwOTQ5LnNodG1s.mp4' urllib.request.urlretrieve(url=url_video, filename='xz.mp4')2.3.構(gòu)建請求對象
為什么要構(gòu)建請求對象那?
當(dāng)我們發(fā)送請求爬取數(shù)據(jù)的時(shí)候相對的就會(huì)有反爬蟲策略防止網(wǎng)站數(shù)據(jù)被爬取。當(dāng)我們遇到反爬策略時(shí)還想爬取到數(shù)據(jù)就需要根據(jù)反爬策略做出應(yīng)對的辦法,構(gòu)建請求對象就是一種應(yīng)對反爬策略的辦法。下面通過一個(gè)例子感受下通過構(gòu)建請求對象如何攻破反爬策略。
1.請求一個(gè)https網(wǎng)站
下面是一個(gè)訪問百度網(wǎng)站請求,但是這次訪問地址協(xié)議由http改為了https協(xié)議,我們看下會(huì)發(fā)生什么。
import ssl import urllib.request# Mac系統(tǒng)會(huì)校驗(yàn)ssl證書,通過全局取消ssl證書驗(yàn)證避免報(bào)錯(cuò) ssl._create_default_https_context = ssl._create_unverified_contexturl = 'https://www.baidu.com' response = urllib.request.urlopen(url) content = response.read().decode('utf-8') print(content)運(yùn)行示例查看結(jié)果
<html> <head><script>location.replace(location.href.replace("https://","http://"));</script> </head> <body><noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript> </body> </html>查看結(jié)果返現(xiàn)訪問百度沒有返回正確的信息,這個(gè)就是百度的反爬策略,下面來詳細(xì)介紹下這個(gè)策略以及如何攻破這個(gè)策略拿到數(shù)據(jù)。
2.攻破UA反爬策略
在介紹UA策略前先普及下url的組成,它有6個(gè)部分組成。
https://www.baidu.com/s?wd=周杰倫
- 協(xié)議:http/https
- 主機(jī)地址:www.baidu.com
- 端口號(hào):http默認(rèn)80 / https默認(rèn)443
- 路徑:端口號(hào)后面的 s
- 參數(shù): 問號(hào)后面 wd=周杰倫
- 錨點(diǎn):#
當(dāng)我們使用https協(xié)議訪問百度時(shí),它會(huì)檢測請求端的UA是否包含正常瀏覽器發(fā)起請求信息,如果不包含則認(rèn)為是爬蟲就會(huì)拒絕訪問。
那么什么是UA那,我們要怎么構(gòu)建一個(gè)合格的UA突破反爬那,下面介紹將解決這些疑問。
什么是UA
UA是User Agent中文名為用戶代碼,簡稱UA。 他是一個(gè)特殊的字符串,向服務(wù)器提交當(dāng)前客戶端使用的操作系統(tǒng)及版本、CPU類型、瀏覽器內(nèi)核及版本號(hào)等。
查看當(dāng)前瀏覽器的UA
在瀏覽器上右鍵打開檢查功點(diǎn)擊點(diǎn)擊網(wǎng)絡(luò)標(biāo)簽,然后訪問一個(gè)網(wǎng)站,在標(biāo)頭的最下面就可以看到UA信息。
構(gòu)建請求頭攜帶UA請求網(wǎng)站
當(dāng)我們找到了瀏覽器的UA信息后就可以用它來構(gòu)建我們的請求對象,讓它帶著UA信息再次訪問網(wǎng)站。
運(yùn)行示例查看結(jié)果
<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta content="always" name="referrer"><meta name="theme-color" content="#ffffff"> <meta name="description" content="全球領(lǐng)先的中文搜索引擎、致力于讓網(wǎng)民更便捷地獲取信息,找到所求。百度超過千億的中文網(wǎng)頁數(shù)據(jù)庫,可以瞬間找到相關(guān)的搜索結(jié)果。">... ...在運(yùn)行結(jié)果中可以看到我們攻破了UA反爬策略拿到了百度的數(shù)據(jù)。
2.4.字符編碼集轉(zhuǎn)換
當(dāng)我們使用urllib庫發(fā)送網(wǎng)絡(luò)請求,主要包含兩個(gè)內(nèi)容請求數(shù)據(jù)和響應(yīng)數(shù)據(jù)。這兩個(gè)數(shù)據(jù)的中文如果希望服務(wù)器能正確處理,不出現(xiàn)亂碼那么就會(huì)與字符編碼表打交道,下面就來介紹下如何使用字符編碼表處理中文。
下面通過一個(gè)例子介紹如何使用編碼表處理請求中的中文。
1.發(fā)送中文參數(shù)請求例子
首先使用瀏覽器打開百度搜下字符編碼,點(diǎn)擊搜索。在瀏覽器的地址欄就能看到搜索的內(nèi)容,將它復(fù)制到pycharm編輯器中。
當(dāng)我們復(fù)制到編輯器后發(fā)現(xiàn)中文變成了亂碼,然后我們將亂碼部分改為我們要搜索的中文。
# 復(fù)制后的url https://cn.bing.com/search?q=%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81 # 修改后的url https://www.baidu.com/s?wd=字符編碼使用修改后的url發(fā)送請求代碼,看看是否能通過。
url = 'https://cn.bing.com/search?q=字符編碼' # 將UA信息放到headers字典中 headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.8' } # 構(gòu)建請求對象 request = urllib.request.Request(url=url, headers=headers) response = urllib.request.urlopen(request) content = response.read().decode('utf-8') print(content)運(yùn)行示例查看結(jié)果
UnicodeEncodeError: 'ascii' codec can't encode characters in position 14-17: ordinal not in range(128)運(yùn)行結(jié)果提示不能解析characters,它不在ascii 編碼表 range(128)范圍之內(nèi)。
2.字符編碼表介紹
上面的例子運(yùn)行結(jié)果拋出的異常中告訴我們中文不在ascii編碼表范圍之內(nèi),這個(gè)異常是什么意思那?下面先普及下字符編碼表再來揭曉答案。
由于計(jì)算機(jī)早起是在美國誕生的,因此只有127個(gè)字符被編碼到計(jì)算機(jī)中。這個(gè)編碼就被定義為ASCII編碼表,在表中只有大小寫字母,數(shù)字和一些符號(hào)。
隨著計(jì)算機(jī)的普及,只有127個(gè)字符的編碼表已經(jīng)不能滿足各個(gè)國家的需求,因此每個(gè)國家都制定了自己語言的編碼表,中國制定了GB2312,但是因?yàn)楦鱾€(gè)編碼表不通用,因此Unicode應(yīng)用而生,它把所有語言都統(tǒng)一到一套編碼表里,這樣就不會(huì)再出現(xiàn)亂碼了。
UTF,是UnicodeTransformation Format的縮寫,意為Unicode轉(zhuǎn)換格式。UTF-8是UNICODE的一種變長字符編碼,由Ken Thompson于1992年創(chuàng)建。現(xiàn)在已經(jīng)標(biāo)準(zhǔn)化為RFC 3629。UTF-8用1到6個(gè)字節(jié)編碼UNICODE字符。
了解了字符編碼表后上面遇到的異常就能解釋了,當(dāng)我們將瀏覽器中含有中文的url復(fù)制到pycharm工具中編程了亂碼,這是因?yàn)樵跒g覽器中網(wǎng)頁使用的是utf-8編碼表,而pycharm使用ASCII編碼表來解碼遇到中文自然就會(huì)出現(xiàn)亂碼。
當(dāng)我們將URL亂碼改為中文發(fā)送請求那么ASCII編碼表因?yàn)椴荒茉?27個(gè)編碼中對中文解碼因此拋出了異常。
3.字符編碼表轉(zhuǎn)換
現(xiàn)在知道了請求異常的原因后,我們可以通過編碼表對中文進(jìn)行轉(zhuǎn)碼,再發(fā)送請求解決我們的問題。
將中文轉(zhuǎn)為ASCII編碼
urllib庫為我們提供了編碼的函數(shù),通過urllib.parse.quote()函數(shù)將中文編碼為ASCII編碼字符,下面是將中文轉(zhuǎn)碼的例子。
# 通過urllib.parse.quote()函數(shù)將中文編碼為ASCII編碼字符 name = urllib.parse.quote('字符編碼') print(name)# 運(yùn)行結(jié)果 %E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81# 將輸出的結(jié)果和復(fù)制過來的url編碼對比他們是一致的。 url = 'https://cn.bing.com/search?q=%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81'使用轉(zhuǎn)碼后的字符發(fā)送請求,看看運(yùn)行結(jié)果。
import ssl import urllib.request # 全局取消ssl證書驗(yàn)證 ssl._create_default_https_context = ssl._create_unverified_contexturl = 'https://cn.bing.com/search?q=' name = urllib.parse.quote('字符編碼') url = url + name# 將UA信息放到headers字典中 headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.8' } # 構(gòu)建請求對象 request = urllib.request.Request(url=url, headers=headers) response = urllib.request.urlopen(request) content = response.read().decode('utf-8') print(content)運(yùn)行示例,查看返回結(jié)果返回了請求信息。
<!DOCTYPE html><html dir="ltr" lang="zh" xml:lang="zh" xmlns="http://www.w3.org/1999/xhtml" xmlns:Web="http://schemas.live.com/Web/"><script type="text/javascript" nonce="VnKdTkMMGjdfKEp3CTC1udDuwBYGrOuXYMoe4JWtpDc=" >//<![CDATA[ si_ST=new Date如果一個(gè)請求連接中有個(gè)多個(gè)參數(shù)且為中文,那么我們是不是要將所有中文參數(shù)都轉(zhuǎn)換一遍那,如果好幾十個(gè)都需要調(diào)用下urllib.parse.quote()函數(shù)轉(zhuǎn)換,再拼接url是不是很麻煩。下面我們就來介紹一個(gè)新的解決中文參數(shù)方法。
批量轉(zhuǎn)換Unicoe碼
urlencode()函數(shù)接收一個(gè)字典對象,將需要轉(zhuǎn)碼的中文參數(shù)放到字典中,然后批量轉(zhuǎn)換字符編碼。
從運(yùn)行的結(jié)果中可以看出它將多個(gè)中文參數(shù)轉(zhuǎn)為Unicode碼,同時(shí)將多個(gè)參數(shù)使用&符號(hào)拼接
下面使用這個(gè)函數(shù)發(fā)送請求批量轉(zhuǎn)換多個(gè)中文參數(shù)
# !/usr/bin/env python3 # -*-coding: UTF-8 -*- ''' @Author :Long @Date :2022/10/21 11:14 ''' import ssl import urllib.request import urllib.parse# 全局取消ssl證書驗(yàn)證 ssl._create_default_https_context = ssl._create_unverified_context #url地址 url = 'http://www.baidu.com/s?' data = {'wd': '周杰倫','sex': '男','location': '中國臺(tái)灣省' }# url參數(shù)中文轉(zhuǎn)為unicode字符編碼 param = urllib.parse.urlencode(data) # 拼接URL url = url +param # 將UA信息放到headers字典中 headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.8' } # 構(gòu)建請求對象 request = urllib.request.Request(url=url, headers=headers) response = urllib.request.urlopen(request) content = response.read().decode('utf-8') print(content)2.5.發(fā)送post請求
post請求和get請求最大的區(qū)別就是參數(shù)部分,post請求的參數(shù)不在url后面拼接,而是放在body中。
下面通過一個(gè)例子展示使用urllib庫發(fā)送post請求。
urllib發(fā)送post請求的例子寫好了,下面運(yùn)行看看結(jié)果。
{"errno":0,"data":[{"k":"spider","v":"n. \u8718\u86db; \u661f\u5f62\u8f6e\uff0c\u5341\u5b57\u53c9; \u5e26\u67c4\u4e09\u811a\u5e73\u5e95\u9505; \u4e09\u811a\u67b6"},{"k":"Spider","v":"[\u7535\u5f71]\u8718\u86db"},{"k":"SPIDER","v":"abbr. SEMATECH process induced damage effect revea"},{"k":"spiders","v":"n. \u8718\u86db( spider\u7684\u540d\u8bcd\u590d\u6570 )"},{"k":"spidery","v":"adj. \u50cf\u8718\u86db\u817f\u4e00\u822c\u7ec6\u957f\u7684; \u8c61\u8718\u86db\u7f51\u7684\uff0c\u5341\u5206\u7cbe\u81f4\u7684"}]}運(yùn)行結(jié)果顯示post請求成功返回?cái)?shù)據(jù),但是發(fā)現(xiàn)中文不能正確顯示都是\u5e26格式。觀察下這個(gè)返回內(nèi)容是不是一個(gè)json格式,那么在打印下他的格式。
# 打印類型 print(type(content)) # 結(jié)果 <class 'str'>輸出結(jié)果顯示內(nèi)容是str字符串類型,那么我們將它轉(zhuǎn)為json格式
# str 轉(zhuǎn) json content_json = json.loads(content) print(content_json)運(yùn)行代碼查看結(jié)果
{'errno': 0, 'data': [{'k': 'spider', 'v': 'n. 蜘蛛; 星形輪,十字叉; 帶柄三腳平底鍋; 三腳架'}, {'k': 'Spider', 'v': '[電影]蜘蛛'}, {'k': 'SPIDER', 'v': 'abbr. SEMATECH process induced damage effect revea'}, {'k': 'spiders', 'v': 'n. 蜘蛛( spider的名詞復(fù)數(shù) )'}, {'k': 'spidery', 'v': 'adj. 像蜘蛛腿一般細(xì)長的; 象蜘蛛網(wǎng)的,十分精致的'}]}2.6.Handler處理器定制動(dòng)態(tài)參數(shù)請求頭
在上面的學(xué)習(xí)中為了攻破UA反爬機(jī)制,我們使用urllib.request.Request()定制請求信息完成請求。這些定制的參數(shù)都是固定不變的,當(dāng)發(fā)送請求遇到動(dòng)態(tài)參數(shù)例如token、cookie每次請求都會(huì)變化的數(shù)據(jù)就不能用這種方式定制請求。
因此我們需要用Handler處理器定制動(dòng)態(tài)參數(shù)請求頭
1.Handler基本使用
下面通過一個(gè)簡單示例,完成一個(gè)post請求了解下handler基本使用。
import urllib.request import ssl # 全局取消ssl證書驗(yàn)證 ssl._create_default_https_context = ssl._create_unverified_contexturl = 'https://fanyi.baidu.com'headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.8' }request = urllib.request.Request(url=url, headers=headers)# 構(gòu)建handler對象 (handler、build.opener、open)# 獲取handler對象 handler = urllib.request.HTTPHandler() # 獲取opener對象 opener = urllib.request.build_opener(handler) # 獲取open方法,發(fā)送請求 response = opener.open(request) #讀取響應(yīng)數(shù)據(jù) content = response.read().decode('utf-8') print(content)2.Handler實(shí)現(xiàn)代理訪問
在爬蟲過程中可能會(huì)遇到IP封鎖這也是一個(gè)反爬蟲策略,當(dāng)檢測到同一個(gè)IP在短時(shí)間內(nèi)重復(fù)方法網(wǎng)站時(shí)就可以對這個(gè)IP封鎖,禁止它訪問,以此來達(dá)到防止爬蟲作用。下面將通過Handler實(shí)現(xiàn)代理方式攻破這個(gè)反爬蟲策略。
import urllib.request import ssl# 全局取消ssl證書驗(yàn)證 ssl._create_default_https_context = ssl._create_unverified_contexturl = 'https://www.baidu.com/s?wd=ip'headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.8' }request = urllib.request.Request(url=url, headers=headers)# 設(shè)置代理訪問地址 proxies = {'http':'223.96.90.216:8085' } # 創(chuàng)建代理處理器 handler = urllib.request.ProxyHandler(proxies=proxies) # 獲取opener對象 opener = urllib.request.build_opener(handler) # 通過代理地址發(fā)送請求 response = opener.open(request) response = urllib.request.urlopen(request) content = response.read().decode('utf-8')with open('dali.html', 'w', encoding='utf-8') as fp:fp.write(content)3.代理池
當(dāng)我們使用一個(gè)代理IP地址訪問同一個(gè)網(wǎng)站,數(shù)次請求后也會(huì)被封,所以我們需要使用許多的代理IP訪問,這個(gè)就是代理池。
import urllib.request import ssl# 全局取消ssl證書驗(yàn)證 ssl._create_default_https_context = ssl._create_unverified_contexturl = 'https://www.baidu.com/s?wd=ip'headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.8' }request = urllib.request.Request(url=url, headers=headers)proxies_pool = [{'http':'223.96.90.216:8085'},{'http':'223.96.90.216:8085'} ]# 隨機(jī)選擇代理池中的IP import random proxies = random.choice(proxies_pool) handler = urllib.request.ProxyHandler(proxies=proxies) # 獲取opener對象 opener = urllib.request.build_opener(handler) # 獲取open方法 response = opener.open(request) response = urllib.request.urlopen(request) content = response.read().decode('utf-8')with open('dali.html', 'w', encoding='utf-8') as fp:fp.write(content)總結(jié)
以上是生活随笔為你收集整理的网络请求urllib库使用总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 水平集(Level Set)的基本方法
- 下一篇: 计算机网络与多媒体试卷,《计算机网络与多