暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python中调用微博API采集数据

原创 TiAmoZhang 2022-11-01
1406

640.jpg
使用微博API进行微博信息获取的基本流程如图9-4所示。在该流程中,首先通过申请到的access token,通过开放平台的认证接口进行OAuth认证。认证通过后,即可通过微博所提供的接口获得各种数据,例如用户数据、博文、关注信息等等。

在微博OAuth2.0实现中,授权服务器在接收到验证授权请求时,会按照OAuth2.0协议对本请求的请求头部、请求参数进行检验,若请求不合法或验证未通过,授权服务器会返回相应的错误信息,包含以下几个参数:
error: 错误码

error_code: 错误的内部编号

error_description: 错误的描述信息

error_url: 可读的网页URI,带有关于错误的信息,用于为终端用户提供与错误有关的额外信息。

如果通过认证,则可以调用各种API。返回的数据按照JSON格式进行封装,最后根据API文档的说明提取所需要的内容。
640.jpg
01

微博API及使用方法

1 微博API介绍
微博API是微博官方提供给开发人员的一组函数调用接口,这是一种在线调用方式,不同于普通语言所提供的函数。这些API能够根据输入的参数返回相应的数据,其范围涵盖用户个人信息、用户的粉丝和关注、用户发布的博文、博文的评论等等。只要携带符合要求的参数向接口发送HTTP请求,接口就会返回所对应的JSON格式数据。
新浪微博提供的API有九大类,即:粉丝服务接口、微博接口、评论接口、用户接口、关系接口、搜索接口、短链接口、公共服务接口和OAuth 2.0授权接口。这些接口的名称及功能如表9-1所示。需要注意的是,新浪微博API会不断升级,最新的接口及功能可以到官方网站查阅:http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI。
2 微博API的使用方法
对于每个API,新浪微博规定了其请求参数、返回字段说明、是否需要登录、HTTP请求方式、访问授权限制(包括访问级别、是否频次限制)等关键信息。其中,请求参数是API的输入,而返回字段是API调用的输出结果,一般是以JSON的形式进行封装。HTTP请求方式支持GET和POST两种,访问授权限制则规定了客户端调用API的一些约束条件。
01

例1:采集微博用户个人信息

微博用户的个人信息包括用户昵称、简介、粉丝数、关注数、微博数等,通过调用微博开发接口API可以得到这些个人信息数据。该接口为users/show,请求参数如表9-6所示,其中参数uid与screen_name二者必选其一,且只能选其一个。
640.png
该接口返回的信息包含了用户的昵称、省份、头像、粉丝数等等
640.png
在理解接口定义之后,可以使用Python来实现微博个人信息采集。主要过程包括按照请求参数构造、发起请求和结果的提取和转换。具体的程序代码和解释如下。

Prog-12-weiboUserInfo.py


# -*- coding: utf-8 -*-
from urllib import parse
import requests
import json

# 调用users/show 接口
def get_pinfo(access_token,uid):
    # 用户个人信息字典
    pinfo_dict = {}
    url = 'https://api.weibo.com/2/users/show.json'
    url_dict = {'access_token': access_token, 'uid': uid}
    url_param = parse.urlencode(url_dict)    
    res=requests.get(url='%s%s%s' % (url, '?', url_param), headers=header_dict)

    decode_data = json.loads(res.text)
    pinfo_dict['昵称'] = decode_data['name']
    pinfo_dict['简介'] = decode_data['description']
    # 性别,转换一下
    if decode_data['gender'] == 'f':
        pinfo_dict['性别'] = '女'
    elif decode_data['gender'] == 'm':
        pinfo_dict['性别'] = '男'
    else:
        pinfo_dict['性别'] = '未知'
    # 注册时间
    pinfo_dict['注册时间'] = decode_data['created_at']
    # 粉丝数
    pinfo_dict['粉丝数'] = decode_data['followers_count']
    # 关注数
    pinfo_dict['关注数'] = decode_data['friends_count']
    # 微博数
    pinfo_dict['微博数'] = decode_data['statuses_count']
    # 收藏数
    pinfo_dict['收藏数'] = decode_data['favourites_count']
    return pinfo_dict

if __name__ == '__main__':
    header_dict = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko'}
    # 填写access_token参数 与 uid
    access_token = '*****************'  #通过8.2节方法获得,每个人不一样
    uid = '7059060320' 
    pinfo = get_pinfo(access_token,uid)
    for key, value in pinfo.items():
       print('{k}:{v}'.format(k=key, v=value))
