美文网首页Python网络爬虫入门实践Python及网络爬虫
爬虫入门实践-全国普通高等学校名单

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

作者: 代码小工蚁 | 来源:发表于2018-05-20 23:26 被阅读4次

    一年一度的高考即将上演,教育部阳光高考信息公开平台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.haomeiwen.com/subject/idrxjftx.html