bags 发表于 2021-10-28 00:49

《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()

chly0828 发表于 2021-10-28 08:16

学习了,谢谢分享!

neo_2088 发表于 2021-10-28 08:48

感谢分享,学习一下!

wqipk 发表于 2021-10-28 08:52


感谢分享,学习一下!

wangxinwei121 发表于 2021-10-28 08:53

感谢分享,学习一下!

chentest 发表于 2021-10-28 09:05

学习一下

qdzgpa 发表于 2021-10-28 09:22

感谢楼主分享,学习一下!

dayudengyu 发表于 2021-10-28 10:03

适合新手,适合新手

qzzgb12345 发表于 2021-10-28 10:13

虽然不是很懂,支持一下

angle951 发表于 2021-10-28 10:34

学习学习
页: [1] 2
查看完整版本: 《Python3网络爬虫开发实战(第二版)》案例SPA1-3代码编写