python爬蟲之請求模塊urllib的基本使用
前言
??在實現(xiàn)網(wǎng)絡(luò)爬蟲的爬取工作時,就必須使用網(wǎng)絡(luò)請求,只有進行了網(wǎng)絡(luò)請求才可以對響應(yīng)結(jié)果中的數(shù)據(jù)進行提取,urllib模塊是python自帶的網(wǎng)絡(luò)請求模塊,無需安裝,導(dǎo)入即可使用。下面將介紹如果使用python中的urllib模塊實現(xiàn)網(wǎng)絡(luò)請求??
urllib的子模塊
| 模塊 | 描述 |
|---|---|
| urllib.request | 用于實現(xiàn)基本HTTP請求的模塊 |
| urllib.error | 異常處理模塊,如果在發(fā)送網(wǎng)絡(luò)請求的過程時出現(xiàn)錯誤,可以捕獲異常進行有效處理 |
| urllib.parse | 用于解析URL的模塊 |
| urllib.robotparser | 用于解析robots.txt文件,判斷網(wǎng)站是否可以爬取信息 |
HttpResponse常用方法與屬性獲取信息
通過urllib.request() 獲取的對象類型是HttpReponse,有以下幾種常用的方法,示例如下:
import urllib.request
# 定義一個url(你要爬取的網(wǎng)址)
url = 'https://www.baidu.com'
# 添加請求頭信息
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對象
res = urllib.request.Request(url=url, headers=headers)
# 模擬瀏覽器向服務(wù)器發(fā)送網(wǎng)絡(luò)請求
response = urllib.request.urlopen(res)
# read()函數(shù)可以獲取響應(yīng),但返回的響應(yīng)格式是二進制的,需要解碼
# 解碼:decode('編碼格式') 編碼格式在Response Headers,Content_Type里面查看
print('baidu官網(wǎng)HTML代碼如下:\n', response.read().decode('utf-8'))
# HTTPResponse這個類型
# 常見方法:read、readline、readlines、getcode、status、geturl、getheaders、getheader
# print(type(response)) # response是HTTPResponse的類型
# (1) 按照一個字節(jié)一個字節(jié)去讀
content = response.read()
print(content)
# 讀取具體的n個字節(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)碼沒有問題,其他的狀態(tài)碼可能有問題
print('響應(yīng)狀態(tài)碼為', response.getcode())
print('響應(yīng)狀態(tài)碼為', response.status)
# (5) 返回訪問的目標(biāo)的url地址
print('響應(yīng)訪問的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模塊向一個攜帶中文字樣的url發(fā)送請求時 ,會報錯:‘ascii’ codec can’t encode characters in position 10-11: ordinal not in range(128)??
字典格式的處理方式
步驟
(1)導(dǎo)入request和parse模塊
(2)添加請求頭header(重構(gòu)ua)反反爬第一步
(3)使用urllib.parse方法處理url中的中文字樣(使用字典存儲要處理的內(nèi)容,經(jīng)過parse處理返回正常的url地址)
(4)使用+拼接固定的url地址和經(jīng)過處理后的url地址
(5)創(chuàng)建請求對象
(6)使用urlopen()模擬瀏覽器像服務(wù)器發(fā)送網(wǎng)絡(luò)請求
(7)打印獲取響應(yīng)對象里面的內(nèi)容,并進行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"
}
# 通過urllib.parse處理url中的中文字樣--> 得到可以通過urllib發(fā)送請求的url地址
# 字典格式的處理方式
org = {'wd': '酷我'}
# 經(jīng)過處理之后返回wd=%E9%85%B7%E6%88%9
result = urllib.parse.urlencode(org)
# 使用+拼接固定的url地址和經(jīng)過處理的url地址
# https://www.baidu.com/s?wd=%E9%85%B7%E6%88%91
new_url = 'https://www.baidu.com/s?' + result
# 1、構(gòu)造請求對象
res = urllib.request.Request(new_url, headers=header)
# 2、發(fā)送請求 獲取響應(yīng)
response = urllib.request.urlopen(res)
# 3、獲取響應(yīng)對象里面的內(nèi)容(獲取網(wǎng)頁源碼)
print(response.read().decode('utf-8'))
字符串格式的處理方式
步驟
(1)導(dǎo)入request和parse模塊
(2)添加請求頭header(重構(gòu)ua)反反爬第一步
(3)使用urllib.parse.quote方法處理url中的中文字樣(用一個變量存儲酷我字樣,使用parse.quote處理即可返回酷我經(jīng)過處理的url地址)
(4)使用+拼接固定的url地址(需要加上wd=)和經(jīng)過處理后的url地址(酷我字樣處理后的url地址)
(5)創(chuàng)建請求對象
(6)使用urlopen()模擬瀏覽器像服務(wù)器發(fā)送網(wǎng)絡(luò)請求
(7)打印獲取響應(yīng)對象里面的內(nèi)容,并進行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)過處理后的url地址
new_string_url = 'https://www.baidu.com/s?wd=' + string_result
# 1、構(gòu)造請求對象
res = urllib.request.Request(new_string_url, headers=header)
# 2、發(fā)送請求 獲取響應(yīng)
response = urllib.request.urlopen(res)
# 3、獲取響應(yīng)對象里面的內(nèi)容,并進行decode解碼
print(response.read().decode('utf-8'))
簡單了解web前端
HTTP基本原理
HTTP(HpperText Transfer Protocol),即超文本傳輸協(xié)議,是互聯(lián)網(wǎng)上應(yīng)用廣泛的一種網(wǎng)絡(luò)協(xié)議。HTTP是利用TCP在Web服務(wù)器和客戶端之間傳輸信息的協(xié)議,客戶端使用Web瀏覽器發(fā)起HTTP請求給Web服務(wù)器,Web服務(wù)器發(fā)送被請求的信息給客戶端。
HTTP協(xié)議常用的請求方法
| 方法 | 描述 |
|---|---|
| GET | 請求指定的頁面信息,并返回響應(yīng)內(nèi)容 |
| POST | 向指定資源提交數(shù)據(jù)進行處理請求(例如提交表單或者上傳文件),數(shù)據(jù)被包含在請求體中。POST請求可能會導(dǎo)致新的資源的建立、或已有資源的修改 |
| GEAD | 類似于GET請求,只不過返回的響應(yīng)中沒有具體的內(nèi)容,用于獲取報文頭部信息 |
| PUT | 從客戶端像服務(wù)器傳送的數(shù)據(jù)取代指定的文檔內(nèi)容 |
| DELEAE | 請求服務(wù)器刪除指定內(nèi)容 |
| OPTIONS | 允許客戶端查看服務(wù)器性能 |
HTML狀態(tài)碼及其含義
| 代碼 | 含義 |
|---|---|
| 信息,請求收到,繼續(xù)處理 | |
| 2** | 成功,行為被成功地接受、理解和采納 |
| 3** | 重定向,為了完成請求必須進一步執(zhí)行的動作 |
| 4** | 客戶端錯誤,請求包含語法錯誤或者請求無法實現(xiàn) |
| 5** | 服務(wù)器錯誤,服務(wù)器不能實現(xiàn)一種明顯無效的請求 |
瀏覽器中的請求與響應(yīng)
??最好使用谷歌瀏覽器??
使用谷歌瀏覽器訪問baidu官網(wǎng),查看請求和響應(yīng)的具體步驟如下:
1在谷歌瀏覽器輸入網(wǎng)址進入baidu官網(wǎng)
2按下F12鍵(或單擊鼠標(biāo)右鍵選擇”檢查“選項),審查頁面元素
3單擊谷歌瀏覽器調(diào)試工具中“Network”選項,按下F5 鍵(或手動刷新頁面),單擊調(diào)試工具中的“Name”欄目下的網(wǎng)址,查看請求與響應(yīng)信息。

