翼度科技»论坛 编程开发 python 查看内容

【经典爬虫案例】用Python爬取微博热搜榜!

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
目录

一、爬取目标

您好,我是@马哥python说,一名10年程序猿。
本次爬取的目标是: 微博热搜榜

分别爬取每条热搜的:
热搜标题、热搜排名、热搜类别、热度、链接地址。
下面,对页面进行分析。
经过分析,此页面没有XHR链接通过,也就是说,没有采用AJAX异步技术。
所以,只能针对原页面进行爬取。
二、编写爬虫代码

2.1 前戏

首先,导入需要用到的库:
  1. import pandas as pd  # 存入excel数据
  2. import requests  # 向页面发送请求
  3. from bs4 import BeautifulSoup as BS  # 解析页面
复制代码
定义一个爬取目标地址:
  1. # 目标地址
  2. url = 'https://s.weibo.com/top/summary?cate=realtimehot'
复制代码
定义一个请求头:
  1. # 请求头
  2. header = {
  3.         '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',
  4.         'Host': 's.weibo.com',
  5.         'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  6.         'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
  7.         'Accept-Encoding': 'gzip, deflate, br',
  8.         # 定期更换Cookie
  9.         'Cookie': '换成自己的Cookie值'
  10. }
复制代码
其中,Cookie需要换成自己的Cookie值。
2.2 获取cookie

怎么查看自己的Cookie?
Chrome浏览器,按F12打开开发者模式,按照以下步骤操作:


  • 选择网络:Network
  • 选择所有网络:All
  • 选择目标链接地址
  • 选择头:Headers
  • 选择请求头:Request Headers
  • 查看cookie值
2.3 请求页面

下面,向页面发送请求:
  1. r = requests.get(url, headers=header)  # 发送请求
复制代码
2.4 解析页面

接下来,解析返回的页面:
  1. soup = BS(r.text, 'html.parser')
  2. ​```
  3. ![](https://img2023.cnblogs.com/blog/2864563/202307/2864563-20230711213330436-846402627.png)
  4. 根据页面分析,每条热搜都放在了标签为section的、class值为list的数据里,里面每条热搜,又是一个a标签。
  5. 所以,根据这个逻辑,解析页面,以获取链接地址为例:
  6. ```python
  7. items = soup.find('section', {'class': 'list'})
  8. for li in items.find_all('li'):
  9.         # 链接地址
  10.         href = li.find('a').get('href')
  11.         href_list.append('https://s.weibo.com' + href)
复制代码
页面其他元素,热搜标题、排名、热度、类别等获取代码,不再一一赘述。
2.5 转换热搜类别

其中,热搜类别这个元素需要注意,在页面上是一个个图标,背后对应的是class值,是个英文字符串,需要转换成对应的中文含义,定义以下函数进行转换:
  1. def trans_icon(v_str):
  2.         """转换热搜类别"""
  3.         if v_str == 'icon_new':
  4.                 return '新'
  5.         elif v_str == 'icon_hot':
  6.                 return '热'
  7.         elif v_str == 'icon_boil':
  8.                 return '沸'
  9.         elif v_str == 'icon_recommend':
  10.                 return '商'
  11.         else:
  12.                 return '未知'
复制代码
目前的转换函数包括了"新"、"热"、"沸"、"商"等类别。
我记得,微博热搜类别,是有个"爆"的,就是热度最高的那种,突然蹿升的最热的热点,爆炸性的。但是现在没有爆炸性新闻,所以我看不到"爆"背后的class值是什么。
后续如果有爆炸性热点,可以按照代码的逻辑,加到这个转换函数里来。
2.6 保存结果

依然采用我最顺手的to_excel方式,存入爬取的数据:
  1. df = pd.DataFrame(  # 拼装爬取到的数据为DataFrame
  2.                 {
  3.                         '热搜标题': text_list,
  4.                         '热搜排名': order_list,
  5.                         '热搜类别': type_list,
  6.                         '热度': view_count_list,
  7.                         '链接地址': href_list
  8.                 }
  9.         )
  10. df.to_excel('微博热搜榜.xlsx', index=False)  # 保存结果数据
复制代码
至此,整个爬取过程完毕。
2.7 查看结果数据

查看一下,保存到excel里的数据:

其中,第一条是置顶热搜,所以一共是 (1+50=51) 条数据。
演示视频:https://www.zhihu.com/zvideo/1488901467788070912

三、获取完整源码

get完整代码:【最新爬虫案例】用Python爬取微博热搜榜!
我是@马哥python说,持续分享python源码干货中!

来源:https://www.cnblogs.com/mashukui/p/17546027.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具