ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python爬虫实战(六):对某一关键词的百度指数数据的爬取

2022-01-04 10:03:35  阅读:479  来源: 互联网

标签:baidu index 22 get Python 关键词 爬虫 url data


追风赶月莫停留,平芜尽处是春山。

文章目录


终于有时间来更新我的博客了!!
这次咱们来搞一搞百度指数的爬取。

一、网页分析

在这里插入图片描述
咱们以爬虫为关键词,进行百度指数的分析
然后F12开发者模式,然后刷新,依次点击Network -> XHR -> index?area=0&word=... -> Preview,然后你就会看到
在这里插入图片描述
这些都是个啥啊,显然data里面是加密了的,头秃。
先按下不表,接着看后面。

二、接口分析

url分析

https://index.baidu.com/api/SearchApi/index?area=0&word=[[%7B%22name%22:爬虫%22,%22wordType%22:1%7D]]&&startDate=2011-01-02&endDate=2022-01-02

很明显,他有三个参数:

  1. word
    这个参数掌管要搜索的关键词
  2. startDate
    这个参数代表数据开始的时间
  3. endDate
    这个参数代表数据结束的时间

如果你能掌管好这三个参数,那数据不就是手到擒来嘛!

返回数据分析

是get请求,返回数据格式是json格式,编码为utf-8
在这里插入图片描述

三、编写代码

知道了url规则,以及返回数据的格式,那现在咱们的任务就是构造url然后请求数据

url = "https://index.baidu.com/api/SearchApi/index?area=0&word=[[%7B%22name%22:%22{}%22,%22wordType%22:1%7D]]&startDate=2011-01-02&endDate=2022-01-02".format(keyword)

那就直接上呗,直接请求他
所以我们为了方便就把请求网页的代码写成了函数get_html(url),传入的参数是url返回的是请求到的内容。

def get_html(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36",
        "Host": "index.baidu.com",
        "Referer": "http://index.baidu.com/v2/main/index.html",
    }
    cookies = {
        "Cookie": 你的cookie
    }
    response = requests.get(url, headers=headers, cookies=cookies)
    return response.text

注意这里一定要把你的cookie替换掉,不然请求不到内容。
cookies获取方式

获取数据

将获得的数据格式化为json格式的数据。

def get_html(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36",
        "Host": "index.baidu.com",
        "Referer": "http://index.baidu.com/v2/main/index.html",
    }
    cookies = {
        "Cookie": 你的cookie
    }
    response = requests.get(url, headers=headers, cookies=cookies)
    return response.text


def get_data(keyword):
    url = "https://index.baidu.com/api/SearchApi/index?area=0&word=[[%7B%22name%22:%22{}%22,%22wordType%22:1%7D]]&startDate=2011-01-02&endDate=2022-01-02".format(keyword)
    data = get_html(url)
    data = json.lodas(data)
    data = data['data']['userIndexes'][0]['all']['data']

ok,到此数据就获取完了,我们下期见,拜拜~
在这里插入图片描述
好了,这个加密的data怎么处理呢???
其中data可以看到应该是加密了的,all是表示全部数据,pc是指pc端,wise是移动端,这些可以在js文件里找到;首先先搞清楚这个像加密了的data是怎么解密的;我们现在知道这个数据是json格式,那么它处理肯定要从中取出这些data,所以,重新刷新一下网页,目的是为了让所有js都能加载出来,然后利用搜索功能从中找。搜索过程就不上图了,我是搜索 decrypt找到的;首先,我用decrypt找到了一个js文件,其中有一个名为decrypt的方法

解密

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)

到这可能都觉得已经解决了,可你不知道t这个参数是什么,怎么来的,这里我就不带各位分析了,你么可以自己尝试分析分析,我直接说结果,是利用uniqid请求另一个接口得到的。
这个t其实是叫ptbk,获取这个ptbk的url:http://index.baidu.com/Interface/ptbk?uniqid= 有一个参数uniqid,GET请求,返回json内容
在这里插入图片描述
这个data就是t,上一步all里面的data就是e

def get_ptbk(uniqid):
    url = 'http://index.baidu.com/Interface/ptbk?uniqid={}'
    resp = get_html(url.format(uniqid))
    return json.loads(resp)['data']

完整代码

# -*- coding:utf-8 -*-
# @time: 2022/1/4 8:35
# @Author: 韩国麦当劳
# @Environment: Python 3.7
import datetime
import requests
import sys
import time
import json

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

def get_html(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36",
        "Host": "index.baidu.com",
        "Referer": "http://index.baidu.com/v2/main/index.html",
    }
    cookies = {
        'Cookie': 你的Cookie
    }
    response = requests.get(url, headers=headers, cookies=cookies)
    return response.text


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 = get_html(url.format(uniqid))
    return json.loads(resp)['data']


def get_data(keyword, start='2011-01-02', end='2022-01-02'):
    url = "https://index.baidu.com/api/SearchApi/index?area=0&word=[[%7B%22name%22:%22{}%22,%22wordType%22:1%7D]]&startDate={}&endDate={}".format(keyword, start, end)
    data = get_html(url)
    data = json.loads(data)
    uniqid = data['data']['uniqid']
    data = data['data']['userIndexes'][0]['all']['data']
    ptbk = get_ptbk(uniqid)
    result = decrypt(ptbk, data)
    result = result.split(',')
    start = start_date.split("-")
    end = end_date.split("-")
    a = datetime.date(int(start[0]), int(start[1]), int(start[2]))
    b = datetime.date(int(end[0]), int(end[1]), int(end[2]))
    node = 0
    for i in range(a.toordinal(), b.toordinal()):
        date = datetime.date.fromordinal(i)
        print(date, result[node])
        node += 1


if __name__ == '__main__':
    keyword = "爬虫"
    start_date = "2011-01-02"
    end_date = "2022-01-02"
    get_data(keyword, start_date, end_date)

欢迎一键三连哦!
还想看哪个网站的爬虫?欢迎留言,说不定下次要分析的就是你想要看的!

标签:baidu,index,22,get,Python,关键词,爬虫,url,data
来源: https://blog.csdn.net/weixin_46089149/article/details/122291366

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有