VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > python入门教程 >
  • 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,


相关教程