Python爬虫实战,argparse模块,Python模拟登录抓取微博实现数据可视化
前言
今天的目标是写个爬虫,爬取目标用户发的所有微博数据。废话不多说,让我们愉快地开始吧~
开发工具
** Python版本:**3.6.4
** 相关模块:*8
argparse模块;
DecryptLogin模块;
lxml模块;
tqdm模块;
prettytable模块;
pyecharts模块;
jieba模块;
wordcloud模块;
以及一些python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
注意,DecryptLogin模块经常更新,所以为了保证能正常用于公众号内的所有相关例子,请及时升级版本,命令格式如下:
pip install DecryptLogin --upgrade
原理简介
这里简单讲讲整个爬取的流程吧。首先,当然是模拟登录新浪微博啦,这里还是借助我们之前开源的模拟登录包来实现微博的模拟登录。具体而言,代码实现如下:
'''利用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也一直在变化。
思路就是这么个思路,一些细节的处理就自己看源代码吧
数据可视化
还是老样子,把爬到的数据拿来可视化一波呗,方便起见,就看看刘亦菲的微博数据可视化效果吧。
先来看看用她发的所有微博做的词云吧(仅原创微博):
然后看看她原创和转发的微博数量?
以及每年发的微博数量?
果然现在发的微博数量变少了很多。看看她发的第一条微博呗,微博id是zoaIU7o2d,??:
“大家好,我是刘亦菲”
统计一下她每年发的原创微博都拿到了多少赞?
多少转发量?
以及多少评论?
文章到这里就结束了,感谢你的观看,关注我每天分享Python模拟登录系列,下篇文章分享模拟登录网易云音乐自动签到