酷维网站模版,网站免费观看,网站访客记录 是后台做吗,百度一下官方网站前言有点忙#xff0c;没空写东西#xff0c;这是之前写的#xff0c;加了些配图而已
这次要爬的网站是百度指数
正文
一、分析
打开网站(百度指数)#xff0c;呈现出来是这样的
如果搜索的话就需要登陆了#xff0c;如果没有什么特别频繁的请求的话#xff0c;直接登陆复…前言有点忙没空写东西这是之前写的加了些配图而已
这次要爬的网站是百度指数
正文
一、分析
打开网站(百度指数)呈现出来是这样的
如果搜索的话就需要登陆了如果没有什么特别频繁的请求的话直接登陆复制Cookie就完事了
这里以 酷安 为例搜索
这一栏是选择时间范围的拖拽它能将范围选择更广
我将其拖拽至2011调试窗口可以看到请求是个GET请求参数有四个除了 area 其他的都很好理解
切换到 Preview 预览窗口通过分析个人认为比较可疑的几个Key有这些uniqid、all、pc、wise、data
其中data可以看到应该是加密了的all是表示全部数据pc是指pc端wise是移动端这些可以在js文件里找到首先先搞清楚这个像加密了的data是怎么解密的我们现在知道这个数据是json格式那么它处理肯定要从中取出这些data所以重新刷新一下网页目的是为了让所有js都能加载出来然后利用搜索功能从中找。搜索过程就不上图了我是搜索 decrypt找到的首先我用decrypt找到了一个js文件其中有一个名为decrypt的方法
这个js文件中有很多decrypt的搜索结果在不知道多少行处找到了一个名为 fetchThrendIndexLive 的方法这个方法名用我工地英语翻译为 获取趋势指数
这里调用了名为decrypt的方法是不是上面那个我不知道
这次我不打算用charles的替换js文件功能了直接用浏览器的调试功能console就行了
右键js的请求Open in Sources panel
直接在这里下断点然后刷新页面
在这停顿后可以看到两个参数的内容
想要知道这两个参数是什么很简单回到Network看请求里的json其中e参数是datat参数不太清楚是什么。for循环里第一步是先将t字符串按单个字符分割返回的列表保存在n变量里
然后将e也按单字符分割保存到i变量里
a是一个字典r是一个列表
从右边的 Scope 中可以看到
以t的字符长度遍历a中key为t遍历的字符a中value为从t中按索引取的值其中索引为t的字符长度除2后加上当前遍历的索引a[n[o] n[n.length/2 o])
这里始终没有用到i也就是我们能获取到的data这个i在第二个循环中才被用到
第二个循环是遍历e结果保存在r列表里这里的遍历很容易就看得懂。。我就不分析了自己都头晕直接用python抄一遍就行了
最后是将r列表里的内容合并为一个字符串然后返回
二、整理思路
解密
方法对应python代码为
def decrypt(t,e):
n list(t)
i list(e)
a {}
result []
ln int(len(n)/2)
start n[ln:]
end n[:ln]
for j,k in zip(start, end):
a.update({k: j})
for j in e:
result.append(a.get(j))
return .join(result)
完全照搬。。可能有写地方可以简化但我懒得去处理了最后返回的是这个玩意儿
python运行结果
到这可能都觉得已经解决了可你不知道t这个参数是什么怎么来的这里我就不带各位分析了你么可以自己尝试分析分析我直接说结果之前我就指出了几个可疑的东西其中uniqid在获取t参数需要用到这个t其实是叫ptbk获取这个ptbk的urlhttp://index.baidu.com/Interface/ptbk?uniqid 有一个参数uniqidGET请求返回json内容
获取uniqid和data的urlhttp://index.baidu.com/api/SearchApi/thumbnail?area0word 如果要指定日期只需要在word后面追加startDate、endDate就行
所以可以明确一下思路:1、通过url获取uniqid和data
2、通过uniqid获取ptbk
3、通过ptbk和data解密
解密后的东西就是我们要的数据
三、代码部分
完整代码
import requests
import sys
import time
word_url http://index.baidu.com/api/SearchApi/thumbnail?area0word{}
COOKIES
def decrypt(t,e):
n list(t)
i list(e)
a {}
result []
ln int(len(n)/2)
start n[ln:]
end n[:ln]
for j,k in zip(start, end):
a.update({k: j})
for j in e:
result.append(a.get(j))
return .join(result)
def get_index_home(keyword):
headers {
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36,
Cookie: COOKIES
}
resp requests.get(word_url.format(keyword), headersheaders)
j resp.json()
uniqid j.get(data).get(uniqid)
return get_ptbk(uniqid)
def get_ptbk(uniqid):
url http://index.baidu.com/Interface/ptbk?uniqid{}
ptbk_headers {
Accept: application/json, text/plain, */*,
Accept-Encoding: gzip, deflate,
Accept-Language: zh-CN,zh;q0.9,
Cache-Control: no-cache,
Cookie: COOKIES,
DNT: 1,
Host: 百度指数,
Pragma: no-cache,
Proxy-Connection: keep-alive,
Referer: 百度指数,
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36,
X-Requested-With: XMLHttpRequest,
}
resp requests.get(url.format(uniqid), headersptbk_headers)
if resp.status_code ! 200:
print(获取uniqid失败)
sys.exit(1)
return resp.json().get(data)
def get_index_data(keyword, start2011-01-03, end2019-08-05):
url fhttp://index.baidu.com/api/SearchApi/index?word{keyword}area0startDate{start}endDate{end}
headers {
Accept: application/json, text/plain, */*,
Accept-Encoding: gzip, deflate,
Accept-Language: zh-CN,zh;q0.9,
Cache-Control: no-cache,
Cookie: COOKIES,
DNT: 1,
Host: 百度指数,
Pragma: no-cache,
Proxy-Connection: keep-alive,
Referer: 百度指数,
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36,
X-Requested-With: XMLHttpRequest,
}
resp requests.get(url, headersheaders)
if resp.status_code ! 200:
print(获取指数失败)
sys.exit(1)
data resp.json().get(data).get(userIndexes)[0]
uniqid data.get(uniqid)
ptbk get_index_home(uniqid)
while ptbk is None or ptbk :
ptbk get_index_home(uniqid)
all_data data.get(all).get(data)
result decrypt(ptbk, all_data)
result result.split(,)
print(result)
if __name__ __main__:
get_index_data(酷安)
输出:
END
转载请注明出处