首页 > 其他分享 >【2024】百度指数爬虫,过程加代码

【2024】百度指数爬虫,过程加代码

时间:2024-06-03 13:22:05浏览次数:24  
标签:index endDate credential 爬虫 2024 headers keywords data 百度

要爬取百度指数,首先我们要通过 Web 页面获取 api。

image

最关键的三个请求是:

  • /api/AddWordApi/checkWordsExists?word={testwordset} 检查关键词是否存在
  • /api/SearchApi/index?area=0&word={words}&area={regionCode}&startDate={startDate}&endDate={endDate} 查询关键词指数,参数含义不言自明。但返回值是加密的字符串。
  • /Interface/ptbk?uniqid={uniqid} uniqid 为上个请求中返回的一项,本请求返回密钥可以解密上个请求的返回值。

在页面代码中搜索 decrypt 函数,可以找到解密函数的代码,其逻辑并不复杂,可以用任何其他语言实现。

image

接下来我们来关注参数。经过测试,提交多个关键词查询的格式为[{"name": keyword, "wordType": 1} for keyword in sublist],由于百度指数的组合词和添加对比功能,一次最多可添加5个词一同查询,而每个词可以以加号连接三个词查询其总和。

获得的结果,解密后就成为数组,对应日期范围内每一天的指数。注意日期跨度在365天内时,返回的数据是按天的,超过365天时,返回的数据是按周的。若要获取更长时间的每天数据,可以多次查询,然后合并。

最后是鉴权问题,提交请求需要两个参数,一个是 cookie 的 BDUSS 字段,另一个是 Cipher-Text 字段,在 Web 页面的请求中可以看到这两个字段的值,可以直接复制到代码中使用。

"""
百度指数爬虫 2024年3月
"""

# import ...

def generate_http_headers(credential):
    http_headers = {
        'Cookie': 'BDUSS=' + credential["cookie_BDUSS"],
        'Cipher-Text': credential["cipherText"],
        'Referer': 'https://index.baidu.com/v2/main/index.html',
        'Host': 'index.baidu.com',
        # ...
    }
    return http_headers


# 解密
def decrypt(ptbk, index_data):
    n = len(ptbk) // 2
    a = dict(zip(ptbk[:n], ptbk[n:]))
    return "".join([a[s] for s in index_data])

def crawl_request(keywords, startDate, endDate, regionCode, credential, expectedInterval, autoSave):
    words = keywords2json(json.dumps([
        [{"name": keyword, "wordType": 1} for keyword in sublist]
        for sublist in keywords
    ], ensure_ascii=False))

    # 第一级以逗号分隔,第二级以加号分隔
    testwordset = ','.join(['+'.join(keyword) for keyword in keywords])
    max_retries = 3  # 最大重试次数
    retries = 0  

    while retries < max_retries:
        try:
            url = f'https://index.baidu.com/api/AddWordApi/checkWordsExists?word={testwordset}'
            rsp = requests.get(url, headers=generate_http_headers(credential), timeout=10).json()
            if rsp['data']['result']:
                # 关键词不存在或组合里有不存在的关键词
                return -1

            url = f'http://index.baidu.com/api/SearchApi/index?area=0&word={words}&area={regionCode}&startDate={startDate}&endDate={endDate}'
            rsp = requests.get(url, headers=generate_http_headers(credential), timeout=10).json()

            # 获取解密秘钥
            data = rsp['data']['userIndexes']
            uniqid = rsp['data']['uniqid']
            url = f'https://index.baidu.com/Interface/ptbk?uniqid={uniqid}'
            ptbk = requests.get(url, headers=generate_http_headers(credential), timeout=10).json()['data']

            res = [0 for _ in range(len(data))]
            # 已经获取到结果数组
            return res
        except Exception as e:
            retries += 1
            time.sleep(random.randint(1, 3)) 
    if retries == max_retries:
        # 多次失败,账号问题或者网络问题
        return -1


regions = {}
with open('./webui/public/city.json', encoding='utf-8') as f:
            regions = json.load(f)

def crawl(keywords, startDate, endDate, regionCode, credential, expectedInterval, autoSave):
    res = {regionCode: []}
    for i in range(0, len(keywords), 5):
        # 5 个关键词一组,进行查询
        selected_keywords = keywords[i:i + 5]

        t = crawl_request(selected_keywords, startDate, endDate, regionCode, credential, expectedInterval, autoSave)
        if t == -1:
            continue
        res[regionCode].extend(t)
        time.sleep(expectedInterval / 1000 + random.randint(1, 3) / 2)

    return res

