记得学习
目标网页:https://www.huanhuanhuishou.com/gujia/47.html
思路参考:https://mp.weixin.qq.com/s/e39SdyAQwIegVJoEFGz_mg
目标:抓取手机的最高回收价
一、抓包
打开网页以后看源代码中 ctrl+f 找不到价格,所以去Network中找
直接找的XHR,发现没有找到数据的字段
但是在
Request URL: https://www.huanhuanhuishou.com//Goods/getEvaluateData?goods_id=47
中看到一串字符:J6T6d5C1J1T5I0y1Y29kZSUyMiUzQSUyMjEwMDAwJTIyJTJDJTIyb…
然后看了大佬的分享
在Initiator中进入js代码
开始调试这段js
1、在xhr.send打上断点,f5刷新
2、在Call Stack中查看调用
3、找到decode,在decode打上断点看,str返回的就是网页数据,里面有最高回收价
4、进入decode函数,开始用python代码复制js代码
中间本来想用import execjs直接调用js代码的
但是不会用
所以就手写
主要就是这3个函数
str_replace()替换
str_split()切片
decode()解密
总体代码:
import requests
import base64
from math import ceil
from urllib.request import unquote
from binascii import Error
def get_code_data():
url = 'https://www.huanhuanhuishou.com//Goods/getEvaluateData'
params = {'goods_id':47}
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'}
r = requests.get(url,headers=headers,params=params)
if r.status_code == 200:
res = r.text
code = r.headers['Content-Text']
return res,code
def str_replace(strs):
'''
用py代码模拟js代码-替换
:params findstrs:["O0O0O", "o000o", "oo00o"]
:params replacestrs:["=", "+", "/"]
:params strs:需要解密的字段
'''
findstrs = ["O0O0O", "o000o", "oo00o"]
replacestrs = ["=", "+", "/"]
lens = len(findstrs)
i = 0
while i < lens:
temp = findstrs[i]
if temp == "+" or temp == "=" or temp == "/":
re_ = '\\' + temp + '/g'
else:
re_ = '/' + temp + '/g'
strs = strs.replace(re_,replacestrs[i])
i+=1
return strs
def str_split(res,lens):
'''
用py代码模拟js代码-切片
:params res:网页返回的字段res
:params lens:长度2
'''
strlen = len(res)
count = ceil(strlen/lens)
i = 0
reArray = []
while i < count:
data = res[i*lens:i * lens + lens]
reArray.append(''.join(data))
i += 1
return reArray
if __name__ == '__main__':
res,code = get_code_data()
res = str_replace(res)
res = str_split(res,2)
keyArr = list(code)
for k in keyArr:
if k != ';':
k = int(k)
res[k] = res[k][0]
strArr = ''.join(res)
Base = base64.b64decode(strArr).decode('utf-8')
res2 = unquote(Base,encoding='utf-8')
print(res2)
现在还有一个问题就是有时正确,有时错误
会报错UnicodeDecodeError错误,待改进
然后这个又正确。。。
python
总结一下这些个内置函数的
replace() 字符串替换
ceil() 向上取整 math模块函数
unquote() url解码
JavaScript
lenght() 求字符暗沉长度
eval() 让电脑运行代码
replace() 字符串替换
Math.ceil() 向上取整
decodeURLComponent() url解码