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

白露未晞

原文链接

听说想了解一个人要从爬取她(他)的所有微博开始呢~​mp.weixin.qq.com图标

导语

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

前两天发了篇文章:

嘿嘿,之前开源的模拟登录工具包开源文档上线啦~

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

原理简介

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

'''利用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也一直在变化。

思路就是这么个思路,一些细节的处理就自己看源代码吧,代码运行的效果见:
https://zhuanlan.zhihu.com/p/...

代码运行的命令格式为:

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

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

数据可视化

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

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

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

以及每年发的微博数量?

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

“大家好,我是刘亦菲”

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

多少转发量?

以及多少评论?

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

相关文件

https://github.com/CharlesPikac

阅读 2k

白露未晞
人工智能;爬虫。
209 声望
33 粉丝
0 条评论
209 声望
33 粉丝
文章目录
宣传栏