爬虫开发(4)带你写一个百度热门榜爬虫小程序

📚前言

在学习爬虫的道路上,我们经常会遇到一个又一个迷人的挑战,就像枫哥身边如花似玉的花花小老妹一样,总是让人眼前一亮。今天,花花娇羞地向我提出了一个有趣的问题:“鸽鸽,你常常说‘书读百遍其义自见’,也经常强调‘实践出真知’。那这两个观点到底哪个是对的呢?”

我微笑着回答她:“花花,这两个观点其实并不矛盾,它们各有千秋,相辅相成。‘书读百遍其义自见’强调的是理论的重要性。通过反复阅读和学习,我们可以深入理解知识的本质,打下坚实的理论基础。而‘实践出真知’则告诉我们,只有通过实际操作,我们才能真正掌握和运用这些知识。理论和实践相结合,才能让我们在学习的道路上走得更远,更稳。”

所以我们不仅仅要学习一些理论知识,更要勤加练习,才能让技术更撒花姑娘一层楼,那么今天博主带你一起写一个百度热门榜的爬虫小程序吧!

✍前置准备

🚀开发环境

首先呢,你需要有Python运行环境,以及一个编程工具,例如Pycharm(这个如果还没有准备的话,建议搜一下枫哥之前写的环境部署相关的文章学习一下哦!)

然后为了方便接口调用和最终的数据处理,你还需要安装requests(用于发起请求,调用接口并获取数据)和pandas(用于处理Excel数据,方便将爬取到的数据结果进行结构化的整理)2个包,这个很简单,在cmd或者IDE(也就是编程软件)的控制台中使用如下命令安装就可以啦!

pip install requests pandas

🚀接口地址

然后呢我们就需要一个接口地址啦,这个就是你想要爬取的接口的url,我们今天的案例选取的就是这个接口啦:

https://top.baidu.com/api/board?platform=wise&tab=realtime

至于为什么选这个接口,是因为花花妹妹担心我的安全,所以我选了一个公开的接口,进行小量的爬取,避免对服务器造成大量请求,避免发生法律纠纷哦!

🚀请求头

接下来呢,我们就需要搞一个请求头啦!

请求头是干嘛的呢,主要就是在请求接口的时候,带上一些伪装数据,让对方的服务器认证我们的身份时,不会将我们认定为爬虫。比如User-Agent就代表了我们是使用了什么浏览器进行的访问,Host可以避免请求时报400的错误。

其实我们可以直接从F12中,抓取到需要的headers(请求头)信息,也就是在浏览器访问上面的链接时,打开F12-网络,可以看到的这一部分:
在这里插入图片描述
那我就构造一个这样子的请求头吧:

# 请求头,用于伪装爬虫
headers = {
    'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Mobile Safari/537.36',
    'Host': 'top.baidu.com',
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
    'Accept-Encoding': 'gzip, deflate, br',
    'Referer': 'https://top.baidu.com/board?tab=novel'
}

🚀发送请求

接下来,我们就可以发送请求啦!使用 requests.get 发送 GET 请求,获取数据:

# 发送请求
response = requests.get(url, headers=headers)

这样我们就可以将获取到的结果,存储到变量response中。

🚀检查响应码

我们都知道,在http请求中,200代表着响应成功,所以我们需要先判断一下,在刚才的调用过程中,接口是否真的响应成功了。
可以使用response.status_code 的方式,来获取其中的响应码,然后使用if执行判断:

if response.status_code == 200

🚀解析请求

如果响应码是200,那就说明我们应该是成功地获取到数据啦!于是我们就需要用到pandas,来对获取到的结果进行二次处理,代码如下!我会将详细的注释写到代码里面!

# 检查请求是否成功,如果是200,则继续执行数据处理,如果不是,就直接报错
if response.status_code == 200:
    # 将从服务器获取的 JSON 格式的响应内容解析为 Python 字典
    data = response.json()
   
    # 提取置顶热搜。从 data 字典中依次访问 'data'、'cards' 列表的第一个元、再访问 'topContent',得到置顶热搜列表
    top_content_list = data['data']['cards'][0]['topContent']
    # 提取普通热搜,和上面的方式是一样的哦
    content_list = data['data']['cards'][0]['content']
    
    # 合并数据(将置顶热搜和普通热搜列表合并为一个列表)
    all_content = top_content_list + content_list
    
    # 遍历合并后的热搜列表,提取每个热搜项的详细信息,并将其存储在一个列表中
    results = []
    for item in all_content:
        title = item.get('desc', '')
        rank = item.get('hotScore', '')
        index = item.get('index', '')
        description = item.get('desc', '')
        link = item.get('url', '')
        
        results.append({
            '热搜标题': title,
            '热搜排名': rank,
            '热搜指数': index,
            '描述': description,
            '链接地址': link
        })
    
    # 将 results 列表转换为一个 Pandas DataFrame 对象,命名为 df
    df = pd.DataFrame(results)
   # 使用to_excel方法,将数据写入到名为百度热搜榜.xlsx的文件中
    df.to_excel('百度热搜榜.xlsx', index=False)
   # 打印一条消息,告知用户数据已成功保存到指定的 Excel 文件中。
    print("数据已保存到 '百度热搜榜.xlsx'")
