前言:這篇文章主要介紹JS逆向爬蟲中最常用的request模塊,然后引出一系列的模塊的概念,當然Python中其他比較常用的還有很多模塊,正是這些模塊也可以稱之為庫的東西構成了Python強大的生態,使其幾乎可以實現任何功能。下面就詳細介紹一下這些內容。
1,requests模塊
requests 作為一個專門為「人類」編寫的 HTTP 請求庫,其易用性很強,因此在推出之后就迅速成為 Python 中首選的 HTTP 請求庫。requests 庫的最大特點是提供了簡單易用的 AP!,讓編程人員可以輕松地提高效率。由于 requests 不是 Python 的標準
庫,因此在使用之前需要進行安裝:
pip install requests
python誦過 reauests 可以完成各種類型的 HTTP 請求,包括 HTTP、HTTPS、HTTP1.0、HTTP1.1 及各種請求方法
-
requests支持的方法
requests模塊支持的請求:
import requests
requests.get("http://httpbin.org/get")
requests.post("http://httpbin.org/post")
requests.put("http://httpbin.org/put")requests.delete("http://httpbin.org/delete")requests.head("http://httpbin.org/get")
requests.options("http://httpbin.org/get")
- "get--發送一個 GET 請求,用于請求頁面信息。
- "options--發送一個 OPTIONS 請求,用于檢查服務器端相關信息,
- head-一發送一個 HEAD 請求,類似于 GET 請求,但只請求頁面的響應頭信息。
- post--發送一個 POST 請求,通過 body 向指定資源提交用戶數據。
- "put--發送一個 PUT 請求,向指定資源上傳最新內容。
- "patch-一發送一個 PATCH 請求,同 PUT 類似,可以用于部分內容更新。
import requests
res = requests.get("https://ww3.sinaimg.cn/mw690/7772612dgy1hsmrek7r0gj21z41z4k2h.jpg")
with open("風景.jpg","wb")as f:f.write(res.content) #直接對內容進行爬取res1 = requests.get("https://video.pearvideo.com/mp4/short/20240917/cont-1796387-16037163-hd.mp4")
with open("視屏.mp4","wb")as f:f.write(res1.content) #直接對內容進行爬取
-
requests的響應信息
print(respone.statuscodeprint(respone.headers)
print(respone.text)
print(response.json)2.編碼
print(respone.content)
print(response.encoding)
-
UA反爬
請求頭需要加上下面的標識
import requestsres1 = requests.get("https://www.baidu.com",headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
})with open("baidu.html","w",encoding='utf-8')as f:f.write(res1.text)
-
refererf反爬與requests請求參數
import requestsres1 = requests.get("https://m.douban.com/rexxar/api/v2/movie/recommend?",headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36","Referer":"https://movie.douban.com/explore"
},params={"tags": "喜劇",
})# print(res1.text)
print(res1.json())
# print(type(res1.json()))items =res1.json()["recommend_categories"]
for i in items:print(i.get("data"))for j in i.get("data"):print(j.get("text"))
-
請求體的數據
模擬有道翻譯的小程序
import requestsindata = input("請輸入:")
res1 = requests.post("https://aidemo.youdao.com/trans",headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36","Referer":"https://ai.youdao.com/"
},params={},data={"q":indata,"from":"Auto","to":"Auto"
})
print(res1.text)
print(res1.json().get("translation"))
-
cookie反爬
cookie在用戶登陸的時候生成一個,當用戶再次用瀏覽器請求相同的信息數據的時候就會自帶一個cookie值,cookie比對成功之后服務端會進行免登錄,而爬蟲程序就會需要帶cookie才可以爬取數據成功
#(1)模擬登錄,獲取動態cookie
res1=requests.post("http://127.0.0.1:5000/auth", data={"yuan"user","pwd":"123"
}
#(2)響應cookie
print(dict(res1.cookies))#(3)再次登錄發送cookie
res1 = requests.get("http://127.0.0.1:5000/auth",headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"},cookie=dict(res1.cookies))
print(res1.text)
-
session對象
#舉例本地端口,此程序無法實際運行
import requests
session =requests.session()
session.post("http://127.0.0.1:5000/auth",data={"user": "yuan","pwd": "123",}
)
#(2)攜帶cookie爬取數據
res2 = session.get("http://127.0.0.1:5000/books")
-
代理IP
代理IP:反反爬使用代理ip是非常必要的一種反反爬的方式,但是即使使用了代理ip,對方服務器任然會有很多的方式來檢測我們是否是一個爬蟲,比如:一段時間內,檢測IP訪問的頻率,訪問太多頻繁會屏蔽;檢查Cookie,User-Agent,Referer等header參數,若沒有則屏蔽;服務方購買所有代理提供商,加入到反爬蟲數據庫里,若檢測是代理則屏蔽等。所以更好的方式在使用代理ip的時候使用隨機的方式進行選擇使用,不要每次都用一個代理ip
2,模塊與包
-
模塊初識
def add(x,y):return x + ydef subtract(x,y):return x - ydef multiply(x,y):return x * ydef divide(x,y):return x / y#==================================
#調用其他文件中的接口的方式1
import cal
import mul
x = 1
y = 120
z = cal.subtract(x,y)
q = mul.multiply(x,y)
print(z)# 方式2
from cal import subtract
from mul import multiply,divide
from mul import * #mul文件內的接口都可以用
x = 1
y = 120
z = subtract(x,y)
print(z)
-
模塊與包的導入本質
本質上面在一個啟動文件中導入一個python程序包,需要在啟動文件(一般名字是main)同級目錄及其以下的文件夾目錄下面的導入的包
如下程序所示:
from cal.cal import subtract
from cal.mul import multiply,divide
from cal.mul import * #mul文件內的接口都可以用
x = 1
y = 120
z = subtract(x,y)
print(z)
-
第三方包的導入與引用
1,注意之際命名的python文件包的名字不可以與已有標準庫或者下載的第三方的包一樣
2,通過from在啟動文件中導入第三方包的時候,程序就已經將第三方文件中的程序加載執行了一遍了
import sys
# py程序文件導入報的路徑都是通過下面加載的文件路徑導入的
print("sys.path:::", sys.path)
-
自定義的包文件的導入
import os
import sys
print("sys.path:::",sys.path)
path01 = os.path.dirname(__file__)
path02 = os.path.dirname(path01)
sys.path.insert(0,path02)
-
常見OS模塊的接口
import os
# 創建文件夾
# (1)
# os.mkdir("我的模塊")
# 路徑拼接
path = os.path.join("我的模塊","my.txt")
print(path)
with open(path, "w", encoding="utf-8") as f:data = f.write("icwdgcbiwdbci")#(4)是否存在某文件或目錄
print(os.path.exists("我的模塊2"))#(5) 檢查某一文件中的文件名與其路徑名
path1 = ("/Users/yuan/PycharmProjects/my.txt")
print(os.path.basename(path1))
print(os.path.dirname(path1))
print(os.path.split(path1))