python爬取粉丝网明星数据看爱豆排名变化

爬取123粉丝网明星数据榜单,看看你的爱豆现在排名变化情况...

前言

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

一、网站原始信息

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

爬取123粉丝网明星数据榜单,看看你的爱豆现在排名变化情况...

如果我们想一个一个复制这些数据,再进行分析,估计要花一天的时间,才可以把明星的各期排行数据处理好。估计会处理到崩溃,还有可能会因为人为原因出错。

而用爬虫,半个小时不到就可以处理好这些数据。接下来看看怎么把这些数据用Python爬下来吧。

爬取123粉丝网明星数据榜单,看看你的爱豆现在排名变化情况...

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

1 男明星人气榜数据

爬取123粉丝网明星数据榜单,看看你的爱豆现在排名变化情况...

2 女明星人气榜数据

爬取123粉丝网明星数据榜单,看看你的爱豆现在排名变化情况...

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

以下是获取代码用到信息的具体步骤:

  • step1:浏览器(一般用火狐和Google我用的360)中打开123粉丝网
  • step2:按键盘F12 -> ctrl+r
  • step3: 点击results.php -> 到Headers中找到代码所需的参数

爬取123粉丝网明星数据榜单,看看你的爱豆现在排名变化情况...

四、分步爬虫代码解析

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 定义爬虫函数

python">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整合到一个数据框中。

以上是 python爬取粉丝网明星数据看爱豆排名变化 的全部内容, 来源链接: utcz.com/a/124273.html

回到顶部