爬一个人的所有微博 python_听说想了解一个人要从爬取她(他)的所有微博开始呢~...

原文链接听说想了解一个人要从爬取她(他)的所有微博开始呢~​mp.weixin.qq.comv2-5df64350e694f38137a00ff96f150cb3_ipico.jpg

导语

既然你已经点进来了,那我就直说吧,标题其实是我瞎编的,但套路你点进来学习的我是真心的。

前两天发了篇文章:

从阅读量可以看出来了,很多小伙伴对这玩意并不感兴趣。看来还是得多回归回归老本行,写点有趣的脚本,才能套路各位过来学习呀。今天的小目标是写个小爬虫,爬取目标用户发的所有微博数据。废话不多说,让我们愉快地开始吧~

原理简介

这里简单讲讲整个爬取的流程吧。首先,当然是模拟登录新浪微博啦,这里还是借助我们之前开源的模拟登录包来实现微博的模拟登录。具体而言,代码实现如下:

'''利用DecryptLogin模拟登录'''

@staticmethod

def login(username, password):

lg = login.Login()

_, session = lg.weibo(username, password, 'mobile')

return session

然后,让程序使用者输入想要爬取的目标用户id。那么如何获取这个微博用户id呢?以刘亦菲的微博为例,首先,进入她的主页,然后可以看到链接里有:

所以刘亦菲的微博用户id为3261134763。

根据使用者输入的微博用户id,我们用已经实现模拟登录的会话来访问以下链接:

# 链接1

url = f'https://weibo.cn/{user_id}'

res = self.session.get(url, headers=self.headers)

# 链接2

url = f'https://weibo.cn/{user_id}/info'

res = self.session.get(url, headers=self.headers)

这个链接在浏览器里显示大概是这样的:

显然,在这,我们可以利用xpath提取到目标用户的一些基本信息:

# 链接1

selector = etree.HTML(res.content)

base_infos = selector.xpath("//div[@class='tip2']/*/text()")

num_wbs, num_followings, num_followers = int(base_infos[0][3: -1]), int(base_infos[1][3: -1]), int(base_infos[2][3: -1])

num_wb_pages = selector.xpath("//input[@name='mp']")

num_wb_pages = int(num_wb_pages[0].attrib['value']) if len(num_wb_pages) > 0 else 1

# 链接2

selector = etree.HTML(res.content)

nickname = selector.xpath('//title/text()')[0][:-3]

xpath是啥我就不多废话了,看下网页源码,很容易就可以写出来:

提取完之后打印出来让程序使用者确认一下用自己输入的用户id获得的用户信息是不是和自己想要爬取的用户信息一样,等使用者确认信息无误再开始爬该用户的微博数据:

# 使用者确认是否要下载该用户的所有微博

tb = prettytable.PrettyTable()

tb.field_names = ['用户名', '关注数量', '被关注数量', '微博数量', '微博页数']

tb.add_row([nickname, num_followings, num_followers, num_wbs, num_wb_pages])

print('获取的用户信息如下:')

print(tb)

is_download = input('是否爬取该用户的所有微博?(y/n, 默认: y) ——> ')

if is_download == 'y' or is_download == 'yes' or not is_download:

userinfos = {'user_id': user_id, 'num_wbs': num_wbs, 'num_wb_pages': num_wb_pages}

self.__downloadWeibos(userinfos)

爬用户微博数据也基本用的xpath来提取数据,而查看用户的微博只需要访问以下这个链接就可以了:

url = f'https://weibo.cn/{user_id}?page={page}'

page代表访问用户的第page页微博

没啥特别的技巧,值得一提的处理只有两点:每爬20页微博数据,就保存一次数据,以避免爬虫意外中断,导致之前已经爬到的数据“人去楼空”;

每爬n页数据就暂停x秒,其中n是随机生成的,且n一直在变化,x也是随机生成的,且x也一直在变化。

