《Python3网络爬虫开发实战(第二版)》案例SPA1-3代码编写
本帖最后由 bags 于 2021-10-28 00:54 编辑SPA1:电影数据网站,无反爬,数据通过 Ajax 加载,页面动态渲染,适合 Ajax 分析和动态页面渲染爬取。
思路:Ajax 加载,直接抓包获取api即可
from requests_html import HTMLSession
import json
def main():
session = HTMLSession()
data_all = []
for i in range(1,3):
try:
url = 'https://spa1.scrape.center/api/movie/{}'.format(i)
req = session.get(url).json()
data_all.append(req)
except:
print("当前进度{}%,出错".format(i))
with open("./爬虫练习/SPA1/error.txt","a+",encoding="utf-8") as f:
f.write("出错页数:"+str(i))
with open("./爬虫练习/SPA1/data.json","w",encoding="utf-8") as f:
json.dump(data_all,f,ensure_ascii=False)
if __name__ == '__main__':
main()
SPA2:电影数据网站,无反爬,数据通过 Ajax 加载,数据接口参数加密且有时间限制,适合动态页面渲染爬取或 JavaScript 逆向分析。
思路:简单分析发现影片详情页url和api接口均被加密
看密文格式简单分析应该是base64加密,百度解密后能得到密文
但是。。我分析的时候没有想到直接解密。。看链接中有detail,并且是ajax加载,全局搜索detail,得到几个js文件
跳转进去看到可疑的数据:key
下断点单步分析得
密文构造:”ef34#teuq0btua#(-57w1q5o5--j@98xygimlyfxs*-!i-0-mb“+电影序号id
加密方式:base64
继续分析api中另一个参数token。全局搜索token得到
跳转进去发现可疑代码,断点单步分析
分析得:赋值3个参数给数组R(链接,0,时间戳),把R转换成以”,"分隔得字符串,并进行SHA1加密
例:'/api/movie/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWIx,0,1635352675' 加密得 :e4748aa84d9f0b6fb22e905096122d7fd3d4177f
然后把加密后得密文与时间戳重组,一样以","分隔,例:'e4748aa84d9f0b6fb22e905096122d7fd3d4177f,1635352675'
然后对该密文进行base64加密,得到token:ZTQ3NDhhYTg0ZDlmMGI2ZmIyMmU5MDUwOTYxMjJkN2ZkM2Q0MTc3ZiwxNjM1MzUyNjc1
代码:
from requests_html import HTMLSession
import base64
import time
import hashlib
import json
def main():
session = HTMLSession()
data_all = []
for i in range(1,3):
try:
key = "ef34#teuq0btua#(-57w1q5o5--j@98xygimlyfxs*-!i-0-mb" + str(i)
bytes_key = key.encode("utf-8")
token = base64.b64encode(bytes_key).decode('utf-8')
t = int(time.time())
key = ("/api/movie/"+token+','+"0,"+str(t)).encode("utf-8")
key = hashlib.sha1(key).hexdigest()
key = (key+","+str(t)).encode("utf-8")
token_2 = base64.b64encode(key).decode('utf-8')
url = "https://spa2.scrape.center/api/movie/{token}/?token={token_2}".format(token=token,token_2=token_2)
req = session.get(url).json()
data_all.append(req)
except:
pass
with open("./爬虫练习/SPA2/data.json","w",encoding="utf-8") as f:
json.dump(data_all,f,ensure_ascii=False)
if __name__ == '__main__':
main()
SPA3:电影数据网站,无反爬,数据通过 Ajax 加载,无页码翻页,下拉至底部刷新,适合 Ajax 分析和动态页面渲染爬取。
思路:无页码翻页,通过重组api链接即可获取全部数据
from requests_html import HTMLSession
import json
def main():
session = HTMLSession()
url = 'https://spa3.scrape.center/api/movie/?limit=100&offset=0'
req = session.get(url).json()
with open("./爬虫练习/SPA3/data.json","w",encoding="utf-8") as f:
json.dump(req,f,ensure_ascii=False)
if __name__ == '__main__':
main()
学习了,谢谢分享! 感谢分享,学习一下!
感谢分享,学习一下! 感谢分享,学习一下! 学习一下 感谢楼主分享,学习一下! 适合新手,适合新手 虽然不是很懂,支持一下 学习学习
页:
[1]
2