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


转换为代码为:
SHA1加密
t = int(time.time())#获取10位整数的时间戳s1 = f'/api/movie,{i*10},{t}'o = hashlib.sha1(s1.encode('utf-8')).hexdigest()#进行SHA1加密
加密
str_str = str(f"{o},{t}")bytesStr = str_str.encode(encoding='utf-8')b64str = base64.b64encode(bytesStr)#最后的base64加密b64str = b64str.decode('utf-8')# 将字节转换为str
就是最后的token的值了,在这个过程中需要注意的是两次加密,共用的是同一个时间戳,并不是一次加密获取一个
分析网站电影详情页的url中的加密
我们刚开始看到在电影详情页面中除了token之外还有一串加密的字符
我们接下来的目标就是分析token和这串字符的产生方式
url中字符串的加密分析
这串字符是固定的,尝试直接url断点,然后堆栈往下读,到了熟悉的函数
设置断点,清除掉url断点,继续刷新请求单步调试
可以看到在上面的e变量已经url计算好了,e变量来源于o变量,调整断点,进行断点调试,但是在调试的过程中发现值来源于key参数,但是在调试中并没有找到key的计算来源,只能全局搜索key,看看key是怎么来的

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

文章插图
一共9个匹配项,一点点调试可疑的,最后找到
设置断点,刷新,单步进入
继续调试
最后可以看到那串加密过的字符串,加密的方式是通过n这个固定的字符串变量+t,而t则表示的是第几个电影,然后经过加密
所以加密的方式为:
(ef34##(-–j@*-!i-0-mb+t)
url中token分析
而token和上面的基本一致,但是中间的一些细节可能不一样,在分析过程中,加密方式的大致流程也是先SHA1加密,然后再加密,但是中间的参数却是不一样了
大致流程为:
o=sha1(url,0,时间戳)=>c=(o,时间戳)=> token=c
但是url中在后面加入了刚才的字符串,中间的本来是页数,现在固定为0
这部分代码的加密和上面的类似,就不再单独写
最后,所有的加密方式以及对应的代码都已经分析好了
单线程
import base64import jsonimport timeimport urllib3import requestsimport pandas as pdimport hashliburllib3.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_list,tdef token1():t = int(time.time())# 获取10位整数的时间戳s1 = f'/api/movie,{i*10},{t}'o = hashlib.sha1(s1.encode('utf-8')).hexdigest()#进行SHA1加密str_str = str(f"{o},{t}")bytesStr = str_str.encode(encoding='utf-8')b64str = base64.b64encode(bytesStr)#最后的base64加密b64str_all = b64str.decode('utf-8')# 将字节转换为strreturn b64str_alldef token2():a = 'ef34#teuq0btua#(-57w1q5o5--j@98xygimlyfxs*-!i-0-mb' + str(y)bytesStr = a.encode(encoding='utf-8')b64str = base64.b64encode(bytesStr).decode('utf-8')return b64strdef decode2(b64str):t = int(time.time())# 获取10位整数的时间戳s1 = f'/api/movie/{b64str},0,{t}'o = hashlib.sha1(s1.encode('utf-8')).hexdigest()# 进行SHA1加密str_str =(f"{o},{t}")bytesStr = str_str.encode(encoding='utf-8')b64str = base64.b64encode(bytesStr)# 最后的base64加密b64str_all = b64str.decode('utf-8')# 将字节转换为strreturn b64str_allfor i in range(0,10):the_url = "https://spa2.scrape.center/api/movie/?limit=10&offset="+str(i*10)+"&token="+token1()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(i*10+1,i*10+11):the_url = "https://spa2.scrape.center/api/movie/" + token2() + '/?token=' + decode2(token2())response = requests.get(the_url, headers=headers, verify=False)dict_data_1 = json.loads(response.text)content.append(dict_data_1['drama'])bt = {'标题':title,'主题':theme,'评分':score,'剧情介绍':content}work = pd.DataFrame(bt)work.to_csv('work.csv')