python爬蟲(chóng)之請(qǐng)求模塊urllib的基本使用
前言
??在實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲(chóng)的爬取工作時(shí),就必須使用網(wǎng)絡(luò)請(qǐng)求,只有進(jìn)行了網(wǎng)絡(luò)請(qǐng)求才可以對(duì)響應(yīng)結(jié)果中的數(shù)據(jù)進(jìn)行提取,urllib模塊是python自帶的網(wǎng)絡(luò)請(qǐng)求模塊,無(wú)需安裝,導(dǎo)入即可使用。下面將介紹如果使用python中的urllib模塊實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求??
urllib的子模塊
模塊 | 描述 |
---|---|
urllib.request | 用于實(shí)現(xiàn)基本HTTP請(qǐng)求的模塊 |
urllib.error | 異常處理模塊,如果在發(fā)送網(wǎng)絡(luò)請(qǐng)求的過(guò)程時(shí)出現(xiàn)錯(cuò)誤,可以捕獲異常進(jìn)行有效處理 |
urllib.parse | 用于解析URL的模塊 |
urllib.robotparser | 用于解析robots.txt文件,判斷網(wǎng)站是否可以爬取信息 |
HttpResponse常用方法與屬性獲取信息
通過(guò)urllib.request() 獲取的對(duì)象類(lèi)型是HttpReponse,有以下幾種常用的方法,示例如下:
import urllib.request # 定義一個(gè)url(你要爬取的網(wǎng)址) url = 'https://www.baidu.com' # 添加請(qǐng)求頭信息 headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36" } # 創(chuàng)建Request對(duì)象 res = urllib.request.Request(url=url, headers=headers) # 模擬瀏覽器向服務(wù)器發(fā)送網(wǎng)絡(luò)請(qǐng)求 response = urllib.request.urlopen(res) # read()函數(shù)可以獲取響應(yīng),但返回的響應(yīng)格式是二進(jìn)制的,需要解碼 # 解碼:decode('編碼格式') 編碼格式在Response Headers,Content_Type里面查看 print('baidu官網(wǎng)HTML代碼如下:\n', response.read().decode('utf-8')) # HTTPResponse這個(gè)類(lèi)型 # 常見(jiàn)方法:read、readline、readlines、getcode、status、geturl、getheaders、getheader # print(type(response)) # response是HTTPResponse的類(lèi)型 # (1) 按照一個(gè)字節(jié)一個(gè)字節(jié)去讀 content = response.read() print(content) # 讀取具體的n個(gè)字節(jié),在read()函數(shù)中傳參即可 content2 = response.read(5) print(content2) # (2) 按行讀取,但是只能讀取一行 content3 = response.readline() print(content3) # (3) 按行讀取,并且讀取所有行 content4 = response.readlines() print(content4) # (4) 返回狀態(tài)碼的方法:200狀態(tài)碼沒(méi)有問(wèn)題,其他的狀態(tài)碼可能有問(wèn)題 print('響應(yīng)狀態(tài)碼為', response.getcode()) print('響應(yīng)狀態(tài)碼為', response.status) # (5) 返回訪(fǎng)問(wèn)的目標(biāo)的url地址 print('響應(yīng)訪(fǎng)問(wèn)的url地址為', response.geturl()) # (6) 獲取的是響應(yīng)頭所有信息 print('響應(yīng)頭所有信息為', response.getheaders()) # (7)獲取響應(yīng)頭指定信息 print('響應(yīng)頭指定信息為', response.getheader('Content-Type'))
urlli.parse的使用(一般用于處理帶中文的url)
??使用urllib模塊向一個(gè)攜帶中文字樣的url發(fā)送請(qǐng)求時(shí) ,會(huì)報(bào)錯(cuò):‘ascii’ codec can’t encode characters in position 10-11: ordinal not in range(128)??
字典格式的處理方式
步驟
(1)導(dǎo)入request和parse模塊
(2)添加請(qǐng)求頭header(重構(gòu)ua)反反爬第一步
(3)使用urllib.parse方法處理url中的中文字樣(使用字典存儲(chǔ)要處理的內(nèi)容,經(jīng)過(guò)parse處理返回正常的url地址)
(4)使用+拼接固定的url地址和經(jīng)過(guò)處理后的url地址
(5)創(chuàng)建請(qǐng)求對(duì)象
(6)使用urlopen()模擬瀏覽器像服務(wù)器發(fā)送網(wǎng)絡(luò)請(qǐng)求
(7)打印獲取響應(yīng)對(duì)象里面的內(nèi)容,并進(jìn)行decode解碼
import urllib.parse # 導(dǎo)入parse解析模塊 import urllib.request # 導(dǎo)入request模塊 url = 'https://www.baidu.com/s?wd=酷我' header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36" } # 通過(guò)urllib.parse處理url中的中文字樣--> 得到可以通過(guò)urllib發(fā)送請(qǐng)求的url地址 # 字典格式的處理方式 org = {'wd': '酷我'} # 經(jīng)過(guò)處理之后返回wd=%E9%85%B7%E6%88%9 result = urllib.parse.urlencode(org) # 使用+拼接固定的url地址和經(jīng)過(guò)處理的url地址 # https://www.baidu.com/s?wd=%E9%85%B7%E6%88%91 new_url = 'https://www.baidu.com/s?' + result # 1、構(gòu)造請(qǐng)求對(duì)象 res = urllib.request.Request(new_url, headers=header) # 2、發(fā)送請(qǐng)求 獲取響應(yīng) response = urllib.request.urlopen(res) # 3、獲取響應(yīng)對(duì)象里面的內(nèi)容(獲取網(wǎng)頁(yè)源碼) print(response.read().decode('utf-8'))
字符串格式的處理方式
步驟
(1)導(dǎo)入request和parse模塊
(2)添加請(qǐng)求頭header(重構(gòu)ua)反反爬第一步
(3)使用urllib.parse.quote方法處理url中的中文字樣(用一個(gè)變量存儲(chǔ)酷我字樣,使用parse.quote處理即可返回酷我經(jīng)過(guò)處理的url地址)
(4)使用+拼接固定的url地址(需要加上wd=)和經(jīng)過(guò)處理后的url地址(酷我字樣處理后的url地址)
(5)創(chuàng)建請(qǐng)求對(duì)象
(6)使用urlopen()模擬瀏覽器像服務(wù)器發(fā)送網(wǎng)絡(luò)請(qǐng)求
(7)打印獲取響應(yīng)對(duì)象里面的內(nèi)容,并進(jìn)行decode解碼
import urllib.request import urllib.parse header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36" } # 第二種 字符串格式的處理方式 string_org = '酷我' # %E9%85%B7%E6%88%91 string_result = urllib.parse.quote(string_org) # 使用+拼接固定的url地址(需要加上wd=)和經(jīng)過(guò)處理后的url地址 new_string_url = 'https://www.baidu.com/s?wd=' + string_result # 1、構(gòu)造請(qǐng)求對(duì)象 res = urllib.request.Request(new_string_url, headers=header) # 2、發(fā)送請(qǐng)求 獲取響應(yīng) response = urllib.request.urlopen(res) # 3、獲取響應(yīng)對(duì)象里面的內(nèi)容,并進(jìn)行decode解碼 print(response.read().decode('utf-8'))
簡(jiǎn)單了解web前端
HTTP基本原理
HTTP(HpperText Transfer Protocol),即超文本傳輸協(xié)議,是互聯(lián)網(wǎng)上應(yīng)用廣泛的一種網(wǎng)絡(luò)協(xié)議。HTTP是利用TCP在Web服務(wù)器和客戶(hù)端之間傳輸信息的協(xié)議,客戶(hù)端使用Web瀏覽器發(fā)起HTTP請(qǐng)求給Web服務(wù)器,Web服務(wù)器發(fā)送被請(qǐng)求的信息給客戶(hù)端。
HTTP協(xié)議常用的請(qǐng)求方法
方法 | 描述 |
---|---|
GET | 請(qǐng)求指定的頁(yè)面信息,并返回響應(yīng)內(nèi)容 |
POST | 向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件),數(shù)據(jù)被包含在請(qǐng)求體中。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立、或已有資源的修改 |
GEAD | 類(lèi)似于GET請(qǐng)求,只不過(guò)返回的響應(yīng)中沒(méi)有具體的內(nèi)容,用于獲取報(bào)文頭部信息 |
PUT | 從客戶(hù)端像服務(wù)器傳送的數(shù)據(jù)取代指定的文檔內(nèi)容 |
DELEAE | 請(qǐng)求服務(wù)器刪除指定內(nèi)容 |
OPTIONS | 允許客戶(hù)端查看服務(wù)器性能 |
HTML狀態(tài)碼及其含義
代碼 | 含義 |
---|---|
信息,請(qǐng)求收到,繼續(xù)處理 | |
2** | 成功,行為被成功地接受、理解和采納 |
3** | 重定向,為了完成請(qǐng)求必須進(jìn)一步執(zhí)行的動(dòng)作 |
4** | 客戶(hù)端錯(cuò)誤,請(qǐng)求包含語(yǔ)法錯(cuò)誤或者請(qǐng)求無(wú)法實(shí)現(xiàn) |
5** | 服務(wù)器錯(cuò)誤,服務(wù)器不能實(shí)現(xiàn)一種明顯無(wú)效的請(qǐng)求 |
瀏覽器中的請(qǐng)求與響應(yīng)
??最好使用谷歌瀏覽器??
使用谷歌瀏覽器訪(fǎng)問(wèn)baidu官網(wǎng),查看請(qǐng)求和響應(yīng)的具體步驟如下:
1在谷歌瀏覽器輸入網(wǎng)址進(jìn)入baidu官網(wǎng)
2按下F12鍵(或單擊鼠標(biāo)右鍵選擇”檢查“選項(xiàng)),審查頁(yè)面元素
3單擊谷歌瀏覽器調(diào)試工具中“Network”選項(xiàng),按下F5 鍵(或手動(dòng)刷新頁(yè)面),單擊調(diào)試工具中的“Name”欄目下的網(wǎng)址,查看請(qǐng)求與響應(yīng)信息。
Genral
Geral概述關(guān)鍵信息如下:
Request URL:請(qǐng)求的URL網(wǎng)址,也就是服務(wù)器的URL網(wǎng)址
Request Method:請(qǐng)求方式為GET
Status Code:狀態(tài)碼為200,即成功返回響應(yīng)。
Remote Address :服務(wù)器IP地址是39.156.66.14:443,端口號(hào)是443
?http的端口號(hào)是80,https的端口號(hào)是443?
Request Headers請(qǐng)求頭
Response Headers響應(yīng)頭
?爬取baidu官網(wǎng)HTML源代碼?
添加請(qǐng)求頭信息(重構(gòu)user_agent)
User-Agent(簡(jiǎn)稱(chēng)UA),記錄了操作系統(tǒng)的信息和瀏覽器的信息
以www.baidu.com為例演示
當(dāng)不重構(gòu)ua時(shí),直接訪(fǎng)問(wèn)網(wǎng)址,只會(huì)返回baidu的部分源碼,因?yàn)閎aidu識(shí)別出來(lái)我們是爬蟲(chóng)
這時(shí)就需要重構(gòu)ua,偽裝自己是瀏覽器發(fā)起請(qǐng)求
查看瀏覽器ua的方法 按F12鍵打開(kāi)Network,在request headers里面就可以看到瀏覽器的ua.
創(chuàng)建Request對(duì)象
創(chuàng)建具有請(qǐng)求頭信息的Request對(duì)象,然后使用urlopen()方法向“baidu”地址發(fā)送一個(gè)GET請(qǐng)求,利用字典添加請(qǐng)求頭信息最常用的用法就是修改User-Agent來(lái)偽裝瀏覽器,例如
headers = {“user-agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36”
}表示偽裝成谷歌瀏覽器進(jìn)行網(wǎng)絡(luò)請(qǐng)求,可以獲取baidu的全部源代碼
import urllib.request # 請(qǐng)求對(duì)象的定制:為了解決反爬蟲(chóng)的第一種手段 url = 'https://www.baidu.com' # 用戶(hù)代理:UA header = { 'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36' } # urlopen()方法中不能傳參字典,因而用戶(hù)代理UA不能作為傳參傳入 # 此時(shí)需要定制一個(gè)請(qǐng)求對(duì)象: # 如果request = urllib.request.Request(url,headers) 寫(xiě)會(huì)報(bào)錯(cuò) request = urllib.request.Request(url, headers=header) response = urllib.request.urlopen(request) print('baidu官網(wǎng)HTML代碼如下:\n', response.read().decode('utf-8'))
??擴(kuò)展知識(shí)??
1.使用with open 和 open保存圖片
import requests # 導(dǎo)入requests模塊 # 找到目標(biāo)圖片的url地址 url = 'https://c-ssl.duitang.com/uploads/blog/202107/26/20210726111411_b4057.jpg' img_name = 'code.png' res = requests.get(url) # 保存圖片,音頻之類(lèi)的,會(huì)使用wb ————>以二進(jìn)制方式寫(xiě)入 with open(img_name, 'wb') as file_obj: # 保存圖片,音頻之類(lèi)的,會(huì)使用content去響應(yīng)對(duì)象里面取 file_obj.write(res.content)
import requests # 導(dǎo)入requests模塊 url = 'https://c-ssl.duitang.com/uploads/blog/202008/12/20200812094028_qzhsq.jpg' img_name = 'code2.png' # 向目標(biāo)網(wǎng)址發(fā)送網(wǎng)絡(luò)請(qǐng)求并賦給一個(gè)變量 res = requests.get(url) # file_obj是一個(gè)文件對(duì)象 file_obj = open(img_name, 'wb') file_obj.write(res.content) # 用open寫(xiě)入需要關(guān)閉 file_obj.close()
??with open和open兩者的區(qū)別??
with open會(huì)自動(dòng)關(guān)閉,open則不會(huì)
2.使用urillib.request.urlretrieve() 函數(shù)保存圖片
import urllib.request # 導(dǎo)入request模塊 # 找到目標(biāo)圖片的url地址 url = 'https://c-ssl.duitang.com/uploads/item/201912/20/20191220140202_sbpjp.jpg' # 給圖片命名 img_name = 'code3.png' # 使用urllib.request.urlretrieve urllib.request.urlretrieve(url, img_name)
??擴(kuò)展??使用路徑保存圖片
from urllib import request # 導(dǎo)入request模塊 url = 'https://c-ssl.duitang.com/uploads/blog/202102/14/20210214203011_1336a.jpeg' # 傳入要保存的文件路徑(可copy path查看) 加r防止轉(zhuǎn)意 file_name = r'D:\web spider\request\code4.png' request.urlretrieve(url, file_name)
??兩種導(dǎo)入方式??
import urllib.request(使用時(shí)需要urllib.request)
from urllib import request(使用時(shí)直接request即可)
總結(jié)
到此這篇關(guān)于python爬蟲(chóng)之請(qǐng)求模塊urllib基本使用的文章就介紹到這了,更多相關(guān)python請(qǐng)求模塊urllib使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3實(shí)現(xiàn)爬取指定百度貼吧頁(yè)面并保存頁(yè)面數(shù)據(jù)生成本地文檔的方法
這篇文章主要介紹了Python3實(shí)現(xiàn)爬取指定百度貼吧頁(yè)面并保存頁(yè)面數(shù)據(jù)生成本地文檔的方法,涉及Python基于urllib模塊的頁(yè)面爬取與文件讀寫(xiě)相關(guān)操作技巧,需要的朋友可以參考下2018-04-04python去除刪除數(shù)據(jù)中\(zhòng)u0000\u0001等unicode字符串的代碼
這篇文章主要介紹了python去除刪除數(shù)據(jù)中\(zhòng)u0000\u0001等unicode字符串的代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03自動(dòng)化測(cè)試時(shí)基于Python常用的幾個(gè)加密算法總結(jié)
這幾天做自動(dòng)化測(cè)試,遇到一個(gè)問(wèn)題,那就是接口的請(qǐng)求的密碼是加密的,產(chǎn)品的要求是不能使用使用其他特殊手段,他給提供加密算法,需要在接口請(qǐng)求的時(shí)候,使用加密算法處理后的數(shù)據(jù)傳參,本文主要是整理了幾個(gè)加密算法,以便后續(xù)測(cè)試使用,需要的朋友可以參考下2023-12-12python3?chromedrivers簽到的簡(jiǎn)單實(shí)現(xiàn)
本文主要介紹了python3?chromedrivers簽到的簡(jiǎn)單實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03python實(shí)現(xiàn)簡(jiǎn)單井字棋小游戲
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單井字棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03解決Python中l(wèi)ist里的中文輸出到html模板里的問(wèn)題
今天小編就為大家分享一篇解決Python中l(wèi)ist里的中文輸出到html模板里的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12Python zip()函數(shù)用法實(shí)例分析
這篇文章主要介紹了Python zip()函數(shù)用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python zip()函數(shù)的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-03-03