小言_互联网的博客

用爬虫分析上热榜涨的600粉,竟发现。。。(含代码和详解)

369人阅读  评论(0)

 

目录

 

前言

下面我就分享一下这次经历!

1、编程环境及相关库的安装

1.1、编程环境:

1.2、第三方库:

1.3库的安装方法:

     1.3.1、Windows的shell命令安装

     1.3.2、在编程环境内安装

2、如何通过爬虫获取粉丝数据

2.1、获取自己待爬的URI

2.1.1、到这个界面,然后右键检查

2.1.2、红色圈住的便是待爬的URL​

2.1.3、记录下"请求URL"和"User-agent"在两个重要的待爬信息​

2.2、采用requests获取粉丝数据

2.3粉丝数据的组成

2.3.1粉丝数据标签的解释

2.3.2重点要分析的数据

3、如何合理的分析这些数据

3.1、把各个分页的数据合并

3.2、数据预处理,数据信息查看

3.3、数据的清洗和预处理等步骤

3.4、数据提取和筛选

3.5数据处理 

3.6数据存储

4、分析粉丝数据得到的结论


前言

最近参加了新星计划,在各位老哥们的帮助下成功上了一次热榜。一夜之间涨了600多的粉。但是这些粉丝全部都是通过用户推荐界面加我的。我就特别好奇我现有粉丝的用户画像(数据分析名词),于是就打算通过python爬一下我这600多粉丝的码龄和用户名以及是不是VIP这三项信息。最后竟然发现了。。。好奇就好好学一下吧。下图是博主近7天内的粉丝数据。关注一下我吧,拜托了,看在我这次这么有诚意的份上。。

博主近七天内的粉丝数据

下面我就分享一下这次经历!

1、编程环境及相关库的安装

1.1、编程环境:

1.2、第三方库:

(1)requests:爬虫爬数据需要用到的库,其他库也可以实现,如Urllib3、urllib等等

(2)numpy:爬虫得到的数据是一个元组,使用numpy来处理数据比较方便

(3)matplotlib:数据可视化需要用到的库

(4)os:读取和保存过程中产生的数据需要用到的库

(5)pandas: Pandas是一个强大的分析结构化数据的工具集;它的使用基础是Numpy(提供高性能的矩阵运算);用于数据挖掘和数据分析,同时也提供数据清洗功能。

1.3库的安装方法:

我个人推荐第二种方法

     1.3.1、Windows的shell命令安装

 (1)打开命令窗口

 (2)输入该命令,并按下enter  ,pip install -i https://pypi.tuna.tsinghua.edu.cn/simple patsy[注:simple后面加需要安装的库]

     1.3.2、在编程环境内安装

     (1)文件--》设置--》项目--》Project Interpreter,如下图所示:

(2)点击+号,跳出下面这个窗口,在搜索栏直接搜索就行了,如果出现”Error updating package list: Status: 404“的错误提示,看第四步,如果没有错误看第三步。

(3)以requests库为例子,搜索可得requests的信息,然后直接点击Install Package进行下载安装即可。

(4)点击第二步图里面的Manage Repositories按钮,出现如下界面,点击加号输入https://pypi.tuna.tsinghua.edu.cn/simple/,然后点击确认即可,之后在按照第三步安装所需的库。

 

2、如何通过爬虫获取粉丝数据

2.1、获取自己待爬的URI

2.1.1、到这个界面,然后右键检查

2.1.2、红色圈住的便是待爬的URL

2.1.3、记录下"请求URL"和"User-agent"在两个重要的待爬信息

 

 

我们上面得到的待爬URL为:https://blog.csdn.net//phoenix/web/v1/fans/list?page=1&pageSize=40&blogUsername=qq_45049500,注意这只是我粉丝数据的第一页,不是索引的粉丝数据,比如粉丝数据一共有500页,那么待爬的URL便有500个。这里放一下爬虫的流程有兴趣的可以看一下。

2.2、采用requests获取粉丝数据

