高考热度大数据爬虫——谁才是院校顶流
本文作者:张孟晗,中南财经政法大学统计与数学学院
本文编辑:刘光中
技术总编:王玉婷
Stata&Python云端课程来啦!
好消息好消息,爬虫俱乐部开辟小鹅通战场!!爬虫俱乐部隆重推出小鹅通网络课程,将Stata基础课程,Stata进阶课程和Python课程都上传至小鹅通平台,欢迎大家多多支持订阅!报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台留言哦。如需了解详情,可以通过课程链(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~
引言
数据爬取
从页面中我们可以发现,院校的热度信息并不会一次性全部加载出来,而是需要我们滑动右侧的滚动条才能够不断的加载出新数据。对于这种情况,selenium能够轻松的实现自动化滚动滚动条,完成这类网页的数据爬取。
参考之前的文章《美团评论爬虫——基于selenium》的做法,我们首先设置好相关的反爬属性,绕开可能存在的检测,并根据url地址访问网页。
from selenium import webdriver
import time
from selenium.webdriver import ChromeOptions
from lxml import etree
import csv
import re
import pandas as pd
import numpy as np
option = ChromeOptions()
#webdriver属性设置为空
option.add_experimental_option("excludeSwitches",["enable-automation"])
option.add_experimental_option("useAutomationExtension", False)
option.add_argument('--disable-blink-features=AutomationControlled')
bro = webdriver.Chrome(executable_path="./chromedriver.exe",options=option)
bro.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
#设置隐式等待时间
bro.implicitly_wait(10)
#最大化窗口
bro.maximize_window()
#进入页面
bro.get("https://motion.baidu.com/activity/gaokao2022/trend?sa=searchpromo_gkdsj_h5_bdtab")
对于需要滑动右侧的滚动条才能够不断加载出新数据这个问题,我们可以用代码来操纵滚动条不断下滑。由于一次只能加载出一部分,所以我们可以设置一个循环使得滚动条不断的滚动,直至加载出全部的数据,这时我们再获取网页的源代码就能够包含所有院校的热度信息。
for i in range(50):
bro.execute_script('scrollTo(0,10000)')
print(i)
time.sleep(1)
#获得页面源代码
html = etree.HTML(bro.page_source)
从页面源代码中我们可以发现,院校名称被放置在放在class属性为title_2fUmJ c-line-clamp1的div标签下,院校热度被放置在class属性为text_1bZ-b的span标签下,而院校地区、特色、批次以及类别信息被放置在class属性为tag_2vGZg的li标签下。随后我们就可以根据这些信息的xpath路径准确的提取出我们想要的信息,并且每天爬取一次存入csv文件之中。
import time
from datetime import datetime, date, timedelta
now_date = time.strftime("%Y-%m-%d", time.localtime())
with open(f'C:/Users/ZMH/Desktop/高考大数据/{now_date}.csv','w',encoding='utf-8') as fp:
writer = csv.DictWriter(fp, fieldnames=['university', 'hot', 'region', 'group', 'classification', 'characteristic'])
for i in range(1, 2784):
dic = {}
university = html.xpath(f"//*[@id='cards845430240']/div/div[6]/div[{i}]//div[@class='title_2fUmJ c-line-clamp1']/text()")[0]
hot = html.xpath(f"//*[@id='cards845430240']/div/div[6]/div[{i}]//span[@class='text_1bZ-b']/text()")[0]
all = html.xpath(f"//*[@id='cards845430240']/div/div[6]/div[{i}]//ul[@class='tags-wrap_2ATqI']/li/text()")
list_all = ['region', 'group', 'classification', 'characteristic']
changdu = len(all)
for j in range(changdu):
dic[list_all[j]] = all[j]
dic['university'] = university
dic['hot'] = hot
writer.writerow(dic)
print(f"第{i}所学校已爬取完成")
我们只需要慢慢等待2784所学校被全部爬取完成即可。
数据分析
首先,我们进行数据读取。由于每天爬取的数据中不带有日期,我们需要加上一列日期以对每天的数据进行区分。同时,热度一列我们仅需要热度的数值而不需要“热度”两个字,我们可以借助re模块进行提取。
import pandas as pd
import re
#读取每日的数据
date = pd.date_range("2022-06-25","2022-07-10",freq="D")
dates = date.map(lambda x:x.strftime("%Y-%m-%d"))
df = pd.DataFrame(columns=["日期","院校名称","热度","地区","批次","类别","特色"])
for i in dates:
df_temp = pd.read_csv("C:/Users/ZMH/Desktop/高考大数据/"+str(i)+".csv",header=None,names=["院校名称","热度","地区","批次","类别","特色"])
infor=df_temp.columns.tolist() #将数据框的列名全部提取出来存放在列表里
infor.insert(0,'日期') # 在列索引为1的位置插入一列
df_temp=df_temp.reindex(columns=infor)
df_temp["日期"] = [i for s in range(2783)]
df = pd.concat([df,df_temp],axis=0)
df["热度"] = df["热度"].apply(lambda x:re.findall("(.*?)热度",x)[0])
df["热度"] = df["热度"].apply(pd.to_numeric)
df
从结果中我们可以看到,数据已经成功以我们期望的方式读入了。
首先,我们先分析出6月25号到7月10号之间平均热度最高的10所高校。从结果中我们可以看到,西南大学以绝对的热度优势问鼎热度榜,随后还有厦门大学、中山大学等老牌网红院校,看来这些学校的热度依旧不减,深受广大学子喜爱。
df.groupby(by=["院校名称"])[["热度"]].mean().sort_values(by="热度",ascending=False)[0:10]
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["STsong"]
plt.figure(figsize=(20,10))
plt.ylim(0,200000)
plt.plot(df[df["院校名称"]=="西南大学"]["日期"],df[df["院校名称"]=="西南大学"]["热度"],label="西南大学",marker="o")
plt.plot(df[df["院校名称"]=="中南财经政法大学"]["日期"],df[df["院校名称"]=="中南财经政法大学"]["热度"],label="中南财经政法大学",marker="o")
plt.plot(df[df["院校名称"]=="河南大学"]["日期"],df[df["院校名称"]=="河南大学"]["热度"],label="河南大学",marker="o")
plt.xticks(df[df["院校名称"]=="西南大学"]["日期"],rotation=45)
plt.title("热度变化趋势图")
plt.legend(loc=0)
plt.xlabel("日期")
plt.ylabel("热度")
plt.show()
天高任鸟飞,海阔凭鱼跃,高考并不是人生的终点,而是一个新的起点。愿莘莘学子在今后的人生路志之所向、一往无前。
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
跨框架数据操作
河南大学经济学院2022年Stata数据处理与爬虫技术开班仪式顺利召开爬虫俱乐部的精彩答疑——local function
爬虫俱乐部精彩答疑——Python中的三种文件读取方法爬虫俱乐部的精彩答疑--认真仔细方能写出好程序爬虫俱乐部Python精彩答疑——更换Jupyter Notebook浏览器及dropna()参数详解
爬虫俱乐部的精彩答疑--如何打开Excel中扩展名与文件源码不符的文件
解锁《梦华录》之东京繁华生活
爬虫俱乐部的精彩答疑——DOS命令
爬虫俱乐部的精彩答疑之换行问题
爬虫俱乐部的精彩答疑--路径设置乱码怎么破?
爬虫俱乐部的精彩答疑--putdocx的二三事
爬虫俱乐部精彩答疑之Python篇
爬虫俱乐部的精彩答疑--花式重命名变量
今天你还是“刘畊宏女孩”吗?爬虫俱乐部在山东财经大学金融学院暑期Stata网课上的精彩答疑
Stata绘图系列——玩转绘图通用选项(一)
出人意料!这所大学的A级学科总数竟超越清华北大!
Stata数据读入——打开方式不同?
关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。