Genral

Geral概述關(guān)鍵信息如下:
Request URL:請求的URL網(wǎng)址,也就是服務(wù)器的URL網(wǎng)址
Request Method:請求方式為GET
Status Code:狀態(tài)碼為200,即成功返回響應(yīng)。
Remote Address :服務(wù)器IP地址是39.156.66.14:443,端口號是443
?http的端口號是80,https的端口號是443?
Request Headers請求頭
Response Headers響應(yīng)頭
?爬取baidu官網(wǎng)HTML源代碼?
添加請求頭信息(重構(gòu)user_agent)
User-Agent(簡稱UA),記錄了操作系統(tǒng)的信息和瀏覽器的信息
以www.baidu.com為例演示
當(dāng)不重構(gòu)ua時,直接訪問網(wǎng)址,只會返回baidu的部分源碼,因為baidu識別出來我們是爬蟲

這時就需要重構(gòu)ua,偽裝自己是瀏覽器發(fā)起請求
查看瀏覽器ua的方法 按F12鍵打開Network,在request headers里面就可以看到瀏覽器的ua.

創(chuàng)建Request對象
創(chuàng)建具有請求頭信息的Request對象,然后使用urlopen()方法向“baidu”地址發(fā)送一個GET請求,利用字典添加請求頭信息最常用的用法就是修改User-Agent來偽裝瀏覽器,例如
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”
}表示偽裝成谷歌瀏覽器進行網(wǎng)絡(luò)請求,可以獲取baidu的全部源代碼
import urllib.request
# 請求對象的定制:為了解決反爬蟲的第一種手段
url = 'https://www.baidu.com'
# 用戶代理: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()方法中不能傳參字典,因而用戶代理UA不能作為傳參傳入
# 此時需要定制一個請求對象:
# 如果request = urllib.request.Request(url,headers) 寫會報錯
request = urllib.request.Request(url, headers=header)
response = urllib.request.urlopen(request)
print('baidu官網(wǎng)HTML代碼如下:\n', response.read().decode('utf-8'))
??擴展知識??
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)
# 保存圖片,音頻之類的,會使用wb ————>以二進制方式寫入
with open(img_name, 'wb') as file_obj:
# 保存圖片,音頻之類的,會使用content去響應(yīng)對象里面取
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ò)請求并賦給一個變量 res = requests.get(url) # file_obj是一個文件對象 file_obj = open(img_name, 'wb') file_obj.write(res.content) # 用open寫入需要關(guān)閉 file_obj.close()
??with open和open兩者的區(qū)別??
with open會自動關(guān)閉,open則不會
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)
??擴展??使用路徑保存圖片
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(使用時需要urllib.request)
from urllib import request(使用時直接request即可)
總結(jié)
到此這篇關(guān)于python爬蟲之請求模塊urllib基本使用的文章就介紹到這了,更多相關(guān)python請求模塊urllib使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3實現(xiàn)爬取指定百度貼吧頁面并保存頁面數(shù)據(jù)生成本地文檔的方法
這篇文章主要介紹了Python3實現(xiàn)爬取指定百度貼吧頁面并保存頁面數(shù)據(jù)生成本地文檔的方法,涉及Python基于urllib模塊的頁面爬取與文件讀寫相關(guān)操作技巧,需要的朋友可以參考下2018-04-04
python去除刪除數(shù)據(jù)中\(zhòng)u0000\u0001等unicode字符串的代碼
這篇文章主要介紹了python去除刪除數(shù)據(jù)中\(zhòng)u0000\u0001等unicode字符串的代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
自動化測試時基于Python常用的幾個加密算法總結(jié)
這幾天做自動化測試,遇到一個問題,那就是接口的請求的密碼是加密的,產(chǎn)品的要求是不能使用使用其他特殊手段,他給提供加密算法,需要在接口請求的時候,使用加密算法處理后的數(shù)據(jù)傳參,本文主要是整理了幾個加密算法,以便后續(xù)測試使用,需要的朋友可以參考下2023-12-12
python3?chromedrivers簽到的簡單實現(xiàn)
本文主要介紹了python3?chromedrivers簽到的簡單實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
解決Python中l(wèi)ist里的中文輸出到html模板里的問題
今天小編就為大家分享一篇解決Python中l(wèi)ist里的中文輸出到html模板里的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12

