python爬取知乎live_Python爬虫 - 简单抓取百度指数

前言有点忙,没空写东西,这是之前写的,加了些配图而已

这次要爬的网站是百度指数

正文

一、分析

打开网站(百度指数),呈现出来是这样的

如果搜索的话就需要登陆了,如果没有什么特别频繁的请求的话,直接登陆复制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参数是data,t参数不太清楚是什么。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的url:http://index.baidu.com/Interface/ptbk?uniqid= 有一个参数uniqid,GET请求,返回json内容

获取uniqid和data的url:http://index.baidu.com/api/SearchApi/thumbnail?area=0&word= (如果要指定日期只需要在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?area=0&word={}'

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), headers=headers)

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;q=0.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), headers=ptbk_headers)

if resp.status_code != 200:

print('获取uniqid失败')

sys.exit(1)

return resp.json().get('data')

def get_index_data(keyword, start='2011-01-03', end='2019-08-05'):

url = f'http://index.baidu.com/api/SearchApi/index?word={keyword}&area=0&startDate={start}&endDate={end}'

headers = {

'Accept': 'application/json, text/plain, */*',

'Accept-Encoding': 'gzip, deflate',

'Accept-Language': 'zh-CN,zh;q=0.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, headers=headers)

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

转载请注明出处

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Visual Studio上开发Node.js程序

在Visual Studio上开发Node.js程序 原文:在Visual Studio上开发Node.js程序【题外话】 最近准备用Node.js做些东西,于是找找看能否有Visual Studio上的插件以方便开发。结果还真找到了一个,来自微软的Node.js Tools for Visual Studio(NTVS&a…

Oracle ASM 翻译系列第十一弹:高级知识 Offline or drop?

Offline or drop? 当一个ASM磁盘不可用时,ASM会把它从磁盘组里移除,对吗?要看情况,通常取决于ASM版本和磁盘组的冗余级别。因为一个external冗余的磁盘组会直接被dismount,所以主要关注normal和high冗余磁盘组的情况。…

net与树莓派的情缘-安装与卸载MySql(五)

安装MySql sudo apt-get install mysql-server 删除 mysql sudo apt-get autoremove --purge mysql-server-5.0sudo apt-get remove mysql-serversudo apt-get autoremove mysql-serversudo apt-get remove mysql-common //这个很重要上面的其实有一些是多余的。 清理残留数据 …

mpls工作原理通俗解释_用这两种方法向最终用户解释NLP模型的工作原理还是不错的...

点击上方关注,All in AI中国上周,我看了一个关于“NLP的实践特性工程”的演讲。主要是关于LIME和SHAP在文本分类可解释性方面是如何工作的。我决定写一篇关于它们的文章,因为它们很有趣、易于使用,而且视觉上很吸引人。所有的机器…

向往2的年代

1. JDBC 对插入大量数据如何处理? 2. JAVA反射的使用,如何获取一个java类的某个方法? 3. 数据库连接池(优化) 4. 分布式事务管理转载于:https://www.cnblogs.com/dragonflyyi/p/3564843.html

C++ limits头文件的用法(numeric_limits)

初学C的时候,对这个模板很陌生,不知道它到底是做什么用的,今天拿起《C标准程序库》,出现了它的讨论,所以决定好好研究一番。 1. numeric_limits是什么? (A)《C标准程序库》&#xff…

三层架构——配置文件

1、配置文件是什么? 配置文件是随安装程序一起被安装到计算机上的文件,里面存放着安装好的应用程序执行时所须要的參数。 应用程序配置文件是标准的XML文件,XML标记和属性是区分大写和小写的。它能够按须要更改,开发者可使用配置文…

《嵌入式系统开发之道——菜鸟成长日志与项目经理的私房菜》——02-04项目范围(Scope)管理...

本节书摘来异步社区《嵌入式系统开发之道——菜鸟成长日志与项目经理的私房菜》一书中的第2章,第2.4节,作者:邱毅凌,更多章节内容可以访问云栖社区“异步社区”公众号查看 02-04项目范围(Scope)管理 嵌入式…

flex(入门)之timer的使用,键盘,鼠标的监听

package {import flash.display.Shape;import flash.display.Sprite;import flash.events.Event;import flash.events.KeyboardEvent;import flash.events.MouseEvent;import flash.events.TimerEvent;import flash.utils.Timer;import mx.controls.Label;//窗体大小&#xff0…

python 线程超时设置_python 条件变量Condition(36)

文章首发微信公众号,微信搜索:猿说python对于线程与线程之间的交互我们在前面的文章已经介绍了 python 互斥锁Lock / python事件Event , 今天继续介绍一种线程交互方式 – 线程条件变量Condition.一.线程条件变量Condition相关函数介绍acquire() — 线程…

MsWord 操作总结

转自(http://www.cnblogs.com/eye-like/p/4121219.html) Msdn上的word操作api(不过只有英文版,英文差的先闪过) Word2007的API:http://msdn.microsoft.com/en-us/library/bb257531(voffice.12).aspxWord201…

fwrite,fread and fprintf,fscanf的一些使用体会

这周一直在完成一个任务,就是将训练出的多个model写成一个model。其中我们使用了c语言的读写方法,搞了一星期, 挖了很多坑,最终都铲平了。下面列举出若干有用的知识。 1.fwrite,fread VS fprintf,fscanf的区别 fwrite,fread 读写…

《第一桶金怎么赚——淘宝开店创业致富一册通》一一1.4 淘宝开店创业的流程...

本节书摘来自异步社区出版社《第一桶金怎么赚——淘宝开店创业致富一册通》一书中的第1章,第1.4节,作者:葛存山,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.4 淘宝开店创业的流程 第一桶金怎么赚——淘宝开店创业致…

检测虚拟机代码总汇(更新中)

检测虚拟机代码 1 004092D0 /. 55 push ebp2 004092D1 |. 8BEC mov ebp,esp3 004092D3 |. 51 push ecx4 004092D4 |. 53 push ebx5 004092D5 |. 68 1D934000 push 0040931D 6 004092DA |. 64:FF35…

两数之和 python_同一屏幕播放两个视频 视频左右两个画面或视频上下两个画面如何制作...

咱们在网上经常可以看到一些视频画面是可以在同一屏幕播放两个视频,有的是视频左右两个画面或视频上下两个画面这些是如何制作的呢,其实熟悉视频编辑软件的网友应该会比较了解这些操作,好嘞,来,现在就让小编来演示一下…

dlib人脸特征点对齐

前面我们介绍了使用dlib进行人脸检测&#xff0c;下面我们给出如何使用dlib进行人脸特征点检测。我们直接贴出代码。我们的代码包括如下几部分功能&#xff1a; 检测单张图片检测一个视频检测一个camera 先给出代码&#xff1a; #include <dlib/image_processing/frontal_…

IOS开发基础知识--碎片13

1:运行程序报the file couldnt be opened because you dont have permission to view it 解决办法&#xff1a;项目—>targets->build settings->build options->changed the value of the "Compiler for C/C/Objective-C" to Default Compiler. 2:百度…

《LoadRunner 12七天速成宝典》—第2章2.6节第二个性能测试案例

本节书摘来自异步社区《LoadRunner 12七天速成宝典》一书中的第2章&#xff0c;第2.6节第二个性能测试案例&#xff0c;作者陈霁&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.6 第二个性能测试案例云云&#xff1a;烤鱼吃得很爽。 恋恋&#xff1a;就…

MongoDB_1

突然想去看下MongoDB的东西&#xff0c;于是有了这篇文章。其实很早以前就看过一些关于NoSql的文章&#xff0c;还记得当时里面有介绍MongoDB的&#xff0c;多瞅了2眼&#xff0c;并且在Window下安装了MongoDB的驱动&#xff0c;小玩了会。今天重新翻出来&#xff0c;没成想在命…

牛顿法与拟牛顿法,SDM方法的一些注记

SDM方法 考虑一般额NLS问题&#xff1a; f(x)minx||h(x)−y||2这里x为优化参数&#xff0c;h为非线性函数&#xff0c;y是已知变量&#xff0c;如下是基于梯度的迭代公式&#xff1a; ΔxαAJTh(h(x)−y)这里α是步长&#xff0c;A是缩放因子&#xff0c;Jh是h在当前参数x下的…