复制

在http请求中携带access_token和uid参数访问接口,获得一个json格式的返回结果,对json进行解析即可。运行结果如图9-5所示。
640.png
03

例2:采集微博博文

使用微博API获取博文主要涉及到两个接口,即statuses/user_timeline/ids和statuses/show。前者用于获取用户发布的微博的ID列表,后者是根据微博ID获得单条微博信息内容,包括文本内容、图片以及评论转发情况等。以下是这两个接口的详细说明。

(1) statuses/user_timeline/ids

该接口的请求参数包括采用OAuth授权后获得的access_token,以及所需要检索的微博用户ID,具体定义如表9-8所示,有些参数是可选的,采用默认值。

640.png
该接口只返回最新的5条数据,即用户uid所发布的微博ID列表。格式如下,statuses中即为记录列表。

{

    "statuses": [

        "3382905382185354",

        "3382905252160340",

        "3382905235630562",

        ...

    ],

    "previous_cursor": 0, // 暂未支持

    "next_cursor": 0,         // 暂未支持

    "total_number": 16

}
复制

(2) statuses/show

该接口的请求参数也包括采用OAuth授权后获得的access_token,另一个就是微博ID,两个参数均为必选,具体说明如表9-9所示。

640.png
该接口返回微博的相关属性值,包括微博创建时间、文本内容等
640.png
下面,以statuses/user_timeline/ids接口为例来说明具体的调用和处理方法。

(1)根据接口说明构造正确的http请求。

阅读在线接口说明可知,该接口需要以Get方式请求,必选参数access_token,返回格式为json。其中必选参数access_token来源于OAuth授权,具体创建方法见9.2节。

(2)向服务端发送http请求,并处理返回数据。

在获取了access_token后,就可以使用Python内建模块urllib构建http请求或requests发送请求。可以发现返回的json中包含了该用户的最新5条微博的id,这是因为由于微博API的限制,非商用授权调用微博API中的statuses/user_timeline/ids接口只能获取已授权用户的最新五条博文。

在获得了微博id数据集之后,就逐条记录调用接口statuses/show,该接口会返回对应微博id的博文信息。程序解析json封装的数据,即可实现获取用户博文信息的目标。整个处理过程如图9-6所示。
640.png
基于这样的设计思路,使用Python语言可以构造两个函数get_weibo、get_weiboid来获得指定用户的最近博文信息。在程序中需要导入json,具体程序及解释如下。
Prog-13-weiboMsgInfo.py

# -*- coding: utf-8 -*-
from urllib import parse
import requests
import json

# 调用statuses/show 接口
def get_weibo(access_token, wid,header_dict):
    url = 'https://api.weibo.com/2/statuses/show.json'
    url_dict = {'access_token': access_token, 'id': wid}
    url_param = parse.urlencode(url_dict)
    res=requests.get(url='%s%s%s' % (url, '?', url_param), headers=header_dict)
    decode_data = json.loads(res.text)
    text = decode_data['text']
    if 'retweeted_status' in decode_data:
        text += '     <---原始微博:'+decode_data['retweeted_status']['text']
    return text

# 调用statuses/user_timeline/ids 接口
def get_weiboid(access_token,header_dict):
    url = 'https://api.weibo.com/2/statuses/user_timeline/ids.json'
    url_dict = {'access_token': access_token}
    url_param = parse.urlencode(url_dict)
    #req = request.Request(url='%s%s%s' % (url, '?', url_param), headers=header_dict)
    #res = request.urlopen(req)
    #res = res.read()
    res=requests.get(url='%s%s%s' % (url, '?', url_param), headers=header_dict)
    decode_data = json.loads(res.text)
    wid_list = decode_data['statuses']
    return wid_list

header_dict = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko'}
# 填写access_token参数
access_token = '2.00cDGjhHQUpTpCf203bf4e270j8kfF' 
wid_list = get_weiboid(access_token=access_token, header_dict=header_dict)
# 输出博文
for item in wid_list:
    weibo_text = get_weibo(access_token=access_token, wid=item, header_dict=header_dict)
    print('微博id:'+str(item)+'--->'+weibo_text+'\n')
print('获取结束\n')
复制

本例首先使用get_weiboid()函数,调用statuses/user_timeline/ids接口,获取最新5条微博的ID;然后使用get_weibo()函数,调用statuses/user_timeline/ids接口,传入刚刚得到的微博ID,并获得返回的对应ID的博文内容。

运行结果如图9-7所示,显示了作者发的三条博文。
640.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论