Python 获取微博用户信息及作品(完整版)

news2024/11/26 2:09:07

        在当今的社交媒体时代,微博作为一个热门的社交平台,蕴含着海量的用户信息和丰富多样的内容。今天,我将带大家深入了解一段 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 信息应该是在你之前登录微博或者通过其他合法途径获取到的,它能让服务器识别我们的身份或者提供一些特定的权限,以便获取更多的用户相关数据。

四、获取用户基本信息的方法(Getparse_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_pathdownload_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 代码的详细讲解,我们可以看到它能够实现从微博获取用户基本信息以及下载用户微博中相关素材的功能。当然,在实际使用过程中,你可能需要根据自己的需求对代码进行一些调整和扩展,比如处理更多类型的素材、优化错误处理等。希望这篇教程能帮助你更好地理解和运用这段代码,让你在获取微博数据方面更加得心应手。

注意:

        在使用本代码获取微博数据时,请务必遵守相关法律法规以及微博平台的使用规则和服务协议。本代码仅用于学习和研究目的,不得用于任何非法的商业用途或侵犯他人隐私、权益的行为。若因不当使用本代码而导致的任何法律纠纷或不良后果,使用者需自行承担全部责任。在进行数据抓取操作之前,请确保你已经充分了解并获得了合法的授权与许可,尊重网络平台的生态环境和其他用户的合法权益。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2247589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue面试题——描述一下vue

目录 1 vue是什么2 Vue的核心特性2.1 数据驱动(MVVM)2.2 组件化2.3 指令系统 3 Vue跟传统开发的区别 1 vue是什么 简单点说,vue就是一个用于创建用户界面的JavaScript框架,同时也是一个创建单页面应用的Web应用框架,Vu…

Large Spatial Model:End-to-end Unposed Images to Semantic 3D 论文解读

目录 一、概述 二、相关工作 1、SfM和可微神经表示 2、端到端的Image-to-3D 三、LSM 1、密集几何预测 2、2D信息特征提取 3、点特征融合 4、可微渲染 5、损失函数 四、实验 一、概述 该论文提出一种大型空间模型(Larget Spatial Model,LSM)…

A045-基于spring boot的个人博客系统的设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

VMware17安装之VMware Workstation Pro 16升级到17详细教程

VMware17安装之VMware Workstation Pro 16升级到17详细教程 一、下载安装包二、开始安装三、升级成功 当前使用的是VMware Workstation 16 Pro版本,想用最新的17,但是又不想卸载原来的,所以想尝试下看看能不能直接升级,最终升级成…

nature communications论文 解读

题目《Transfer learning with graph neural networks for improved molecular property prediction in the multi-fidelity setting》 这篇文章主要讨论了如何在多保真数据环境(multi-fidelity setting)下,利用图神经网络(GNNs&…

接口上传视频和oss直传视频到阿里云组件

接口视频上传 <template><div class"component-upload-video"><el-uploadclass"avatar-uploader":action"uploadImgUrl":on-progress"uploadVideoProcess":on-success"handleUploadSuccess":limit"lim…

深度学习图像视觉 RKNN Toolkit2 部署 RK3588S边缘端 过程全记录

深度学习图像视觉 RKNN Toolkit2 部署 RK3588S边缘端 过程全记录 认识RKNN Toolkit2 工程文件学习路线&#xff1a; Anaconda Miniconda安装.condarc 文件配置镜像源自定义conda虚拟环境路径创建Conda虚拟环境 本地训练环境本地转换环境安装 RKNN-Toolkit2&#xff1a;添加 lin…

07-SpringCloud-Gateway新一代网关

一、概述 1、Gateway介绍 官网&#xff1a;https://spring.io/projects/spring-cloud-gateway Spring Cloud Gateway组件的核心是一系列的过滤器&#xff0c;通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。 Spring Cloud Gateway是加在整个微服务最前沿的防…

美创科技入选2024数字政府解决方案提供商TOP100!

11月19日&#xff0c;国内专业咨询机构DBC德本咨询发布“2024数字政府解决方案提供商TOP100”榜单。美创科技凭借在政府数据安全领域多年的项目经验、技术优势与创新能力&#xff0c;入选收录。 作为专业数据安全产品与服务提供商&#xff0c;美创科技一直致力于为政府、金融、…

Java编程,配置mongoUri连接mongodb时,需对特殊字符进行转义

一、背景 java程序连接mongo有两种方式&#xff1a; 用户名和密码方式uri方式 1、用户名和密码 以用户数据库为例&#xff0c;注意看它的密码 spring:data:mongodb:host: 192.168.10.17database: db_user_serviceport: 3717username: user_servicepassword: user_service3…

MySQL底层概述—1.InnoDB内存结构

大纲 1.InnoDB引擎架构 2.Buffer Pool 3.Page管理机制之Page页分类 4.Page管理机制之Page页管理 5.Change Buffer 6.Log Buffer 1.InnoDB引擎架构 (1)InnoDB引擎架构图 (2)InnoDB内存结构 (1)InnoDB引擎架构图 下面是InnoDB引擎架构图&#xff0c;主要分为内存结构和磁…

【Github】如何使用Git将本地项目上传到Github

【Github】如何使用Git将本地项目上传到Github 写在最前面1. 注册Github账号2. 安装Git工具配置用户名和邮箱仅为当前项目配置&#xff08;可选&#xff09; 3. 创建Github仓库4. 获取仓库地址5. 本地操作&#xff08;1&#xff09;进入项目文件夹&#xff08;2&#xff09;克隆…

大事件管理系统项目总结(上)

文章目录 大事件管理系统项目总结&#xff08;上&#xff09;Pinia - 配置仓库统一管理Vue3路由配置Vue3导航拦截 大事件管理系统项目总结&#xff08;上&#xff09; Pinia - 配置仓库统一管理 使用pinia多层文件夹嵌套时&#xff0c;导入某个文件的路径会很长&#xff0c;容…

鸿蒙征文|鸿蒙心路旅程:始于杭研所集训营,升华于横店

始于杭研所 在2024年7月&#xff0c;我踏上了一段全新的旅程&#xff0c;前往风景如画的杭州&#xff0c;参加华为杭研所举办的鲲鹏&昇腾集训营。这是一个专门为开发者设计的培训项目&#xff0c;中途深入学习HarmonyOS相关技术。对于我这样一个对技术充满热情的学生来说&…

flowable流程图详细绘制教程

文章目录 前言一、flowable是什么&#xff1f;回答下之前的问题 二、flowable-modeler使用1. 使用步骤2.开始绘制弄一个请假的流程 三 加载该流程总结 前言 flowable有些晦涩难懂的东西&#xff1a; 我最开始接触的时候,还是用的activity,当时觉得好复杂,那么这次经过我自己在…

【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行

文章目录&#xff1a; 【Linux 篇】Docker 的容器之海与镜像之岛&#xff1a;于 Linux 系统内探索容器化的奇妙航行前言安装docker-centos7 【Linux 篇】Docker 的容器之海与镜像之岛&#xff1a;于 Linux 系统内探索容器化的奇妙航行 &#x1f4ac;欢迎交流&#xff1a;在学习…

linux从0到1——shell编程9

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

go项目中比较好的实践方案

工作两年来&#xff0c;我并未遇到太大的挑战&#xff0c;也没有特别值得夸耀的项目。尽管如此&#xff0c;在日常的杂项工作中&#xff0c;我积累了不少心得&#xff0c;许多实践方法也在思考中逐渐得到优化。因此&#xff0c;我在这里记录下这些心得。 转发与封装 这个需求…

Maven的安装——给Idea配置Maven

一、什么是Maven? Maven是一个开源的项目管理工具&#xff0c;它主要用于Java项目的构建、依赖管理和项目生命周期管理。 二、准备环境 maven安装之前&#xff0c;我们要先安装jdk&#xff0c;确保你已经安装了jdk环境。可以通过【win】【r】打开任务管理器&#xff0c;输入…

vscode 远程连接ssh 密钥方式

目录 1. powershell 生成key&#xff1a; 2. 在服务器上安装公钥 linux测试成功&#xff1a; 3).为了确保连接成功&#xff0c;输入如下指令以保证以下文件权限正确&#xff1a; 3 开启 ssh 密钥登录 vscode 远程连接配置 python连接测试ok 查看日志&#xff1a; 命令…