思路就是这么个思路,一些细节的处理就自己看源代码吧,代码运行的效果如下(设置的延时比较长,所以数据爬取速度很慢,毕竟只是为了学习的话,没必要搞那么快,都不容易):v2-2fbcab69b674771936d3231bb92f7dea.jpghttps://www.zhihu.com/video/1218225967082405888

代码运行的命令格式为:

python weiboSpider.py --username 用户名 --password 密码

大功告成啦,完整源代码详见相关文件。

数据可视化

老规矩,把爬到的数据拿来可视化一波呗,方便起见,就看看刘亦菲的微博数据可视化效果吧。

先来看看用她发的所有微博做的词云吧(仅原创微博):

然后看看她原创和转发的微博数量?

以及每年发的微博数量?

果然现在发的微博数量变少了很多。看看她发的第一条微博呗,微博id是zoaIU7o2d, :

“大家好,我是刘亦菲”

统计一下她每年发的原创微博都拿到了多少赞?

多少转发量?

以及多少评论?

爬的数据不多,就先这样呗,完整源代码和数据详见相关文件~

相关文件

爬取一个人的微博,需要使用微博的开放API,并且需要申请开发者账号和应用程序来获取API的访问权限。下面是通过Python代码来爬取一个微博的基本步骤: 1. 安装 requests 和 json 库: ``` pip install requests ``` 2. 获取微博开放API的访问令牌 首先需要注册成为微博开发者账号,然后创建应用程序,获取应用程序的 `client_id` 和 `client_secret`,用于后续获取访问令牌。 ```python import requests def get_access_token(client_id, client_secret): url = 'https://api.weibo.com/oauth2/access_token' params = { 'grant_type': 'client_credentials', 'client_id': client_id, 'client_secret': client_secret, } response = requests.post(url, params=params) return response.json()['access_token'] ``` 3. 获取用户的微博列表 使用获取微博列表的API:`https://api.weibo.com/2/statuses/user_timeline.json`,其中需要传入 `access_token` 和 `uid` 参数,`uid` 是需要爬取微博的用户的ID。 ```python def get_user_statuses(access_token, uid, count=100): url = 'https://api.weibo.com/2/statuses/user_timeline.json' params = { 'access_token': access_token, 'uid': uid, 'count': count, } response = requests.get(url, params=params) return response.json()['statuses'] ``` 4. 解析微博内容 微博的内容包含在微博返回的 JSON 数据中,可以根据需要选择解析其中的字段。例如,可以解析微博的文本内容,发布时间,点赞数等信息。下面是一个简单的例子: ```python def parse_statuses(statuses): for status in statuses: text = status['text'] # 微博文本内容 created_at = status['created_at'] # 发布时间 attitudes_count = status['attitudes_count'] # 点赞数 print(text, created_at, attitudes_count) ``` 完整代码示例: ```python import requests def get_access_token(client_id, client_secret): url = 'https://api.weibo.com/oauth2/access_token' params = { 'grant_type': 'client_credentials', 'client_id': client_id, 'client_secret': client_secret, } response = requests.post(url, params=params) return response.json()['access_token'] def get_user_statuses(access_token, uid, count=100): url = 'https://api.weibo.com/2/statuses/user_timeline.json' params = { 'access_token': access_token, 'uid': uid, 'count': count, } response = requests.get(url, params=params) return response.json()['statuses'] def parse_statuses(statuses): for status in statuses: text = status['text'] # 微博文本内容 created_at = status['created_at'] # 发布时间 attitudes_count = status['attitudes_count'] # 点赞数 print(text, created_at, attitudes_count) if __name__ == '__main__': client_id = 'your_client_id' client_secret = 'your_client_secret' access_token = get_access_token(client_id, client_secret) uid = 'your_uid' statuses = get_user_statuses(access_token, uid) parse_statuses(statuses) ``` 需要注意的是,微博对于API的访问频率有限制,如果频繁访问可能会被封禁,因此建议适当控制访问频率。另外,微博的API文档中有详细的参数说明和返回字段说明,可以根据需要进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值