爬取娱乐圈排行榜数据

想关注你的爱豆最近在娱乐圈发展的怎么样吗?本文和你一块儿爬取娱乐圈的排行榜数据,来看看你的爱豆如今排名变化状况,有几回登顶,几回进了前十名呀。

PS:在下一篇文章中分析排行榜的动态变化趋势,并绘制成动态条形图和折线图。php


1、网站原始信息html

咱们先来看下原始的网站页面python

若是咱们想一个一个复制这些数据,再进行分析,估计要花一天的时间,才能够把明星的各期排行数据处理好。估计会处理到崩溃,还有可能会由于人为缘由出错。
而用爬虫,半个小时不到就能够处理好这些数据。接下来看看怎么把这些数据用Python爬下来吧。


2、先来看下爬取后数据的部分截图

 1    男明星人气榜数据

 2   女明星人气榜数据


3、如何获取123粉丝网的爬虫信息web

如下是获取代码用到信息的具体步骤:
  • step1:浏览器(通常用火狐和Google我用的360)中打开123粉丝网正则表达式

  • step2:按键盘F12 -> ctrl+r浏览器

  • step3: 点击results.php -> 到Headers中找到代码所需的参数


4、分步爬虫代码解析

 1  用Python中的Requests库获取网页信息bash

#爬取当前页信息,并用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 = 0popularity = 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中。

popularityfindAll函数取出全部的人气值信息。app

for each in popularity用循环把人气信息存放到period_data中。
period_num:获取期数信息。
end_time:获取截止日期。

period_data_1['rank']:在最后一列加入有序数,方便数据截取使用。dom


接下来展现批量爬虫代码


5、批量爬虫代码解析

 1  定义爬虫函数

import requests #导入requests模块import bs4import re #正则表达式库import numpy as np import pandas as pdimport warningsimport timeimport 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 是为了展现爬取到第几期了。
注2url 中用 .format是为了控制跳转页面。

注3:time.sleep中用了随机数,是人为休眠一段不定长时间为了防止反爬虫。


本文是本人使用Python库进行爬虫的非商业行为,若有问题,请指正。若是想获取文中全部可直接执行的代码和数据,可在公众号中回复"爬取娱乐圈排行榜数据",便可免费获取。如对代码有疑问,能够到公众号中私信我。


你可能感兴趣:

表白-白衣天使

用python绘制皮卡丘

意大利疫情VS韩国疫情

风控建模中的IV和WOE

杨紫做品集动态二维码

新手如何快速入门Python

【Python】【爬虫】Requests库详解



长按识别上方二维码学习更多Python知识


喜欢这篇文章

就请点个 “ 在看”

                                  


本文分享自微信公众号 - 阿黎逸阳的代码(gh_f3910c467dfe)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索