Python中如何获取高考志愿信息

  

这篇文章给大家分享的是有关Python中如何获取高考志愿信息的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

准备工作

首先明确一下任务。首先我们要从网址表格中读取到一大串网址,然后访问每个网址,获取到页面上的学校信息,然后将它们在写到另一个Excel中。显然,我们需要一个爬虫库和一个Excel库来帮助我们完成任务。

第一步自然是安装它们,requests-html是一个非常好用的HTML解析库,拿来做简单的爬虫非常优雅;而openpyxl是一个Excel表格库,可以轻松创建和处理Excel数据。

pip install requests-html openpyxl

然后就是网址表格,大概长这样,总共大概一千七百多条数据。其中有少量网址是错误的,访问会得到404错误,所以在编写代码的时候还要注意错误处理。

Python中如何获取高考志愿信息

任务分析

任务的核心自然就是分析和获取网页内容了。首先现在浏览器里面打开一个网址,看看网页上的内容是什么。

Python中如何获取高考志愿信息

可以看到这个网页格式很乱,学校名字什么的都是混在一起的,一点也不规整,这给我们提取数据造成了不少的麻烦。不过仔细分析之后,其实问题也并不难。

首先要提取的是学校名字,可以看到学校名字和其他文字混在一起,例如"本科一批普通文科627集美大学报考情况"。本来我准备用正则表达式提取,然后发现用正则表达式好像很难。之后我多访问了几个网页,发现学校代码基本上都是数字,如果有字母的话也出现到第一位,所以我采用了以下的算法,首先将字符串从数字处分隔,右边的一个部分就包含了学校名字和“报考情况”几个字,然后删除“报考情况”即可得到学校名字。这个算法唯一的缺点就是,假如出现了字母在中间的代号,就没办法获取到学校名字了,不过实际运行之后,我幸运的发现并没有出现这种情况。

之后要提取的就是专业信息了,在网页源代码中这部分使用tr和td标签来呈现的。一开始我用的是tr加上选择器来提取,但是这个网页生成的时候很有问题,每个tr标签的样式居然还根据内容的多少而不同,导致我写死的选择器没法完美获取所有行。不过后来我发现整个网页内容都是一个表格, 除去表头和结尾的几个固定行之外,剩下的恰好就是要提取的数据行,所以直接获取tr标签,然后切片除去收尾即可。

Python中如何获取高考志愿信息

网页基本上分析完了,下面就是编写代码了。

编写代码

总共50行左右代码,我添加了注释,相信大家应该很容易就可以看懂。

第一部分代码是从网址表格读取所有url,一开始编写的时候,表格里的url是从另一个公式生成的,所以需要在加载的时候添加data_only=True才能读取到公式的结果,否则只能读取到公式本身。

第二部分是创建输出文件,然后编写表头。顺带为了调试方便,我让它如果检测到已经存在目标文件的话就删掉,在建立一个新的。

第三部分就是代码的核心了。Python代码看着可能有点奇怪,不过对照上面的分析,我想大家应该很容易看懂。需要注意保存文件在最后,假如半路代码出现异常,整个就白干了,而一千七百多条网址不可能保证都正常运行。由于输出格式是“学校名+专业信息”这样的格式,所以我获取学校名之后,还要将学校插入到每行专业信息之前。所以我这里索性直接用try-except包起来,如果出错的话只打印一下出错的网址。

import os 
  得到requests_html  import  HTMLSession 
  得到openpyxl  import 工作簿,load_workbook 
  #,从网址表格获取urls 
  def  get_urls ():=,input_file  & # 39; source.xlsx& # 39;,=,,wb  load_workbook (input_file, data_only=True),=,,ws  wb.active =,urls [行[0],for  row 拷贝ws.values),
  ,wb.close (),
  ,return  urls 
  #,输出Excel文件,如果已存在则删除已有的,
  时间=out_file  & # 39; data.xlsx& # 39;,
  if  os.path.exists (out_file):,
  ,os.remove (out_file),
  时间=wb 工作簿(),
  时间=ws  wb.active 
  #,编写第一行表头,
  ws (& # 39; a1 # 39;],=, & # 39;学校& # 39;,
  ws (& # 39; b1 # 39;],=, & # 39;专业代号& # 39;,
  ws (& # 39; c1 # 39;],=, & # 39;专业名称& # 39;,
  ws (& # 39; d1 # 39;],=, & # 39;计划数& # 39;,
  ws (& # 39; e1 # 39;],=, & # 39;预计1:1录取最低分(投档分)& # 39;,
  ws (& # 39; f1 # 39;],=, & # 39;按院校投档比例投档线上已报人数& # 39;,
  ws (& # 39; g1 # 39;],=, & # 39;学费& # 39;,
  ws (& # 39; h2 # 39;],=, & # 39;办学地点& # 39;,
  ws (& # 39; i1 # 39;],=, & # 39;专业备注& # 39;,
  #,发起网络请求,解析网页信息,并写入文件,
  时间=session  HTMLSession (),
  时间=urls  get_urls (),
  for  url  url:拷贝,
  ,import  re =,,page  session.get (url),=,page.html.encoding  & # 39; gb2312 # 39;,
  试题:大敌;=,,college_info  page.html.xpath (& # 39;//td (@class=皉eport1_1_1")/text() & # 39;,,第一个=True),=,,college  re.split (& # 39; \ d + & # 39;,, college_info) [1] .replace(& # 39;报考情况& # 39;,,& # 39;& # 39;),=,,rows  page.html.xpath (& # 39;//tr # 39;) [3: 2],
  ,for  r 拷贝行:,=,info  [x.text  for  x 拷贝r.xpath (& # 39;//td # 39;)),
  ,info.insert(0,,学院),
  ,ws.append(信息),
  ,打印(信息)
  ,除了:
  打印(url)大敌;
  ,
  #,保存文件,
  wb.save (out_file) 

Python中如何获取高考志愿信息