python爬蟲之請求模塊urllib的基本使用
前言
??在實現網絡爬蟲的爬取工作時,就必須使用網絡請求,只有進行了網絡請求才可以對響應結果中的數據進行提取,urllib模塊是python自帶的網絡請求模塊,無需安裝,導入即可使用。下面將介紹如果使用python中的urllib模塊實現網絡請求??
urllib的子模塊
模塊 | 描述 |
---|---|
urllib.request | 用于實現基本HTTP請求的模塊 |
urllib.error | 異常處理模塊,如果在發(fā)送網絡請求的過程時出現錯誤,可以捕獲異常進行有效處理 |
urllib.parse | 用于解析URL的模塊 |
urllib.robotparser | 用于解析robots.txt文件,判斷網站是否可以爬取信息 |
HttpResponse常用方法與屬性獲取信息
通過urllib.request() 獲取的對象類型是HttpReponse,有以下幾種常用的方法,示例如下:
import urllib.request # 定義一個url(你要爬取的網址) 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) # 模擬瀏覽器向服務器發(fā)送網絡請求 response = urllib.request.urlopen(res) # read()函數可以獲取響應,但返回的響應格式是二進制的,需要解碼 # 解碼:decode('編碼格式') 編碼格式在Response Headers,Content_Type里面查看 print('baidu官網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()函數中傳參即可 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('響應狀態(tài)碼為', response.getcode()) print('響應狀態(tài)碼為', response.status) # (5) 返回訪問的目標的url地址 print('響應訪問的url地址為', response.geturl()) # (6) 獲取的是響應頭所有信息 print('響應頭所有信息為', response.getheaders()) # (7)獲取響應頭指定信息 print('響應頭指定信息為', 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)導入request和parse模塊
(2)添加請求頭header(重構ua)反反爬第一步
(3)使用urllib.parse方法處理url中的中文字樣(使用字典存儲要處理的內容,經過parse處理返回正常的url地址)
(4)使用+拼接固定的url地址和經過處理后的url地址
(5)創(chuàng)建請求對象
(6)使用urlopen()模擬瀏覽器像服務器發(fā)送網絡請求
(7)打印獲取響應對象里面的內容,并進行decode解碼
import urllib.parse # 導入parse解析模塊 import urllib.request # 導入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': '酷我'} # 經過處理之后返回wd=%E9%85%B7%E6%88%9 result = urllib.parse.urlencode(org) # 使用+拼接固定的url地址和經過處理的url地址 # https://www.baidu.com/s?wd=%E9%85%B7%E6%88%91 new_url = 'https://www.baidu.com/s?' + result # 1、構造請求對象 res = urllib.request.Request(new_url, headers=header) # 2、發(fā)送請求 獲取響應 response = urllib.request.urlopen(res) # 3、獲取響應對象里面的內容(獲取網頁源碼) print(response.read().decode('utf-8'))
字符串格式的處理方式
步驟
(1)導入request和parse模塊
(2)添加請求頭header(重構ua)反反爬第一步
(3)使用urllib.parse.quote方法處理url中的中文字樣(用一個變量存儲酷我字樣,使用parse.quote處理即可返回酷我經過處理的url地址)
(4)使用+拼接固定的url地址(需要加上wd=)和經過處理后的url地址(酷我字樣處理后的url地址)
(5)創(chuàng)建請求對象
(6)使用urlopen()模擬瀏覽器像服務器發(fā)送網絡請求
(7)打印獲取響應對象里面的內容,并進行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=)和經過處理后的url地址 new_string_url = 'https://www.baidu.com/s?wd=' + string_result # 1、構造請求對象 res = urllib.request.Request(new_string_url, headers=header) # 2、發(fā)送請求 獲取響應 response = urllib.request.urlopen(res) # 3、獲取響應對象里面的內容,并進行decode解碼 print(response.read().decode('utf-8'))
簡單了解web前端
HTTP基本原理
HTTP(HpperText Transfer Protocol),即超文本傳輸協(xié)議,是互聯網上應用廣泛的一種網絡協(xié)議。HTTP是利用TCP在Web服務器和客戶端之間傳輸信息的協(xié)議,客戶端使用Web瀏覽器發(fā)起HTTP請求給Web服務器,Web服務器發(fā)送被請求的信息給客戶端。
HTTP協(xié)議常用的請求方法
方法 | 描述 |
---|---|
GET | 請求指定的頁面信息,并返回響應內容 |
POST | 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件),數據被包含在請求體中。POST請求可能會導致新的資源的建立、或已有資源的修改 |
GEAD | 類似于GET請求,只不過返回的響應中沒有具體的內容,用于獲取報文頭部信息 |
PUT | 從客戶端像服務器傳送的數據取代指定的文檔內容 |
DELEAE | 請求服務器刪除指定內容 |
OPTIONS | 允許客戶端查看服務器性能 |
HTML狀態(tài)碼及其含義
代碼 | 含義 |
---|---|
信息,請求收到,繼續(xù)處理 | |
2** | 成功,行為被成功地接受、理解和采納 |
3** | 重定向,為了完成請求必須進一步執(zhí)行的動作 |
4** | 客戶端錯誤,請求包含語法錯誤或者請求無法實現 |
5** | 服務器錯誤,服務器不能實現一種明顯無效的請求 |
瀏覽器中的請求與響應
??最好使用谷歌瀏覽器??
使用谷歌瀏覽器訪問baidu官網,查看請求和響應的具體步驟如下:
1在谷歌瀏覽器輸入網址進入baidu官網
2按下F12鍵(或單擊鼠標右鍵選擇”檢查“選項),審查頁面元素
3單擊谷歌瀏覽器調試工具中“Network”選項,按下F5 鍵(或手動刷新頁面),單擊調試工具中的“Name”欄目下的網址,查看請求與響應信息。
Genral
Geral概述關鍵信息如下:
Request URL:請求的URL網址,也就是服務器的URL網址
Request Method:請求方式為GET
Status Code:狀態(tài)碼為200,即成功返回響應。
Remote Address :服務器IP地址是39.156.66.14:443,端口號是443
?http的端口號是80,https的端口號是443?
Request Headers請求頭
Response Headers響應頭
?爬取baidu官網HTML源代碼?
添加請求頭信息(重構user_agent)
User-Agent(簡稱UA),記錄了操作系統(tǒng)的信息和瀏覽器的信息
以www.baidu.com為例演示
當不重構ua時,直接訪問網址,只會返回baidu的部分源碼,因為baidu識別出來我們是爬蟲
這時就需要重構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”
}表示偽裝成谷歌瀏覽器進行網絡請求,可以獲取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官網HTML代碼如下:\n', response.read().decode('utf-8'))
??擴展知識??
1.使用with open 和 open保存圖片
import requests # 導入requests模塊 # 找到目標圖片的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去響應對象里面取 file_obj.write(res.content)
import requests # 導入requests模塊 url = 'https://c-ssl.duitang.com/uploads/blog/202008/12/20200812094028_qzhsq.jpg' img_name = 'code2.png' # 向目標網址發(fā)送網絡請求并賦給一個變量 res = requests.get(url) # file_obj是一個文件對象 file_obj = open(img_name, 'wb') file_obj.write(res.content) # 用open寫入需要關閉 file_obj.close()
??with open和open兩者的區(qū)別??
with open會自動關閉,open則不會
2.使用urillib.request.urlretrieve() 函數保存圖片
import urllib.request # 導入request模塊 # 找到目標圖片的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 # 導入request模塊 url = 'https://c-ssl.duitang.com/uploads/blog/202102/14/20210214203011_1336a.jpeg' # 傳入要保存的文件路徑(可copy path查看) 加r防止轉意 file_name = r'D:\web spider\request\code4.png' request.urlretrieve(url, file_name)
??兩種導入方式??
import urllib.request(使用時需要urllib.request)
from urllib import request(使用時直接request即可)
總結
到此這篇關于python爬蟲之請求模塊urllib基本使用的文章就介紹到這了,更多相關python請求模塊urllib使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python3實現爬取指定百度貼吧頁面并保存頁面數據生成本地文檔的方法
這篇文章主要介紹了Python3實現爬取指定百度貼吧頁面并保存頁面數據生成本地文檔的方法,涉及Python基于urllib模塊的頁面爬取與文件讀寫相關操作技巧,需要的朋友可以參考下2018-04-04python去除刪除數據中\(zhòng)u0000\u0001等unicode字符串的代碼
這篇文章主要介紹了python去除刪除數據中\(zhòng)u0000\u0001等unicode字符串的代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03解決Python中l(wèi)ist里的中文輸出到html模板里的問題
今天小編就為大家分享一篇解決Python中l(wèi)ist里的中文輸出到html模板里的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12