python爬取微信好友信息并根据导出的csv做数据分析

写在前面:

之前了解过一点python,前两天看了一篇文章,一件有趣的事:我用 Python 爬了爬自己的微信朋友,感觉还挺有意思的,不过文章看完了,自己敲代码的时候还是有点坑踩进去的,所以我写篇文章来填坑啦!顺便把省份统计拿出来做个范例。

正文

pip install itchat,pip install pandas安装依赖。

多说一句,一般写python都会在文件开头加一句

#coding=utf8 coding和后面的等于号之间不要有空格。

首先安装了这个包之后小试牛刀,打印一下男女人数并且利用pandas输出好友列表文件。

#coding=utf8 
import itchat
def get_var(var): #定义获取变量的方法
	variable = []
	for i in friends:
		value = i[var]
		variable.append(value)
	return variable

itchat.login() # 实现登录功能,会弹出一个二维码让你扫描
friends = itchat.get_friends(update=True)[0:] #获取好友列表

male = female = other = 0

for i in friends[1:]:
	sex = i['Sex']
	if sex == 1:
		male += 1
	elif sex == 2: 
		female += 1
	else:
		other += 1

total = len(friends[1:])
print(male)
print(female)
print(other)

NickName = get_var('NickName') #昵称
Sex = get_var('Sex')
Province = get_var('Province')
City = get_var('City')
Signature = get_var('Signature')

from pandas import DataFrame
data = {'NickName': NickName, 'Sex': Sex, 
'Province': Province, 'City': City, 'Signature': Signature}

frame = DataFrame(data)
frame.to_csv('data.csv', index=True) #输出csv文件

上面这段代码没啥问题,主要是啥呢,这个csv文件是个乱码!怎么读取这个文件呢?下面我们分两种情况来介绍:

第一种,直接读取csv文件。

首先这个乱码问题得解决吧,这个时候推荐文件的打开方式为一个编辑器,什么notepad++啊,sublime啊,或者vscode然后选择保存格式为UTF-8,具体操作针对不同编辑器方式各异,大家可自行搜索,学会搜索是成为一个优秀程序员的秘技。格式修改过来了自然也就不乱码了。

data.csv和本文件都放到桌面上了,所以路径直接读取就好。

#coding=utf8 
# 解析csv,本文件是用于解析微信好友列表

import csv
import io #自带
import sys #自带
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')
exampleFile = open('data.csv','r', encoding='UTF-8')
exampleReader = csv.reader(exampleFile)
provinces = {}
for row in exampleReader:
	# print('Row #' + str(exampleReader.line_num) + ' ' + str(row))
	if (row[3] in provinces.keys()):
		provinces[row[3]] = provinces[row[3]] + 1
	else:
		provinces[row[3]] = 1
print (sorted(provinces.items(), key=lambda d: d[1], reverse=True))

什么?import io, import sys,还有下面一句是干嘛的,那你需要把这几句去掉看看发生了。没错,控制台的中文正常显示变成乱码了。

多说几句,这里dict存储的数据结构为{‘浙江省’: 3,‘河北省’: 5}这种形式,if else判断,比如有浙江省这个key了,那么就给后面的value + 1如果没有,则赋值1

最后一句话是根据dict的value倒序排列,打印的数据根据省份从大到小排序。

坑点
  1. 文件命名不要是csv.py,为什么呢,因为一旦你这样命名你import 的csv不是自带的包了,他会把当前文件引用进来,然后报错没有reader这个属性,所以不要以包名称直接命名文件

  2. 如果不慎以csv.py命名了,你可能会发现以后import csv都会出现问题,这时候你需要去当前文件夹下找csv.py文件和一个缓存文件,即使你刚刚执行了重命名操作。

  3. exampleFile = open('data.csv','r', encoding='UTF-8')如果不加后面的 rencoding ,会报错UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence

然后你说不想用csv文件,你比较喜欢excel,那我们就来读一下excel。不要直接将csv改个后缀变成excel,即使那样生成的文件也很像一个excel,但是程序是读不出来的!这样,新建一个excel文件,然后将csv中的内容拷贝过来,粘贴到excel上就可以了。openpyxl是自带的,不需要下载

#coding=utf8 
# 解析excel,本文件是用于解析微信好友列表

import openpyxl
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')
wb = openpyxl.load_workbook('wechat-data.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
friendsData=[]
for row in range(3, sheet.max_row):
	NickName = sheet['B' + str(row)].value #表示读取的是B单元格中的数据
	Sex = sheet['C' + str(row)].value
	Province = sheet['D' + str(row)].value
	City = sheet['E' + str(row)].value
	Signature = sheet['F' + str(row)].value
	friendData = { #因为只想统计省份,所以没有添加其他属性
		'nick': NickName, 
		'province': Province
	}
	friendsData.append(friendData) #先将数据拼接成一个数组,这也是同csv不同的一步
provinces = {}
for friend in friendsData:
	if (friend['province'] in provinces.keys()):
		provinces[friend['province']] = provinces[friend['province']] + 1
	else:
		provinces[friend['province']] = 1
print (sorted(provinces.items(), key=lambda d: d[1], reverse=True))

说实话,看了代码是不是发现csv文件更方便一些,没错因为csv更接近我们的文本格式。

坑点
  1. 虽说python不需要提前声明变量,但是当使用append方法的时候,他需要知道他是一个数组,所以要在for循环前面加上一个变量的初始化操作。
  2. 有时会遇到一个格式错误 IndentationError: unindent does not match any outer indentation level,这个时候考虑代码中将报错的代码行将有多余的Tab键或者空格键,什么意思呢,也就是if或者else的下一行与前面的间隙格式要统一,是空格就都是空格,是Tab键就都是Tab键。推荐文件统一使用Tab键。
  3. 之前看的一本书的介绍,但是好多属性都变了大家注意下即可。比如 sheet.max_row是新属性,之前是一个方法返回的,但是现在已经不支持该方法了,会导致错误。

本文只是分析了省份数据,其他的可以自行发挥。

说到最后

渐渐发现,python这门语言可以无关项目,无关工程仅仅作为一个脚本语言,可以很大的让我们意识到编程为人们服务的特点,适合提升自己的兴趣,愿我们都能越来越好。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值