else:
    print(f"请求失败,状态码: {response.status_code}")

这样我们就可以提取出其中的热搜内容,并将其写入到百度热搜榜.xlsx文件中,方便我们随时查看!

📚完整代码

完整的代码如下:

import requests
import pandas as pd

# 百度热门榜 API 地址
url = 'https://top.baidu.com/api/board?platform=wise&tab=realtime'

# 请求头,用于伪装爬虫
headers = {
    'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Mobile Safari/537.36',
    'Host': 'top.baidu.com',
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
    'Accept-Encoding': 'gzip, deflate, br',
    'Referer': 'https://top.baidu.com/board?tab=novel'
}

# 发送请求
response = requests.get(url, headers=headers)

# 检查请求是否成功
if response.status_code == 200:
    data = response.json()
    
    # 提取置顶热搜
    top_content_list = data['data']['cards'][0]['topContent']
    # 提取普通热搜
    content_list = data['data']['cards'][0]['content']
    
    # 合并数据
    all_content = top_content_list + content_list
    
    # 解析数据
    results = []
    for item in all_content:
        title = item.get('desc', '')
        rank = item.get('hotScore', '')
        index = item.get('index', '')
        description = item.get('desc', '')
        link = item.get('url', '')
        
        results.append({
            '热搜标题': title,
            '热搜排名': rank,
            '热搜指数': index,
            '描述': description,
            '链接地址': link
        })
    
    # 保存到 Excel
    df = pd.DataFrame(results)
    df.to_excel('百度热搜榜.xlsx', index=False)
    print("数据已保存到 '百度热搜榜.xlsx'")
else:
    print(f"请求失败,状态码: {response.status_code}")

📚代码主要步骤分析

以上代码主要执行了如下几个步骤哦!

  • 解析响应: 将 HTTP 响应内容解析为 Python 字典。
  • 提取数据: 从字典中提取置顶热搜和普通热搜列表。
  • 合并数据: 将两个热搜列表合并为一个列表。
  • 解析数据: 遍历合并后的列表,提取每个热搜项的详细信息。
  • 保存数据: 将提取的热搜信息保存到 Excel 文件中。

此时我们将上述代码,保存到一个 Python 文件中并且自己为他取个名(例如 baidu_hot_search.py),然后在命令行中运行:

python baidu_hot_search.py

运行成功后,你会在当前目录下找到一个名为 百度热搜榜.xlsx 的 Excel 文件,其中包含了爬取到的百度热门榜数据。

如果你是在Pycharm等编程工具中编写的,就可以在工具中直接右键-运行,也可以实现一样的效果哦!今天的爬虫就这样子顺利地写完啦!

✍结尾

花花听后点了点头,脸上露出了满意的笑容。她轻声说道:“原来如此,谢谢你,鸽鸽。看来我不仅要多读书,还要多动手实践才行。”

看着她那充满求知欲的眼神,我不禁感叹,学习之路虽然充满挑战,但有这样一位美丽聪慧的伙伴相伴,一切都变得格外有意义。快去和你的花花实践一下吧!
在这里插入图片描述

笔者 綦枫Maple 的其他作品,欢迎点击查阅哦~:
📚Jmeter性能测试大全:Jmeter性能测试大全系列教程!持续更新中!
📚UI自动化测试系列: Selenium+Java自动化测试系列教程❤
📚移动端自动化测试系列:Appium自动化测试系列教程


👨‍🎓作者:綦枫Maple
🚀博客:CSDN、掘金等
🚀网易云音乐:https://y.music.163.com/m/user?id=316706413
🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。
🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系处理。
🀐其他:若有兴趣,可以加页面左侧的《Java自动化技术交流屋》探讨学习哦~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

綦枫Maple

感谢你的投喂鸭~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值