百度指数爬虫|爬虫篇(一)

资源收集

在写爬虫之前,一定要先在知乎、简书、CSDN、github这种网站上查查有没有人做过类似的事情。目的并不一定是抄他们的代码,而是看他们是怎么分析的,他们都发现了哪些网站的反爬措施,又是怎么解决的。通过看他们的文章和代码,可以让自己少走很多弯路。我这次写爬虫就是参考了一篇文章和一个代码。
本篇内容是分析百度指数的获取数据的接口,大家感兴趣的话可以实操一下

接口分析

界面构成

首先百度指数的首页链接是http://index.baidu.com/,打开之后就可以看到如下界面:

​ 然后我们在关键词里搜索信息,就可以查看百度指数结果了:


  • 点击1位置可以调整查看的时间范围
  • 点击2位置可以选择PC、移动、PC+移动端
  • 点击3位置可以切换全国的不同省份
  • 拖动4的时间轴也可以达到点击1位置同样的效果

接口分析

然后我们就来分析一下接口了,所谓分析接口就是,找出来这个界面的那些数据,是从哪里弄过来的。想要想搞清楚这个问题,我们要3步走:

  • 在浏览器上按F12
  • 点击"Network"
  • 刷新页面

现在我们就会看到这么一大堆浏览器向服务器发送的请求。我们需要的,获得搜索次数的请求肯定也藏在其中。那么问题来了,哪个是呢?????

不慌,问题不大,首先呢,我们点击这个"XHR",进行筛选(不要问我为什么按这个,按!就对了)

我们来看哈,现在请求已经被我们一下子筛选的这么这么少了,那我们就只能,一个一个看了

对于每一个请求呢,我们先要点击请求,然后点击右边的"Preview",就可以看到请求的内容了。经过查看。这个请求一看就是我们需要的东西:

你看它长得多好看,有all,有pc,有wise。每个里面有startDate(开始时间的意思,英语不行我就没辙了),endDate和data。除了data长得很奇怪好像其他的都还行。那其实这就很难受了,这个data一看就是经过加密了。那么这个问题严重么?啊,其实还蛮严重的。不过不要紧,我们知道既然服务器把加密后的数据发给我了,那么解密的方法一定在代码里,我们就来猜猜看,哪段代码是用来解密的就可以了。

具体咋办呢?问题来了,解密的英语是什么啊?decrypt!好的,我们猜猜看,百度的程序员会不会把解密的程序命名为了decrypt呢?我们来搜索一下,点击这个小搜索框,输入decrypt再回车就好了。

激动人心的时刻到了,果然搜到了两条记录,点开一看,完美!我们貌似找到了一个解密的代码:

我们看到解密需要t和e,t是我们要解密的内容,就是前面的data,那么e呢?e明显就是解密用的秘钥了,那么e怎么来得???经过分析,它是其它的请求发来的:

这个里面的data,就是我们解密用的秘钥了!但是这个请求有一个uniqid参数,它是哪来的???咦,貌似我们最上面返回数据的请求,有一个uniqid哎!没跑了,就是它!

接口总结

好的,现在我们来捋一下流程:

  • 首先index?area=0.....的那个请求会发回来搜索数量,不过是加密后的结果,我们需要解密。并且这个接口会返回一个uniqid字段,这个字段在后面会用到
  • 解密的方法在decrypt函数里,其中需要需要被解密的密文,就是上面我们获得的data,以及解密的秘钥
  • 秘钥是通过ptbk?uniqid...这个请求来发送的,不过这个请求需要一个uniqid参数,这个参数在我们前面的index请求里就可以拿到

这样一来我们爬虫最核心的内容就有了:

  • 首先请求index,拿到密文和uniqid:

    def get_encrypt_datas(self, start_date, end_date, keywords):
            params = {
                'word': ','.join(keywords),
                'startDate': start_date.strftime('%Y-%m-%d'),
                'endDate': end_date.strftime('%Y-%m-%d'),
                'area': self.area
            }
            url = 'http://index.baidu.com/api/SearchApi/index?' + urlencode(params)
            html = self.get(url)
            datas = json.loads(html)
            uniqid = datas['data']['uniqid']
            encrypt_datas = []
            for single_data in datas['data']['userIndexes']:
                encrypt_datas.append(single_data)
            return (encrypt_datas, uniqid)
    
  • 然后根据uniqid去拿到解密的秘钥:

    def get_key(self, uniqid):
            url = 'http://index.baidu.com/Interface/api/ptbk?uniqid=%s' % uniqid
            html = self.get(url)
            datas = json.loads(html)
            key = datas['data']
            return key
    
  • 最后照着抄解密函数哈哈哈哈

    def decrypt_func(self, key, data):
            a = key
            i = data
            n = {}
            s = []
            for o in range(len(a) // 2):
                n[a[o]] = a[len(a) // 2 + o]
            for r in range(len(data)):
                s.append(n[i[r]])
            return ''.join(s).split(',')
    
  • 我们来看一下解密的结果:

已经解密成数字了,这样就,大功告成!

写在最后

其实感觉,这个爬虫真的还挺难的。百度的反爬和其它不太一样。百度对于访问的频率以及请求的Cookie的更新并没有太大的反爬加入。百度的反爬措施主要在于加密。当然,它同样恶心哈哈哈。

下一篇我们将说说,其它方面,百度还给我们准备了什么坑,等着我们跳!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342