这是一个简单的爬虫代码,获取了10页粉丝数据,我下面分析一下粉丝数据的组成。


   
  1. import requests
  2. url=[ "https://blog.csdn.net//phoenix/web/v1/fans/list?page=1&pageSize=40&blogUsername=qq_45049500",
  3. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=2&pageSize=40&blogUsername=qq_45049500",
  4. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=3&pageSize=40&blogUsername=qq_45049500",
  5. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=4&pageSize=40&blogUsername=qq_45049500",
  6. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=5&pageSize=40&blogUsername=qq_45049500",
  7. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=6&pageSize=40&blogUsername=qq_45049500",
  8. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=7&pageSize=40&blogUsername=qq_45049500",
  9. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=8&pageSize=40&blogUsername=qq_45049500",
  10. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=9&pageSize=40&blogUsername=qq_45049500",
  11. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=10&pageSize=40&blogUsername=qq_45049500",
  12. ]
  13. headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 Edg/91.0.864.37'
  14. }
  15. for i in range( 0, 10):
  16. response=requests.get(url[i],headers=headers)
  17. # print(response.content)
  18. print(response.text)

2.3粉丝数据的组成


   
  1. { "code": 200,
  2. "message": "success",
  3. "data": { "total": 727,
  4. "list": [
  5. { "username": "daoyin1", "nickname": "daoyin1", "userAvatar": "https://profile.csdnimg.cn/A/8/2/3_daoyin1",
  6. "loginUserNameIsFollow": false, "blogUrl": "https://blog.csdn.net/daoyin1", "years": "0", "vip": false,
  7. "vipIcon": "", "companyExpert": false, "companyExpertIcon": "", "expert": false, "expertIcon": ""},
  8. { "username": "m0_50546016", "nickname": "lucifer\xe4\xb8\x89\xe6\x80\x9d\xe5\x90\x8e\xe8\xa1\x8c",
  9. "userAvatar": "https://profile.csdnimg.cn/4/D/6/3_m0_50546016", "loginUserNameIsFollow": false,
  10. "blogUrl": "https://blog.csdn.net/m0_50546016", "years": "1", "vip": false, "vipIcon": "",
  11. "companyExpert": false, "companyExpertIcon": "", "expert": false, "expertIcon": ""},
  12. { "username": "qq_27489007", "nickname": "\xe8\x8a\x9d\xe9\xba\xbb\xe7\xb2\x92\xe5\x84\xbf",
  13. "userAvatar": "https://profile.csdnimg.cn/F/3/1/3_qq_27489007", "loginUserNameIsFollow": false,
  14. "blogUrl": "https://blog.csdn.net/qq_27489007", "years": "6", "vip": false, "vipIcon": "",
  15. "companyExpert": false, "companyExpertIcon": "", "expert": false, "expertIcon": ""}]}}

2.3.1粉丝数据标签的解释

一共12个类别:

username
用户名
nickname
用户昵称
userAvatar
用户头像
loginUserNameIsFollow
不清楚,感觉没啥用
blogUrl
该粉丝的博客网址
years
用户年限,小于1年为零
vip
是不是VIP
vipIcon
VIP图标
companyExpert
是不是企业专家
companyExpertIcon
企业专家图标
expert
是不是专家
expertIcon
专家图标

2.3.2重点要分析的数据

 上面红颜色的那几个标签

3、如何合理的分析这些数据

我写了很多数据处理的库函数现象就不都展示出来了,不然太多了,只放个可视化的吧

3.1、把各个分页的数据合并

使用requesys爬虫获取数据并把数据然后使用pandas和join把各个分页的数据合并到一起,即"XXX.csv"类型的文件方便我们处理.csdn粉丝数据一个网页里面有40个粉丝数据,我目前一共726个粉,所以待爬的URL一共有不满20页,按照20页来计算了。

分页数据的合并我使用了pandas自带的concat()函数,我这里就不在科普了。

