欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python爬蟲(chóng)之請(qǐng)求模塊urllib的基本使用

 更新時(shí)間:2022年04月08日 11:24:24   作者:hacker707  
urllib是python內(nèi)置的HTTP請(qǐng)求庫(kù),是一個(gè)用來(lái)處理網(wǎng)絡(luò)請(qǐng)求的python標(biāo)準(zhǔn)庫(kù),下面這篇文章主要給大家介紹了關(guān)于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)文章

最新評(píng)論