1.reques高级:
例子:
1.17k小说网:
#我们利用session去请求(是一连串的请求,过程中不会cookie丢失
import requests
# 会话
session =requests.session()
data ={"loginName": "18835556819",
"password":"26149222Q"}
#1先登录
url = "https://passport.17k.com/ck/user/login"
session.post(url,data=data)
# print(resp.text)
# print(resp.cookies) #看cookeie
#2.拿参数
#刚才的会话中有cookie的
resp = session.get('https://user.17k.com/ck/author/shelf?page=1&appKey=2406394919')
print(resp.json())
2.梨视频
#https://video.pearvideo.com/mp4/adshort/20220214/1645596205217-15826504_adpkg-ad_hd.mp4
#https://video.pearvideo.com/mp4/adshort/20220214/cont-1751850-15826504_adpkg-ad_hd.mp4 正确
#https://video.pearvideo.com/mp4/adshort/20220214/cont-1751850-15826504_adpkg-ad_hd.mp4
#https://video.pearvideo.com/mp4/adshort/20220214/cont-1751850-15826504_adpkg-ad_hd.mp4
#拿到contID
#拿到videoStatus 返回嘚json ->srcURL
#srcURL里面的视频内容休整
#下载视频
import requests
url = "https://www.pearvideo.com/video_1752547"
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4878.0 Safari/537.36",
#防盗链referer
"Referer": url
}
contId =url.split("_")[1]
videostatus = "https://www.pearvideo.com/videoStatus.jsp?contId=1752547&mrd=0.4074439069860505"
resp =requests.get(videostatus,headers=headers)
# print(resp.text)
dic = resp.json()
srcUrl = dic['videoInfo']['videos']['srcUrl']
systemTime = dic['systemTime']
srcUrl_1 = srcUrl.replace(systemTime,"cont-{contId}")#加f
#下载视频
with open("a.mp4",mode="wb") as f:
f.write(requests.get(srcUrl_1).content)
f.close()
2.代理
代理网址:
快代理:https://www.kuaidaili.com/free/
站大爷:https://www.zdaye.com/ShortProxy.html
例子:
1.干百度
import requests
#118.190.244.234 3128
proxies = {
#"http":""
"https":"https:118.190.244.234"
}
resp = requests.get("http://www.baidu.com")
resp.encoding="utf-8"
print(resp.text)
综合练习:
网易的评论:
#找到未加密的参数
#想办法把参数进行加密(必须参考网易的加密方式)
#请求网易,拿到评论 params =>encText,encSecKey => encSecKey
#AES 加密 pip install pycryptodome
from Crypto.Cipher import AES
from base64 import b64encode
import requests
import json
from lxml import html
f ='00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'
g ='0CoJUm6Qyw8W8jud'
e ='010001'
url ="https://music.163.com/weapi/comment/resource/comments/get?csrf_token="
i ="10deCDPtDlWGqIJm"
data = {
"csrf_token": "",
"cursor": "-1",
"offset": "0",
"orderType": "1",
"pageNo": "1",
"pageSize": "20",
"rid": "R_SO_4_1901371647",
"threadId": "R_SO_4_1901371647"
}
#处理加密过程 数据 '010001'
#var bVj2x = window.asrsea(JSON.stringify(i6c), bsR9I(["流泪", "强"]), bsR9I(Xp2x.md), bsR9I(["爱心", "女孩", "惊恐", "大笑"]));
# """"
# function a(a=16) { #随机的16为字符串
# var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";
# for (d = 0; a > d; d += 1)#循环16次
# e = Math.random() * b.length,#随机数字
# e = Math.floor(e),#取整
# c += b.charAt(e);#去字符串中xx的位置 b
# return c
# }
# function b(a, b) { #a是要加密的内容
# var c = CryptoJS.enc.Utf8.parse(b)# b是密钥
# , d = CryptoJS.enc.Utf8.parse("0102030405060708")
# , e = CryptoJS.enc.Utf8.parse(a) #e是数据
# , f = CryptoJS.AES.encrypt(e, c, {#加密的密钥 c
# iv: d,#偏移量 AES加密
# mode: CryptoJS.mode.CBC
# });
# return f.toString()
# }
# function c(a, b, c) {
# var d, e;
# return setMaxDigits(131),
# d = new RSAKeyPair(b,"",c),
# e = encryptedString(d, a)
# }
# function d(d, e, f, g) {
# var h = {}#空对象
# , i = a(16);#随机的16位字符串
# return h.encText = b(d, g),# g是密钥
# h.encText = b(h.encText, i),#得到的是params
# h.encSecKey = c(i, e, f),#得到的就是encSecKey,e和f是死的,所有的偏差只能在i上,如果我把i固定(c())里面不产生随机数)那就sck一定是固定的
# h
# }
# 两次加密: 数据+g => 第一次加密 +i=>b =params
# """
def get_encSecKey():
return "a01b02eb445d8f5848c749b1685be5f3c3848c11a214039d567cd750be16625f62dfadaa502547cea2552dea6b9f372965ff47936b879b8282acb57a35b21b86abd231800b5f08d2450e5af1736d42d3ff3eac3b57f4c0fd4bcb402d054248809090c4e552b91a2f0c0a712d7721a5c1d926cfe7afb6633c61ee94887c8e193f"
def get_params(data):#默认收到的是字符串
frist = enc_params(data,g)
second =enc_params(frist,i)
return second #返回的就是params
def to_16(data):
pad = 16 - len(data)%16
data += chr(pad)*pad
return data
def enc_params(data,key): #加密
iv = "0102030405060708"
data = to_16(data)
ase = AES.new(key=key.encode("utf-8"),iv=iv.encode("utf-8"),mode=AES.MODE_CBC) #创造加密器
bs = ase.encrypt(data.encode("utf-8")) #加密的内容必须是16的倍数 123456chr(10)chr(10)chr(10)chr(10)...
return str(b64encode(bs),"utf-8")
resp = requests.post(url,data={
"params":get_params(json.dumps(data)),
"encSecKey":get_encSecKey()
})
ret = resp.json()
# ret_data_comments =ret.get("data").get("comments").get("0")
# print(ret_data_comments)
# list_commenst=ret_data_comments.get("content")
# print(list_commenst)
print(resp.json())
五:并发模块:
浙公网安备 33010602011771号