在当今的社交媒体时代,微博作为一个热门的社交平台,蕴含着海量的用户信息和丰富多样的内容。今天,我将带大家深入了解一段 Python 代码,它能够帮助我们获取微博用户的基本信息以及下载其微博中的相关素材,比如图片等。
结果展示(文末附完整代码):
目录
结果展示(文末附完整代码):
一、代码整体介绍
二、代码准备与环境搭建
三、Weibo类的初始化方法(__init__)
1. 设置请求头(headers)
2. 设置 Cookies
四、获取用户基本信息的方法(Get和parse_user_info)
1. Get方法
2. parse_user_info方法
五、解析用户作品相关信息的方法(parse_statuses)
1. parse_statuses方法概述
2. 请求数据
3. 解析数据
六、创建文件夹路径并下载素材的方法(create_folder_path和download_video_with_requests)
1. create_folder_path方法
2. download_video_with_requests方法
七、运行代码(Run方法)
八、总结
全部代码:
注意:
一、代码整体介绍
我们先来看一下这段代码的整体结构。这段代码定义了一个名为Weibo
的类,在这个类中包含了多个方法,每个方法都承担着特定的功能,共同协作实现了从获取用户信息到解析并下载相关素材的完整流程。
二、代码准备与环境搭建
在开始详细讲解代码功能之前,确保你已经安装了以下必要的库:
os
:用于操作系统相关的操作,比如创建文件夹等。random
:虽然在这段代码中可能没有明显体现其主要作用,但它是 Python 中常用的随机数处理库,说不定在后续扩展功能时会用到哦。re
:正则表达式库,用于处理文本中的匹配等操作,不过在当前代码的主要逻辑里暂时未突出其作用。requests
:这是一个非常重要的库,用于发送 HTTP 请求,我们通过它来与微博的服务器进行交互,获取数据。tqdm
:用于在控制台显示进度条,让我们能直观地看到下载等操作的进度情况。
如果你还没有安装这些库,可以通过以下命令在命令行中进行安装(假设你已经安装了 Python 并且配置好了相应的环境):
pip install requests tqdm
三、Weibo
类的初始化方法(__init__
)
当我们创建Weibo
类的实例时,首先会执行__init__
方法。这个方法主要做了两件重要的事情:
1. 设置请求头(headers
)
请求头是我们在向微博服务器发送请求时附带的一些信息,它告诉服务器我们的客户端相关情况,比如使用的浏览器类型、版本等。在这段代码中,设置了如下的请求头信息:
self.headers = {
'填入你的headers'
}
这些信息模仿了一个常见的浏览器请求设置,有助于我们顺利地从微博服务器获取数据,避免因为请求头设置不当而被服务器拒绝访问。
2. 设置 Cookies
Cookies 是服务器在我们访问网页时发送给客户端的一些小数据块,它可以保存一些用户相关的信息,比如登录状态等。在代码中,我们设置了如下的 Cookies 信息:
self.cookies = {
'填入你的cookies'
}
这里的 Cookies 信息应该是在你之前登录微博或者通过其他合法途径获取到的,它能让服务器识别我们的身份或者提供一些特定的权限,以便获取更多的用户相关数据。
四、获取用户基本信息的方法(Get
和parse_user_info
)
1. Get
方法
Get
方法接受一个参数uid
,这个参数就是微博用户的 ID。在这个方法中,我们首先构建了一个请求的 URL,用于获取用户的基本信息:
url = "https://weibo.com/ajax/profile/info"
params = {
"uid": uid
}
response = requests.get(url, headers=self.headers, cookies=self.cookies, params=params).json()
self.parse_user_info(response)
这里通过requests
库发送了一个 GET 请求到指定的 URL,并带上了设置好的请求头、Cookies 以及用户 ID 作为参数。获取到响应后,我们将其转换为 JSON 格式,然后调用parse_user_info
方法来进一步解析这些数据。
2. parse_user_info
方法
这个方法主要负责解析从服务器获取到的用户基本信息。它从响应数据中提取出了以下关键信息:
- 用户名称:通过
Weibo_name = response.get('data').get('user').get('screen_name')
获取。 - 用户粉丝数量:
followers_count = response.get('data').get('user').get('followers_count')
。 - 用户关注数量:
follow_count = response.get('data').get('user').get('friends_count')
。 - 用户描述信息:
description = response.get('data').get('user').get('description')
。 - 用户微博认证信息:
verified_reason = response.get('data').get('user').get('verified_reason')
。
最后,还会将这些提取到的信息打印出来,方便我们查看:
print(Weibo_name, followers_count, follow_count, description, verified_reason)
五、解析用户作品相关信息的方法(parse_statuses
)
1. parse_statuses
方法概述
parse_statuses
方法同样接受用户 ID 作为参数uid
,它的主要目的是获取和解析用户发布的微博作品相关信息,比如微博内容、发布时间、包含的图片等。
2. 请求数据
首先,构建请求的 URL 和参数:
url = "https://weibo.com/ajax/statuses/mymblog"
params = {
"uid": uid,
"page": "0",
"feature": "0"
}
response = requests.get(url, headers=self.headers, cookies=self.cookies, params=params).json()
这里向另一个用于获取用户微博作品的 URL 发送了 GET 请求,并获取到响应数据,同样将其转换为 JSON 格式。
3. 解析数据
获取到响应后,从数据中提取出了以下重要信息:
- 微博内容(原始文本):
text_raw = statuses.get('text_raw')
。 - 发布时间:
created_at = statuses.get('created_at')
。 - 图片 ID 列表:
pic_ids = statuses.get('pic_ids')
。 - 地区名称:
region_name = statuses.get('region_name')
。
并且对于图片 ID 列表中的每一个图片 ID,还会进一步获取其最大尺寸的图片 URL:
i = []
for pic_id in pic_ids:
pic_infos_urls = statuses.get('pic_infos').get(pic_id).get('largest').get('url')
i.append(pic_infos_urls)
最后,会将这些提取到的信息(微博内容、发布时间、图片 URL 列表、地区名称)打印出来,并调用create_folder_path
方法来处理这些信息,以便后续下载相关素材。
六、创建文件夹路径并下载素材的方法(create_folder_path
和download_video_with_requests
)
1. create_folder_path
方法
这个方法首先根据获取到的微博用户名称创建一个以用户名为名称的主文件夹(如果不存在的话):
materials_dir = Weibo_name
if not os.path.exists(materials_dir):
os.makedirs(materials_dir)
然后根据微博内容的前两个字符创建一个子文件夹,用于存放相关素材:
folder_name = str(title[:2])
folder_path = os.path.join(materials_dir, folder_name)
if not os.path.exists(folder_path):
os.makedirs(folder_path)
最后,调用download_video_with_requests
方法,将创建好的文件夹路径和图片 URL 列表作为参数传递过去,以便下载图片素材。
2. download_video_with_requests
方法
这个方法负责实际的图片下载操作。它通过遍历图片 URL 列表,使用requests
库发送请求获取图片数据,并将其保存到指定的文件夹路径下。在下载过程中,还使用了tqdm
库来显示下载进度条,让我们能清楚地看到下载的进度情况。
try:
j = 1
for url in tqdm(i, desc="下载素材进度"):
response = requests.get(url)
image_name = f'{j}.{url[-3:]}' # 图片名称为数字+扩展名
j += 1 # 累加计数器
image_path = os.path.join(save_path, image_name)
if response.status_code == 200:
with open(image_path, 'wb') as f:
total_size = int(response.headers.get('content-length', 0))
block_size = 1024 # 每次写入的块大小
progress_bar = tqdm(total=total_size, unit='iB', unit_scale=True)
f.write(response.content)
progress_bar.update(len(response.content))
progress_bar.close()
print(f"素材 {image_name} 已成功下载到 {save_path}")
else:
print(f"下载素材 {image_name} 失败,状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"下载素材时出错: {e}")
七、运行代码(Run
方法)
最后,我们来看一下Run
方法。这个方法是整个程序的入口点,当我们直接运行脚本时,就会执行这个方法。在这个方法中,首先会提示用户输入要获取信息的微博用户 ID:
uid = int(input('请输入你要获取信息的id:'))
然后依次调用Get
方法和parse_statuses
方法,来完成获取用户基本信息和解析用户作品相关信息以及下载相关素材的整个流程。
八、总结
全部代码:
# -*- coding:utf-8 -*-
import os
import random
import re
import requests
from tqdm import tqdm
class Weibo(object):
def __init__(self):
self.headers = {
}
self.cookies = {
}
# 传参uid输入用户id来获取数据
def Get(self, uid):
url = "https://weibo.com/ajax/profile/info"
params = {
"uid": uid
}
response = requests.get(url, headers=self.headers, cookies=self.cookies, params=params).json()
self.parse_user_info(response)
def parse_user_info(self, response):
"""
解析用户基本信息
"""
global Weibo_name
# 获取用户名称
Weibo_name = response.get('data').get('user').get('screen_name')
# 获取用户粉丝数量
followers_count = response.get('data').get('user').get('followers_count')
# 获取用户关注数量
follow_count = response.get('data').get('user').get('friends_count')
# 获取用户描述信息
description = response.get('data').get('user').get('description')
# 获取用户微博认证信息
verified_reason = response.get('data').get('user').get('verified_reason')
# 打印数据
print(Weibo_name, followers_count, follow_count, description, verified_reason)
def parse_statuses(self, uid):
"""
解析用户作品相关信息
"""
url = "https://weibo.com/ajax/statuses/mymblog"
params = {
"uid": uid,
"page": "0",
"feature": "0"
}
response = requests.get(url, headers=self.headers, cookies=self.cookies, params=params).json()
statuses_list = response.get('data').get('list')
since_id = response.get('data').get('since_id')
print(since_id)
for statuses in statuses_list:
text_raw = statuses.get('text_raw')
created_at = statuses.get('created_at')
pic_ids = statuses.get('pic_ids')
print(pic_ids)
region_name = statuses.get('region_name')
i = []
for pic_id in pic_ids:
pic_infos_urls = statuses.get('pic_infos').get(pic_id).get('largest').get('url')
i.append(pic_infos_urls)
print(text_raw, created_at, i, region_name)
self.create_folder_path(text_raw,i)
def create_folder_path(self, title,i):
materials_dir = Weibo_name
if not os.path.exists(materials_dir):
os.makedirs(materials_dir)
folder_name = str(title[:2])
folder_path = os.path.join(materials_dir, folder_name)
if not os.path.exists(folder_path):
os.makedirs(folder_path)
self.download_video_with_requests(folder_path,i)
def download_video_with_requests(self, save_path, i):
try:
j = 1
for url in tqdm(i, desc="下载素材进度"):
response = requests.get(url)
image_name = f'{j}.{url[-3:]}' # 图片名称为数字+扩展名
j += 1 # 累加计数器
image_path = os.path.join(save_path, image_name)
if response.status_code == 200:
with open(image_path, 'wb') as f:
total_size = int(response.headers.get('content-length', 0))
block_size = 1024 # 每次写入的块大小
progress_bar = tqdm(total=total_size, unit='iB', unit_scale=True)
f.write(response.content)
progress_bar.update(len(response.content))
progress_bar.close()
print(f"素材 {image_name} 已成功下载到 {save_path}")
else:
print(f"下载素材 {image_name} 失败,状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"下载素材时出错: {e}")
def Run(self):
uid = int(input('请输入你要获取信息的id:'))
self.Get(uid)
self.parse_statuses(uid)
if __name__ == '__main__':
spider = Weibo()
spider.Run()
通过以上对这段 Python 代码的详细讲解,我们可以看到它能够实现从微博获取用户基本信息以及下载用户微博中相关素材的功能。当然,在实际使用过程中,你可能需要根据自己的需求对代码进行一些调整和扩展,比如处理更多类型的素材、优化错误处理等。希望这篇教程能帮助你更好地理解和运用这段代码,让你在获取微博数据方面更加得心应手。
注意:
在使用本代码获取微博数据时,请务必遵守相关法律法规以及微博平台的使用规则和服务协议。本代码仅用于学习和研究目的,不得用于任何非法的商业用途或侵犯他人隐私、权益的行为。若因不当使用本代码而导致的任何法律纠纷或不良后果,使用者需自行承担全部责任。在进行数据抓取操作之前,请确保你已经充分了解并获得了合法的授权与许可,尊重网络平台的生态环境和其他用户的合法权益。