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

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

正文

一、分析

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

如果搜索的话就需要登陆了,如果没有什么特别频繁的请求的话,直接登陆复制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解密

解密后的东西就是我们要的数据

三、代码部分

刚好这几天需要用到这个爬虫,结果发现baidu指数的请求有点变化,所以就改了改:

import requests

import sys

import time

word_url = 'http://index.baidu.com/api/SearchApi/thumbnail?area=0&word={}'

COOKIES = ''

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': 'index.baidu.com',

'Pragma': 'no-cache',

'Proxy-Connection': 'keep-alive',

'Referer': 'http://index.baidu.com/v2/main/index.html',

'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',

}

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_ptbk(uniqid):

url = 'http://index.baidu.com/Interface/ptbk?uniqid={}'

resp = requests.get(url.format(uniqid), headers=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'):

keyword = str(keyword).replace("'", '"')

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

resp = requests.get(url, headers=headers)

if resp.status_code != 200:

print('获取指数失败')

sys.exit(1)

content = resp.json()

data = content.get('data')

user_indexes = data.get('userIndexes')[0]

uniqid = data.get('uniqid')

ptbk = get_ptbk(uniqid)

while ptbk is None or ptbk == '':

ptbk = get_ptbk(uniqid)

all_data = user_indexes.get('all').get('data')

result = decrypt(ptbk, all_data)

result = result.split(',')

print(result)

if __name__ == '__main__':

words = [[{"name": "酷安", "wordType": 1}]]

get_index_data(words)

输出:

END

转载请注明出处

python百度爬虫_Python爬虫 - 简单抓取百度指数相关推荐

  1. 【Python爬虫教学】百度篇·手把手教你抓取百度搜索关键词后的页面源代码

    [开门见山] 最近整理了下之前做过的项目,学的东西不少,乱七八糟.打算写点关于 Python 爬虫的东西,新人一枚,还望大佬们多多担待,别把我头给打歪了. 前面我先磨叽磨叽些基础的东西,对爬虫新人友好 ...

  2. python百度贴吧怎么爬取最早的帖子_【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码...

    开门见山. 懒癌一犯,能拖一天是一天. 好了,亲爱的小伙伴们,我又回来了!今天带来的是抓取输入的任意贴吧,抓取指定范围页数内的源代码. 工具: 依旧是 PyCharm 和 Google 浏览器,pyt ...

  3. java抓取百度搜索结果_java实现抓取百度对某站点搜索结果

    htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容.项目可以模拟浏览器运行,被誉为java浏览器的开源实现.这个没有界面的浏览器,运行速度 ...

  4. php爬取百度相关关键词,PHP实现抓取百度搜索结果页面【相关搜索词】并存储到txt文件示例...

    本文实例讲述了PHP实现抓取百度搜索结果页面[相关搜索词]并存储到txt文件.分享给大家供大家参考,具体如下: 一.百度搜索关键词[脚本之家] [脚本之家]搜索链接 https://www.baidu ...

  5. php爬虫爬取百度的内容,爬虫(一)抓取百度页面的内容

    最近在实习,导师又没得项目让我一起做东西,就自己坐在一边瞎鼓捣东西 那闲着也是闲着,想来写写爬虫 爬虫百度百科上的定义如下 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页 ...

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

    前言有点忙,没空写东西,这是之前写的,加了些配图而已 这次要爬的网站是百度指数 正文 一.分析 打开网站(百度指数),呈现出来是这样的 如果搜索的话就需要登陆了,如果没有什么特别频繁的请求的话,直接登 ...

  7. [Python]简单抓取百度blog

    #coding=utf8 #graptest1.py python2.7 2013.4.5 ''' 单页里的列表匹配,单线程下载,html文件格式 完成一个原型 regex写的很烂.. ''' imp ...

  8. python 广告拦截_Python如何在抓取时欺骗反广告块过滤器?

    Javascript解析 您遇到的问题是在页面加载后加载数据的JavaScript过滤器.警告您正在使用adblock的消息以原始HTML格式存在,并且是完全静态的.当JavaScript调用能够验证 ...

  9. Python爬虫抓取百度搜索图片

    最近玩机器学习,想搞一个关于识别动漫图片的训练集,苦于没有太多的动漫图片,后来忽然想到百度图片可以拿来用,于是乎写了个简单的爬虫,用来抓取百度图片(关于某个关键字的图片) 第一步,找到搜索图片的url ...

  10. python爬虫抓取百度图片_Python爬虫抓取百度的高清摄影图片

    成果预览: 源代码: import requests import re url = 'https://image.baidu.com/search/index' headers = { 'User- ...

最新文章

  1. 与《代码大全》齐名的经典著作
  2. 学python好找工作嘛-Python开发学完好找工作吗?
  3. json与javabean、list、map之间的转化
  4. 学生选课数据库SQL语句练习题——成绩表
  5. jmeter分布式压测原理简介1
  6. B站这套教程火了,火速搬运!限时删除~
  7. 推荐两个Magento做的中文网站 GAP和佰草集
  8. 国内首批AI专业毕业生创办的澎思科技,已完成Pre-A轮融资
  9. 【汇编语言】多模块程序结构
  10. python 嵌套list的一些小结
  11. USB-CAN模块使用
  12. [绍棠] This In-App purchase has already been bought. It will be restored for free.
  13. FTP上传文件与服务器的连接被重置,ftp 服务器连接被重置
  14. 使用Hostapd开启AP功能
  15. java中System类详解
  16. 面对5400万抑郁症患者,这600位志愿者“树洞”打算用AI拯救他们
  17. mediasoup 管道通信类UnixStreamSocket分析
  18. 【渝粤教育】电大中专电子商务网站建设与维护 (5)作业 题库
  19. 游戏手柄按键遥杆值检测
  20. 《NFL橄榄球》:田纳西泰坦·橄榄1号位

热门文章

  1. 人工智能文本生成器将如何影响写作行业
  2. 电商网站对服务器配置有什么要求?
  3. 深入理解设计模式-设计模式七大原则
  4. 设计多层PCB板需要注意哪些事项?
  5. python爬微博步骤手机_新浪微博爬取笔记(2):wap端模拟登陆 python
  6. 语音中常用输入特征的提取过程:MFCC、FBank
  7. 网络存储服务器系统价格比较,【网络存储器报价】四款不同的网络存储器,你会选择那一款?...
  8. 使用Nginx实现多重流量复制
  9. 大话设计模式--计算器
  10. ISA防火墙的策略配置和应用