当前位置: 首页 > 科技观察

Python爬取历年高考成绩,帮你预测2018年高考成绩

时间:2023-03-12 05:14:16 科技观察

粉丝独白高考结束了,相信大部分同学都在放松自己,毕竟被压抑了很久这么久。虽然距离高考成绩的出炉还有一段时间,但可能有些同学已经迫不及待想知道自己的高考成绩如何了。所以,我们就在高考网站上爬取近几年的高考分数线,看看近几年分数线的变化趋势,心中有个底,让我们更加放松。使用的工具库是beautifulsoupmongodbecharts1。大致思路是在高考网站上,可以查看各省的分数线,其中文理科有2009年到2017年的数据,所以可以直接爬取这些数据保存在MongoDB中,然后使用echarts绘图展示,让你更直观的看到高考分数的变化趋势。2.爬取数据(1)获取各省分数线信息的途径有两种,达到这个目的1)。通过拼接URL链接切换省份,可以得到链接的变化规律:只需更换省份的拼音即可请求:http://www.gaokao.com/guangdong/fsx/http://www.gaokao.com/shanghai/fsx/推荐使用pypinyin模块——汉字拼音转换模块/工具。可以直接使用lazy_pinyin方法获取各省的拼音。由于返回的是一个列表,所以需要处理一下才能使用。>>>frompypinyinimportlazy_pinyin>>>lazy_pinyin('北京')['bei','jing']2).在区域导航中获取各省链接直接获取URL:获取各省链接:#获取各省链接pro_link=[]defget_provice(url):web_data=requests.get(url,headers=header)soup=BeautifulSoup(web_data.content,'lxml')provice_link=soup.select('.area_box>a')forlinkinprovice_link:href=link['href']provice=link.select('span')[0].textdata={'href':href,'provice':provice}provice_href.insert_one(data)#storedindatabasepro_link.append(href)(2)爬取分数线接下来就可以开始爬取分数线了。通过查看元素(如下图),可以直接使用beautifulsoup过滤内容。#获取分数线defget_score(url):web_data=requests.get(url,headers=header)soup=BeautifulSoup(web_data.content,'lxml')#获取省份信息provice=soup.select('.col-navspan')[0].text[0:-5]#GetArtsandSciencecategories=soup.select('h3.ft14')category_list=[]foritemincategories:category_list.append(item.text.strip().replace('',''))#替换空格#获取分数tables=soup.select('h3~table')forindex,tableinenumerate(tables):tr=table.find_all('tr',attrs={'class':re.compile('^c_\S*')})#使用正则匹配forjintr:td=j.select('td')score_list=[]forkintd:#获取每一年的分数if'class'notink.attrs:score=k。文本。strip()score_list.append(score)#获取分数线类别elif'class'ink.attrs:score_line=k.text.strip()score_data={'provice':provice.strip(),#province'category':category_list[index],#ArtsandScienceClassification'score_line':score_line,#ScoreLineCategory'score_list':score_list#ScoreList}score_detail.insert_one(score_data)#插入数据库3.开始爬取因为有30多个省,这里使用多线程爬取,可以提高爬取效率。if__name__=='__main__':header={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64;rv:58.0)Gecko/20100101Firefox/58.0','Connection':'keep-alive'}url='http://www.gaokao.com/guangdong/fsx/'get_provice(url)pool=Pool()pool.map(get_score,[iforiinpro_link])#使用多线程如果你使用多线程爬取,你不需要1分钟就可以爬取所有的数据。看,多线程牛逼,fork会是第一个。4.数据可视化抓取数据只是第一步,下一步就是对数据进行处理和展示。从mongodb中找数据,清洗整理数据,因为我这里用的pyecharts有些问题,所以用echarts做展示。1).直接通过mongodb的find功能筛选省份等信息,限制搜索内容。importpymongoimportchartsclient=pymongo.MongoClient('localhost',27017)gaokao=client['gaokao']score_detail=gaokao['score_detail']#过滤分数线,省,文理defget_score(line,pro,cate):score_list=[]foriinscore_detail.find({"$and":[{"score_line":line},{"provice":pro},{'category':cate}]}):score_list=i['score_list']score_list.remove('-')#去掉没有数据的列score_list=list(map(int,score_list))score_list.reverse()returnsscore_list2).定义相关数据#获取文理成绩line='一本'pro='北京'cate_wen='文科'cate_li='理科'wen=[]li=[]wen=get_score(line,pro,cate_wen)#文科li=get_score(line,pro,cate_li)#科学#定义年份year=[2017,2016,2015,2014,2013,2012,2011,2010,2009]year.reverse()3).折线图展示series=[{'name':'Art','data':wen,'type':'line'},{'name':'science','data':li,'type':'line','color':'#ff0066'}]options={'chart':{'zoomType':'xy'},'title':{'text':'{}Province{}ScoreLine'.format(pro,line)},'subtitle':{'text':'Source:gaokao.com'},'xAxis':{'categories':year},'yAxis':{'title':{'text':'分数'}}}charts.plot(系列,选项=options,show='inline')这样就可以得到如下历年分数线的走势图。当然你可以修改get_score的参数来获取其他省份的信息。5.预测分数线通过折线图可以大致预测2018年北京高考分数线:文科550-560分;科学530-540分。当然,这只是预测,如果有特殊情况,波动可能会比较大。另外,今年的分数线也可以用拉格朗日插值法计算,比较准确,但由于过程繁琐,这里只是目测。