Python爬取历年高考分数线,帮你预测2018年高考分数线

粉丝独白

创新互联长期为近1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为汪清企业提供专业的网站制作、做网站汪清网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。

高考已经结束了,相信绝大部分同学都在放松自己了,毕竟压抑了这么久。现在虽然距离高考放榜还有一段时间,可能有一些同学已经迫不及待地想知道自己考的怎样。因此,现在就来爬取高考网上的近几年高考分数线,看一下近几年分数线的变化趋势,从而心里面有个底,这样才能够更加放松的去嗨皮。

使用的工具库

  • beautifulsoup
  • mongodb
  • echarts

1.总体思路

高考网上,可以查看各省的分数线,其中文理科都有2009-2017年的数据,所以可以直接爬取这些数据下来存到MongoDB中,然后再使用echarts进行绘图展示,从而可以更加直观的看到高考分数线的变化趋势。

2.爬取数据

(1)获取各省的分数线信息

有两种方法可以达到这个目的

1).通过拼接URL链接切换省份,可以得出链接的变化规律:只要替换省份的拼音上去就可以请求到:

http://www.gaokao.com/guangdong/fsx/

http://www.gaokao.com/shanghai/fsx/

推荐使用pypinyin模块——汉字拼音转换模块/工具。直接使用lazy_pinyin方法就可以得到各省的拼音。由于返回的是列表,所以还需要处理一下才能使用。

 
 
 
 
  1. >>> from pypinyin import lazy_pinyin  
  2. >>> lazy_pinyin('北京')  
  3. ['bei', 'jing'] 

2).通过获取地区导航中的各省链接,直接得到URL:

获取各省份的链接:

 
 
 
 
  1. # 获取省份及链接  
  2. pro_link = []  
  3. def get_provice(url):  
  4.    web_data = requests.get(url, headers=header)  
  5.    soup = BeautifulSoup(web_data.content, 'lxml')  
  6.    provice_link = soup.select('.area_box > a')  
  7.    for link in provice_link:  
  8.        href = link['href']  
  9.        provice = link.select('span')[0].text  
  10.        data = {  
  11.            'href': href,  
  12.            'provice': provice  
  13.        }  
  14.        provice_href.insert_one(data)#存入数据库  
  15.        pro_link.append(href) 

(2)爬取分数线

接下来就可以开始爬取分数线了,通过审查元素(如下图),直接使用beautifulsoup来过滤内容。

 
 
 
 
  1. # 获取分数线  
  2. def get_score(url):  
  3.    web_data = requests.get(url, headers=header)  
  4.    soup = BeautifulSoup(web_data.content, 'lxml')  
  5.    # 获取省份信息  
  6.    provice = soup.select('.col-nav span')[0].text[0:-5]  
  7.    # 获取文理科  
  8.    categories = soup.select('h3.ft14')  
  9.    category_list = []  
  10.    for item in categories:  
  11.        category_list.append(item.text.strip().replace(' ', ''))#替换空格  
  12.    # 获取分数  
  13.    tables = soup.select('h3 ~ table')  
  14.    for index, table in enumerate(tables):  
  15.        tr = table.find_all('tr', attrs={'class': re.compile('^c_\S*')})#使用正则匹配  
  16.        for j in tr:  
  17.            td = j.select('td')  
  18.            score_list = []  
  19.            for k in td:  
  20.                # 获取每年的分数  
  21.                if 'class' not in k.attrs:  
  22.                    score = k.text.strip()  
  23.                    score_list.append(score)  
  24.  
  25.                # 获取分数线类别  
  26.                elif 'class' in k.attrs:  
  27.                    score_line = k.text.strip()  
  28.  
  29.                score_data = {  
  30.                    'provice': provice.strip(),#省份  
  31.                    'category': category_list[index],#文理科分类  
  32.                    'score_line': score_line,#分数线类别  
  33.                    'score_list': score_list#分数列表  
  34.                }  
  35.            score_detail.insert_one(score_data)#插入数据库  

3.开始爬取

由于有30多个省份,所以这里使用多线程来爬取,可以提高爬取效率。

 
 
 
 
  1. if __name__ == '__main__':  
  2.  
  3.    header = {  
  4.        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0',  
  5.        'Connection': 'keep - alive'  
  6.        }  
  7.    url = 'http://www.gaokao.com/guangdong/fsx/'  
  8.  
  9.    get_provice(url)  
  10.    pool = Pool()  
  11.    pool.map(get_score, [i for i in pro_link])#使用多线程  

使用多线程爬取的话,不用1分钟就可以爬完所有的数据了。看,多线程可牛逼了,叉会腰先。

4.数据可视化

爬取数据只是***步,接下来就要对数据进行处理展示了。从mongodb 中查找出数据,对数据进行清洗整理,由于我这里的pyecharts有点问题,所以使用echarts进行展示。

1).筛选省份等信息

直接通过mongodb的find函数,限制查找的内容。

 
 
 
 
  1. import pymongo  
  2. import charts  
  3. client = pymongo.MongoClient('localhost', 27017)  
  4. gaokao = client['gaokao']  
  5. score_detail = gaokao['score_detail']  
  6.  
  7. # 筛选分数线、省份、文理科  
  8. def get_score(line,pro,cate):  
  9.    score_list=[]  
  10.    for i in score_detail.find({"$and":[{"score_line":line},{"provice":pro},{'category': cate}]}):  
  11.        score_list = i['score_list']  
  12.        score_list.remove('-')#去掉没有数据的栏目  
  13.        score_list = list(map(int, score_list))  
  14.        score_list.reverse()  
  15.        return score_list 

2).定义相关数据

 
 
 
 
  1. # 获取文理科分数  
  2. line = '一本'  
  3. pro = '北京'  
  4. cate_wen = '文科'  
  5. cate_li = '理科'  
  6. wen=[]  
  7. li = []  
  8. wen=get_score(line,pro,cate_wen)#文科  
  9. li=get_score(line,pro,cate_li)#理科 
  10.  
  11.  
  12. # 定义年份  
  13. year = [2017,2016,2015,2014,2013,2012,2011,2010,2009]  
  14. year.reverse()  

3).折线图展示

 
 
 
 
  1. series = [  
  2.    {  
  3.    'name': '文 科', 
  4.    'data': wen,  
  5.    'type': 'line'  
  6. }, {  
  7.    'name': '理科',  
  8.    'data': li,  
  9.    'type': 'line',  
  10.    'color':'#ff0066'  
  11. }  
  12.         ]  
  13. options = {  
  14.    'chart'   : {'zoomType':'xy'},  
  15.    'title'   : {'text': '{}省{}分数线'.format(pro,line)},  
  16.    'subtitle': {'text': 'Source: gaokao.com'},  
  17.    'xAxis'   : {'categories': year},  
  18.    'yAxis'   : {'title': {'text': 'score'}}  
  19.    }  
  20.  
  21. charts.plot(series, options=options,show='inline')  

这样就可以得到下面的历年分数线趋势图了。当然,可以修改get_score的参数就可以的到其他省份的信息了。

5.预测分数线

通过折线图,可以大概的预测2018年北京高考一本的分数线:文科在550-560分之间;理科在530-540分之间。当然,这只是预测的,如果有特殊情况的话,可能波动会比较大。另外,还可以通过拉格朗日插值法求出今年的分数线,这样比较准确,但是由于过程比较麻烦,所以这里只是目测而已。

当前标题:Python爬取历年高考分数线,帮你预测2018年高考分数线
网站网址:http://www.gawzjz.com/qtweb/news9/180859.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联