spa系列1-3 爬虫学习-Scrape Center闯关

场景
上次写了ssr系列,它主要依靠服务器渲染代码,并且没有什么困难的地方,主要学习的是请求中的技巧和html页面元素的定位抓取等爬虫基础技巧 。这次记录的是spa系列的1-3个,因为这三个是一个电影网站其他只是细节不同,记录起来比较容易点,这个系列的代码数据都通过Ajax加载,页面动态渲染,主要学习的是通过接口获取json数据并处理以及js的逆向分析,难度提升了一大截,这个系列我的目标是爬取首页每个电影的标题,主题,评分以及电影详情页里面的电影剧情
技术
json数据的处理,js逆向分析
关卡 spa1
电影数据网站,无反爬,数据通过 Ajax 加载,页面动态渲染,适合 Ajax 分析和动态页面渲染爬取 。
这关主要学习的是通过接口抓取指定的json数据并处理
import jsonimport urllib3import requestsimport pandas as pdurllib3.disable_warnings()#去除因为网页没有ssl证书出现的警告url,title,theme,score,content = [],[],[],[],[]headers ={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/87.0.4280.141 Safari/537.36'}global url_list,title_list,theme_list,score_list,content_listfor i in range(0,10):the_url = "https://spa1.scrape.center/api/movie/?limit=10&offset="+str(i*10)index=requests.get(the_url,headers=headers,verify=False)dict_data = http://www.kingceram.com/post/json.loads(index.text)#将响应的内容转化为jsonfor x in range(0,10):title.append(dict_data['results'][x]['name']+dict_data['results'][x]['alias'])theme.append(str(dict_data['results'][x]['categories']).replace('[','').replace(']','').replace("'",''))score.append(dict_data['results'][x]['score'])for y in range(1,101):the_url="https://spa1.scrape.center/api/movie/"+str(y)+"/"response=requests.get(the_url,headers=headers,verify=False)dict_data = http://www.kingceram.com/post/json.loads(response.text)content.append(dict_data['drama'])bt = {'标题':title,'主题':theme,'评分':score,'剧情介绍':content}work = pd.DataFrame(bt)work.to_csv('work.csv')
spa2
电影数据网站,无反爬,数据通过 Ajax 加载,数据接口参数加密且有时间限制,适合动态页面渲染爬取或逆向分析 。
这关主要学习的是js的逆向分析
分析网站主页token产生的js
通过打开网站主页面,发现接口多了一个token的值
而且点开电影详情页面,接口不仅多了一个token值,而且在movie/后面多了一串字符串
先对网站主页的token进行分析,在浏览器调试工具中调试相关js代码,分析token的产生加密方法
因为是网络请求,并且url中包括token,所以通过url断点入手
下断点,刷新请求
在send函数处断下
在右侧的栈依次往下看,在函数中发现了token的值,取消url断点,在token处设下断点,刷新请求
()向后面传入了当前的url,单步进入后面的代码,进入新的代码块,这次可以看到 sha1 函数和函数,应该是加密函数所在位置了,进行单步调试
首先可以看到时间戳,然后从中获取了当前的url
然后进行循环,循环之后将当前url和时间戳放进了r中,
第10页的网站页面是这样的
我们可以发现除了时间戳因为时间变化之外,中间的数值也改变了,我们可以看出来中间的数值的规律是:
假设当前页面为n,数值的值为a
a=(n-1)*10
r的值放到SHA1加密函数中进行加密,出来的值为o
然后将o的值和时间戳t放进进行加密,加密后的值为c
然后返回
可以看到最后token的值就是我们刚才的c值
这样,token的加密方式就已经解出来了,步骤为:
o=sha1(url,(页面数-1)*10,时间戳)=>c=(o,时间戳)=> token=c