具体如下:df1=pd.concat([df1,df],ignore_index="ture")


   
  1. import requests
  2. import numpy as np
  3. import pandas as pd
  4. import json
  5. df1=[];
  6. #待爬的粉丝界面URL
  7. url=[ "https://blog.csdn.net//phoenix/web/v1/fans/list?page=1&pageSize=40&blogUsername=qq_45049500",
  8. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=2&pageSize=40&blogUsername=qq_45049500",
  9. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=3&pageSize=40&blogUsername=qq_45049500",
  10. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=4&pageSize=40&blogUsername=qq_45049500",
  11. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=5&pageSize=40&blogUsername=qq_45049500",
  12. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=6&pageSize=40&blogUsername=qq_45049500",
  13. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=7&pageSize=40&blogUsername=qq_45049500",
  14. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=8&pageSize=40&blogUsername=qq_45049500",
  15. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=9&pageSize=40&blogUsername=qq_45049500",
  16. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=10&pageSize=40&blogUsername=qq_45049500",
  17. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=11&pageSize=40&blogUsername=qq_45049500",
  18. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=12&pageSize=40&blogUsername=qq_45049500",
  19. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=13&pageSize=40&blogUsername=qq_45049500",
  20. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=14&pageSize=40&blogUsername=qq_45049500",
  21. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=15&pageSize=40&blogUsername=qq_45049500",
  22. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=16&pageSize=40&blogUsername=qq_45049500",
  23. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=17&pageSize=40&blogUsername=qq_45049500",
  24. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=18&pageSize=40&blogUsername=qq_45049500",
  25. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=19&pageSize=40&blogUsername=qq_45049500",
  26. "https://blog.csdn.net//phoenix/web/v1/fans/list?page=20&pageSize=40&blogUsername=qq_45049500"
  27. ]
  28. #待爬界面的User-Agent
  29. headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 Edg/91.0.864.37'
  30. }
  31. for i in range( 0, 19):
  32. response=requests.get(url[i],headers=headers)
  33. content = json.loads(response.text)
  34. #print(content)
  35. stp1=content.get( "data")
  36. stp2=stp1.get( "list")
  37. df=pd.DataFrame(stp2)
  38. if i< 1:
  39. df1=df
  40. else:
  41. df1=pd.concat([df1,df],ignore_index= "ture")
  42. print(df1)

3.2、数据预处理数据信息查看

目的:了解数据的概况,例如整个数据表的大小、所占空间、数据格式、是否有空值和重复项,为后面的清洗和预处理做准备。上面的df1里面已经包含了所有我们所需的数据,接下来就开始具体处理数据了。


   
  1. df1.info() #整体信息
  2. df1.shape #维度
  3. df1.columns() #列名
  4. df1.dtypes #数据类型
  5. df1.isnull #查看空值
  6. df1.vaules #查看数据表值
  7. df1.head( 5) #查看5行数据
  8. df1.tail( 5) #查看后五行数据

3.3、数据的清洗和预处理等步骤

对清洗完的数据进行预处理整理以便后期的统计和分析工作。


   
  1. df1.dropna(how= "any",inplace= True) #空值处理
  2. df1.fillna( 0) #空值处理填充
  3. df1[ "Name"]=df[ "name"].map(str.strip) #空格处理
  4. df1[ "Embarked"].str.lower() #大小写转换
  5. df1[ "years"].astype( 'int') #更改数据类型
  6. df1.rename(columns={ 'years': '码龄'}) #更改列名称

 

3.4、数据提取和筛选

  • 数据提取:使用loc和iloc配合相关函数。

  • 筛选:使用与,或,非三个条件配合大于,小于和等于对数据进行筛选

  • 
         
    1. df.loc[:2, 'years'] #按标签提取数据
    2. df1.iloc[:2,3] #按位置提取
    3. df1[ "years"].isin([ "vip"]) #配合isin函数使用,按条件对数据进行提取
    4. df1.loc[(df1[ 'years']>2)|(df1_inner[ "vip"]==ture)].head() #筛选数据

3.5数据处理 

 

3.6数据存储


   
  1. df1.to_excel( 'tantic.xlsx,sheet_name="a') #存到Excel里面
  2. df1.to_csv( "my_fans.csv") #存到csv

4、分析粉丝数据得到的结论

我的粉丝大多都是属于新用户,并且码零不超过两年,基本应该属于小白那种,但是我们都要有一个从零到一的一个过程,希望关注我可以给你带来一定的帮助。终于等到你了,一起加油,未来属于我们这些努力提升自己的人!!!还是关注我的时候自动回复的那句话:终于等到你了,一起加油,未来属于我们这些努力提升自己的人!!!我不会让你白关注我的,一起加油。

 

 


转载:https://blog.csdn.net/qq_45049500/article/details/117558057
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场