爬虫入门实践-全国普通高等学校名单

一年一度的高考即将上演,教育部阳光高考信息公开平台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('创建数据文件......完成')
    

原创作品,转载请保留署名与简书链接。

    原文作者:代码小工蚁
    原文地址: https://www.jianshu.com/p/5b45fb031f59
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