爬取娱乐圈排行榜数据
想关注你的爱豆最近在娱乐圈发展的怎么样吗?本文和你一起爬取娱乐圈的排行榜数据,来看看你的爱豆现在排名变化情况,有几次登顶,几次进了前十名呀。
PS:在下一篇文章中分析排行榜的动态变化趋势,并绘制成动态条形图和折线图。
一、网站原始信息
我们先来看下原始的网站页面
如果我们想一个一个复制这些数据,再进行分析,估计要花一天的时间,才可以把明星的各期排行数据处理好。估计会处理到崩溃,还有可能会因为人为原因出错。
而用爬虫,半个小时不到就可以处理好这些数据。接下来看看怎么把这些数据用Python爬下来吧。
二、先来看下爬取后数据的部分截图
1 男明星人气榜数据
2 女明星人气榜数据
三、如何获取123粉丝网的爬虫信息
以下是获取代码用到信息的具体步骤:
- step1:浏览器(一般用火狐和Google我用的360)中打开123粉丝网
- step2:按键盘F12 -> ctrl+r
- step3: 点击results.php -> 到Headers中找到代码所需的参数
四、分步爬虫代码解析
1 用Python中的Requests库获取网页信息
#爬取当前页信息,并用BeautifulSoup解析成标准格式
import requests #导入requests模块
import bs4
url = "https://123fans.cn/lastresults.php?c=1"
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Request Method':'Get'}
req = requests.get(url, timeout=30, headers=headers)
soup = bs4.BeautifulSoup(req.text, "html.parser")
代码解析:
url = :待爬取网页的url链接,相当于指定爬取评论的路径,本文对应填入上文step3中标注的Requests URL值。
headers = :待爬取网页的首部信息,把上文step3中标注的Headers中关键词后面的内容对应填入即可。
req =:用get方法获取待爬网页的所有信息。
soup:用BeautifulSoup把爬取内容解析成标准格式,方便数据处理。
注1:有些网站访问时必须带有浏览器等信息,如果不传入headers就会报错,所以本例中加入了头部的一些信息。我试了一下该链接不加首部信息也可以正常运行,和加了首部信息得到的结果完全一致。
注2:如果对Requests库不了解,可以参见本公众号中文章【Python】【爬虫】Requests库详解
2 把爬取到的数据整合到一个数据框中
#把爬取的数据整合到数据框中
import re #正则表达式库
import numpy as np
import pandas as pd
period_data = pd.DataFrame(np.zeros((400,5))) #构造400行5列的全0矩阵备用
period_data.columns = ['name', 'popularity_value', 'period_num', 'end_time','rank'] #给0矩阵列命名
#把当期的数据填入表格中
#姓名信息
i = 0
name = soup.findAll("td", {"class":"name"})
for each in name:
period_data['name'][i]=each.a.text #依次加入姓名
i += 1
#人气信息
j = 0
popularity = soup.findAll("td", {"class":"ballot"})
for each in popularity:
period_data['popularity_value'][j]=float(each.text.replace(",",'')) #依次加入人气值
j += 1
#期数信息
period_num = int(re.findall('[0-9]+', str(soup.h2.text))[0])
period_data['period_num'] = period_num
#截止日期
end_time_0 = str(re.findall('结束日期.+[0-9]+', str(soup.findAll("div", {"class":"results"})))).split('.')
end_time = ''
for str_1 in end_time_0:
end_time = end_time + re.findall('[0-9]+',str_1)[0]
period_data['end_time'] = end_time
#有序数,方便截取前多少位
period_data_1 = period_data.sort_values(by='popularity_value',ascending=False)
period_data_1['rank'] = range(period_data_1.shape[0])
代码解析:
period_data:构造400行5列的矩阵用来存放每一期排行数据(前几期排行榜存放了前341位明星的人气值,我怕往期的会多一点数据,所以取了400行)。
period_data.columns:给数据加一个列名。
name:用findAll函数取出所有的名字信息。
for each in name:用循环把名字信息存放到period_data中。
popularity:用findAll函数取出所有的人气值信息。
for each in popularity:用循环把人气信息存放到period_data中。
period_num:获取期数信息。
end_time:获取截止日期。
period_data_1['rank']:在最后一列加入有序数,方便数据截取使用。
接下来展示批量爬虫代码
五、批量爬虫代码解析
1 定义爬虫函数
import requests #导入requests模块
import bs4
import re #正则表达式库
import numpy as np
import pandas as pd
import warnings
import time
import random
warnings.filterwarnings('ignore') #忽视ignore
#headers的内容在Headers里面都可以找到
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Request Method':'Get'}
def crawler(url):
req = requests.get(url, timeout=30, headers=headers) # 获取网页信息
soup = bs4.BeautifulSoup(req.text, "html.parser") #用soup库解析
period_data = pd.DataFrame(np.zeros((400,5))) #构造400行5列的全0矩阵备用
period_data.columns = ['name', 'popularity_value', 'period_num', 'end_time','rank'] #给0矩阵列命名
#把当期的数据填入表格中
#姓名信息
i = 0
name = soup.findAll("td", {"class":"name"})
for each in name:
period_data['name'][i]=each.a.text #依次加入姓名
i += 1
#人气信息
j = 0
popularity = soup.findAll("td", {"class":"ballot"})
for each in popularity:
period_data['popularity_value'][j]=float(each.text.replace(",",'')) #依次加入人气值
j += 1
#期数信息
period_num = int(re.findall('[0-9]+', str(soup.h2.text))[0])
period_data['period_num'] = period_num
#截止日期
end_time_0 = str(re.findall('结束日期.+[0-9]+', str(soup.findAll("div", {"class":"results"})))).split('.')
end_time = ''
for str_1 in end_time_0:
end_time = end_time + re.findall('[0-9]+',str_1)[0]
period_data['end_time'] = end_time
#有序数,方便截取前多少位
period_data_1 = period_data.sort_values(by='popularity_value',ascending=False)
period_data_1['rank'] = range(period_data_1.shape[0])
return period_data_1
本段代码是把分段爬虫代码整合到一个函数中,方便反复调用。
2 反复调用函数实现批量爬虫
period_data_final = pd.DataFrame(np.zeros((1,5))) #构造400行5列的全0矩阵备用
period_data_final.columns = ['name', 'popularity_value', 'period_num', 'end_time','rank'] #给0矩阵列命名
for qi in range(538,499,-1):
print("目前爬到了第",qi,'期')
if qi == 538:
url="https://123fans.cn/lastresults.php?c=1"
else:
url="https://123fans.cn/results.php?qi={}&c=1".format(qi)
time.sleep(random.uniform(1, 2))
date = crawler(url)
period_data_final = period_data_final.append(date)
period_data_final_1 = period_data_fina.loc[1:,:] #去掉第一行无用数据
本段代码是反复调用爬虫函数获取页面数据,并用append整合到一个数据框中。
注1:print是为了展示爬取到第几期了。
注2:url中用了.format是为了控制跳转页面。
注3:time.sleep中用了随机数,是人为休眠一段不定长时间为了防止反爬虫。
本文是本人使用Python库进行爬虫的非商业行为,如有问题,请指正。
- 基于Docker的PHP开发环境
- 以太坊·物流场景初探
- Python接口自动化-3-POST请求
- 【Python环境】Python中的结构化数据分析利器-Pandas简介
- JAVA中使用Jedis操作Redis
- Tomcat搭建文件服务器
- Windows下SLmail邮件服务器缓冲区溢出理解及实验
- java使用mina和websocket通信
- 【机器学习】10 种机器学习算法的要点
- 写一个BASIC认证的https协议
- java发送邮件功能,以发送qq邮件为例
- spring boot加载复杂的yml文件获取不到值的问题
- JUC包下的CountDownLatch,CyclicBarrier,Semaphore
- java队列,ArrayBlockingQueue
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Angular路由跳转时,如何传递信息
- Angular里的购物车页面实现
- CentOS7部署WeADMIN监控主机交换机和URL(无坑版)
- JsonPath实践(一)
- 开源测试服务
- Charles报错Failed to install helper解决方案
- [890]scrapy之pipeline的使用
- Redis的slot迁移工具
- 一文搞懂Flink rocksdb中的数据恢复
- Linux expect用法介绍
- GitHub通过access token来clone代码
- 在.NET Core中使用MongoDB明细教程(1):驱动基础及文档插入
- 探索闭包
- openresty实现接口签名安全认证
- JavaScript空值合并运算符