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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容