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

一年一度的高考即将上演,教育部阳光高考信息公开平台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项,则应略过
    """
        
        序号
        学校名称
        学校标识码
        主管部门
        所在地
        办学层次
        备注
        
        
        北京市(92所)
        """
    # 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标志,如
,则u_data_td.string返回None if u_data_td.string: td_lines.append(u_data_td.string) else: # 特别处理
\r\n\t pattern = r'(.*?)' item_temp = re.findall(pattern, str(u_data_td), re.M|re.S)[0] item = item_temp.replace('
\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('创建数据文件......完成')

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

你可能感兴趣的:(爬虫入门实践-全国普通高等学校名单)