一年一度的高考即将上演,教育部阳光高考信息公开平台http://gaokao.chsi.com.cn/xxgk/
陆续公布今年高考相关信息。
这里演示用python爬虫程序将全国普通高等学校名单 抓取下来,并保存成.xlsx格式,方便家长使用(可以筛选数据)。
程序中使用了:requests、BeautifulSoup、xlsxwriter库。运行程序前需要先安装好。
pip3 install requests
pip3 install beautifulsoup4
pip3 install xlsxwriter
源代码如下:
# coding=utf-8
# 网络爬虫:读取2017年全国普通高等学校名单(2631所)并存成.xlsx文件
# 地址:
# http://gaokao.chsi.com.cn/gkxx/zszcgd/dnzszc/201706/20170615/1611254988-2.html
# 作者:代码小工蚁
# 时间:2018.05.20
import time
import re
import requests
from bs4 import BeautifulSoup
import xlsxwriter
def save_xlsx(book_name, sheet_name, lines_in, item_sep='~!~', item_num=2):
"""保存成excel xlsx文件格式"""
# book_name 文件名
# sheet_name 工作表名
# lines_in 输入的字符串
# item_sep 字符串项目分隔符
# item_num 一行分割的项目数
workbook = xlsxwriter.Workbook(book_name)
worksheet = workbook.add_worksheet(sheet_name)
line_data = lines_in.split('\n')
row = 0
col = 0
for line in line_data:
if line:
item = line.split(item_sep)
if len(item) == item_num:
for i in range(item_num):
worksheet.write(row, col+i, item[i])
row += 1
workbook.close()
def get_data(html, item_sepor='~!~'):
"""解析响应文本,获得大学数据"""
# html 待处理html
# item_sepor = '~!~' 项目分隔符
resp = BeautifulSoup(html, 'html.parser')
# 获取所有的tr
u_data_trs = resp.select('tbody > tr')
# 正常数据:一个tr有7项内容,如只有1项,则应略过
"""
<tr height="29">
<td bgcolor="#FFFFFF" height="29">序号</td>
<td bgcolor="#FFFFFF">学校名称</td>
<td bgcolor="#FFFFFF">学校标识码</td>
<td bgcolor="#FFFFFF">主管部门</td>
<td bgcolor="#FFFFFF">所在地</td>
<td bgcolor="#FFFFFF">办学层次</td>
<td bgcolor="#FFFFFF">备注</td>
</tr>
<tr height="29">
<td bgcolor="#FFFFFF" colspan="7" height="29">北京市(92所)</td>
</tr>"""
# print(u_data_tr[:3])
# item_sepor = '~!~'
out_line = ''
for u_data_tr in u_data_trs:
# 获取所有的td
u_data_tds = u_data_tr.find_all('td')
# 只有1项的数据,略过处理
if len(u_data_tds) == 7:
td_lines = []
for u_data_td in u_data_tds:
# 内容中包含html标志,如<br/>,则u_data_td.string返回None
if u_data_td.string:
td_lines.append(u_data_td.string)
else:
# 特别处理<br/>\r\n\t
pattern = r'<td bgcolor=.*?>(.*?)</td>'
item_temp = re.findall(pattern, str(u_data_td), re.M|re.S)[0]
item = item_temp.replace('<br/>\r\n\t', '')
td_lines.append(item)
td_line = item_sepor.join(td_lines)
else:
continue
# print(td_line)
out_line += td_line + '\n'
return out_line
def get_html_text(url):
"""返回响应文本"""
try:
html = requests.get(url, timeout=30)
html.raise_for_status()
html.encoding = 'utf-8' # html.apparent_encoding
return html.text
except Exception as err:
print(err)
return ""
def html_urls():
"""生成网页链接地址"""
# 返回:列表
# http://gaokao.chsi.com.cn/gkxx/zszcgd/dnzszc/201706/20170615/1611254988-2.html
urls = []
base_url = 'http://gaokao.chsi.com.cn/gkxx/zszcgd/dnzszc/201706/20170615/1611254988-'
start_page = 2
end_page = 32
for page_no in range(start_page, end_page+1):
url = base_url + str(page_no) + '.html'
urls.append(url)
return urls
if __name__ == '__main__':
university_urls = html_urls()
university_info = []
item_sepor = '~!~'
for url in university_urls:
# print('正在处理: {}'.format(url.split('/')[-1]))
print('正在处理: {}'.format(url))
ret_html = get_html_text(url)
time.sleep(0.5)
if ret_html:
university_info.append(get_data(ret_html, item_sepor))
# print(''.join(university_info))
save_xlsx(u'全国普通高校名单.xlsx', u'高校名单', ''.join(university_info), item_sepor, 7)
print('创建数据文件......完成')
原创作品,转载请保留署名与简书链接。
网友评论