带上 GUI 和额外功能的完整版参见 Github: https://github.com/Ofnoname/baidu-index-spider

标签:index,endDate,credential,爬虫,2024,headers,keywords,data,百度
From: https://www.cnblogs.com/ofnoname/p/18228567

相关文章

  • DASCTF X HDCTF 2024 公开赛|生而无畏战_pwn部分wp
    剩下一个不会写。......
  • 当我遇到了爬虫
    运维同学,线上机器怎么又双叒叕挂了? 对爬虫也是相爱相杀多年,我对线上爬虫的应对出现的几个阶段:1、分析日志,找出异常请求,封ip。2、通过waf,针对某个uri,进行限流(并且人机识别),控制的还是源ip,起初有点成效。3、遇到大量单ip,触发不到人机识别,通过nginx自带的limit_req_zone进行uri......
  • 2024年5月第四周LLM重要论文总结
    本文总结了2024年5月第四周发表的一些最重要的LLM论文。这些论文的主题包括模型优化和缩放到推理、基准测试和增强性能。LLM发展与基准1、TowardsModularLLMsbyBuildingandReusingaLibraryofLoRAs基本大型语言模型(LLM)的参数越来越对,这就要求我们研究出更高效的微......
  • 持续总结中!2024年面试必问 20 道 Kafka面试题(三)
    上一篇地址:持续总结中!2024年面试必问20道Kafka面试题(二)-CSDN博客五、Kafka的ISR(In-SyncReplica)是什么?Kafka的ISR(In-SyncReplicas)是Kafka中用于维护数据一致性和高可用性的关键概念之一。ISR列表包含了一个领导者副本(Leader)和与之保持完全同步的追随者副本(Follower......
  • 【一句日历】2024年06月
    【2023年6月1日·星期六】向着明亮那方,向着明亮那方。哪怕一片叶子,也要向着日光洒下的方向。灌木丛中的小草啊。向着明亮那方,向着明亮那方。哪怕烧焦了翅膀,也要飞向灯火闪烁的方向。夜里的飞虫啊。向着明亮那方,向着明亮那方。哪怕只是分寸的宽敞,也要向着阳光照射的方向。住在城......
  • 2024电影《美国内战》迅雷下载/中英文双字BD高清/720PMKV百度云下载
    美国内战,是一部关于美国历史上最为重要的战争之一的影片。在这部电影中,鲍威尔通过真实的历史事件和人物,再现了美国内战中的种种困境和挑战。《美国内战》的故事背景设定在1861年至1865年的美国内战时期。当时,北方和南方因为各自对待奴隶制度的立场分歧而爆发了战争......
  • 【2024-06-01】连岳摘抄
    23:59向着明亮那方,向着明亮那方。哪怕一片叶子,也要向着日光洒下的方向。灌木丛中的小草啊。向着明亮那方,向着明亮那方。哪怕烧焦了翅膀,也要飞向灯火闪烁的方向。夜里的飞虫啊。向着明亮那方,向着明亮那方。哪怕只是分寸的宽敞,也要向着阳光照射的方向。住在城市的孩子们啊!住在乡......
  • 疯狂的麦克斯:狂暴女神迅雷下载/HD1.82高清版下载-百度云资源
    近年来,影视作品中出现了许多以废土世界为背景的电影,其中最为引人注目的便是乔治·米勒执导的《疯狂的麦克斯:狂暴女神》。该片以狂野、快节奏和暴力场面著称,讲述了一个在无法无天的沙漠中生存的主角麦克斯与一群勇敢的女性战士们的故事。然而,与其他废土题材电影不同的是,《疯狂......
  • 2024年6月--发奋图强
    是什么让我有了学习的动力,一个是我不想打王者了,一个是最近时间比较多,其实就是时间变多了最近时间,工作上确实没有比较硬的骨头,不必像以前一样啃VB,啃C#,找很多代码来看,很怀念以前的这种模式:找各种代码过来学习,每次看到一个新的功能就会如获致宝,觉得自己进步了,而......
  • 【SEOI2024】试题
    SEOI2024上海市第二中学信息学比赛时间:\(2024\)年\(5\)月\(21\)号$16:45\sim17:45$题目名称\(二元运算器\)\(修改向量\)\(意大利面序列\)\(旅途的华章\)\(异色\)题目类型传统型传统型传统型传统型传统型目录\(calulator\)\(vector\)\(noddles\)\(j......