Python网络爬虫(1)--爬取中国大学排名

2018-01-13  本文已影响0人  程慕枫

2017年, 编程界最火的的语言莫过于Python。 Python语言其实并不是像Go, Kotlin语言一样是近些年的创造的, 它其实比Java语言的历史略久, 只不过它或许不符合我们社会主义的国情, 在国内一直不被广泛应用。 就这近两年, 突然之间, 名不见经传的Python语言在国内一夜走红, 无论是专业的Python程序员还是诸如Java, C++等语言的程序员都再次将目光投向Python, 2018年元旦期间, 微信跳一跳小游戏一经发布, 潜伏在深圳高新园的某大牛随即就在github上发布了用Python语言写的外挂程序,这一下各路Python大牛又陆续补充了该外挂的iOS等版本, 玩游戏开外挂不应该提倡,应该予以鄙视... 当然, 用程序玩游戏的确不会带来任何快感, 可是写这个程序的过程是很快乐的呀! 这又从另一面让我们认识了强大的Python---深能进行机器学习,大数据分析, 网络爬虫, 浅也能实现游戏外挂, 抢12306火车票, 给人的感觉就是Python已经无所不能了。Python潮流, 浩浩荡荡, 顺之者昌,逆之者亡, 我当然也要跟着时代潮流呀, 我去年11月开始学习Python了, Python语法比Java, C, C++更加灵活简单, 今天尝试了一下使用Python爬虫的功能。

一.要爬取的是最好大学网的中国大学排名

最好大学网的URL是:
http://www.zuihaodaxue.com/shengyuanzhiliangpaiming2017.html
如图:

Screenshot from 2018-01-13 19-11-11.png
查看源码中我们要爬取的关键信息:
Screenshot from 2018-01-13 19-14-54.png

二.使用requests库获取HTML文本

定义获取HTML文本的函数

def get_html_text(url):
    """
    获取url对应的html文本
    :param url:
    :return: html文本
    """
    try:
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

三.用BeautifulSoup4上面获取的文本进行解析

BeautifulSoup4的文档非常友好, 解析HTML非常简单。
定义解析函数:

def parse_html(html):
    """
    解析html文件
    :param html:
    :return: 大学排名列表,['1', '清华大学', '北京']
    """
    u_list = []
    soup = BeautifulSoup(html, 'html.parser')
    tbody = soup.find('tbody')
    for tr in tbody:
        if isinstance(tr, bs4.element.Tag):
            td_list = list(tr)
            u_list.append([td_list[0].string, td_list[1].string, td_list[2].string])
    return u_list

解析后的形式:
[ ['1', '清华大学', '北京'], ['2', '北京大学', '北京'],
['3', '中国科学院大学', '北京'], ['4', '中国科学技术大学', '安徽'],
['5', '复旦大学', '上海'], ['6', '中国人民大学', '北京'],
['7', '上海交通大学', '上海'], ['8', '浙江大学', '浙江'], ... ]

四.将解析后的内容按照一定格式写到文件中

def save_to_file(univ_list):
    """
    将提取的数据保存到文件
    :param univ_list:
    :return:
    """
    with open('university.txt', 'w') as f:
        for item in univ_list:
            s = '{0:>4} \t {1:<3} \t {2:<4}'.format(str(item[0]), str(item[2]), str(item[1]))
            print(s, file=f)
    f.close()

全部代码:

import requests
from bs4 import BeautifulSoup
import bs4


def get_html_text(url):
    """
    获取url对应的html文本
    :param url:
    :return: html文本
    """
    try:
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""


def parse_html(html):
    """
    解析html文件
    :param html:
    :return: 大学排名列表,['1', '清华大学', '北京']
    """
    u_list = []
    soup = BeautifulSoup(html, 'html.parser')
    tbody = soup.find('tbody')
    for tr in tbody:
        if isinstance(tr, bs4.element.Tag):
            td_list = list(tr)
            u_list.append([td_list[0].string, td_list[1].string, td_list[2].string])
    return u_list


def save_to_file(univ_list):
    """
    将提取的数据保存到文件
    :param univ_list:
    :return:
    """
    with open('university.txt', 'w') as f:
        for item in univ_list:
            s = '{0:>4} \t {1:<3} \t {2:<4}'.format(str(item[0]), str(item[2]), str(item[1]))
            print(s, file=f)
    f.close()


if __name__ == '__main__':
    url = "http://www.zuihaodaxue.com/shengyuanzhiliangpaiming2017.html"
    html_text = get_html_text(url)
    univ_list = parse_html(html_text)
    save_to_file(univ_list)

写入文件后的结果:

   1     北京      清华大学
   2     北京      北京大学
   3     北京      中国科学院大学
   4     安徽      中国科学技术大学
   5     上海      复旦大学
   6     北京      中国人民大学
   7     上海      上海交通大学
   8     浙江      浙江大学
   9     江苏      南京大学
  10     天津      南开大学
  11     上海      同济大学
  12     北京      北京航空航天大学
  13     北京      对外经济贸易大学
  13     上海      上海财经大学
  15     北京      中央财经大学
  16     北京      外交学院
  17     天津      天津大学
  18     湖北      武汉大学
  18     北京      北京师范大学
  20     北京      北京外国语大学
  此处省去980行...

用Python语言进行网络爬虫的操作过程并不复杂, 当然了, 本文所写的只是一次简单的小尝试, 复杂的还待继续探究。

上一篇 下一篇

猜你喜欢

热点阅读