BS4_中国大学排名定向爬虫

中国大学排名定向爬虫

在这之前,我们先了解一下csv格式的存储方式。

csv (逗号分隔值文件格式): 有时也称为字符分隔值,因为分隔字符也可以不是逗号,其文件以纯文本形式存储表格数据(数字和文本)。

csv 是一种通用的电子表格和数据库导入导出格式,存储为csv格式的文件可以直接用Excel表格打开,导出为电子表格的形式。

存储方式:

import csv

# 写入csv文件
with open('doc/example.csv', 'w') as f:
    writer = csv.writer(f)
    # 将列表的每条数据依次写入csv文件, 并以逗号分隔
    # writer.writerows(可迭代类型)
    writer.writerows([['1', '2', '3'], ['4', '5', '6']])

# 读取csv文件
with open('doc/example.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

将数据写入 example.csv 文件:
在这里插入图片描述
从文件中读取:
在这里插入图片描述
爬取近几年的中国大学排名信息
爬取中国大学排名信息,包括:学校排名,学校名称,省市,总分
源代码:

import csv
import bs4
import requests
from bs4 import BeautifulSoup


def get_content(url):
    """获取页面内容"""
    try:
        user_agent = 'Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0'
        response = requests.get(url, headers={'User-Agent': user_agent})
        response.raise_for_status()  # 如果返回的状态码不是200,则抛出异常
        response.encoding = response.apparent_encoding  # 根据响应信息判断网页的编码格式,便于response.text知道如何解码
    except Exception as e:
        print('爬取错误')
    else:
        print('爬取成功')
        return response.text


def getUnivList(html):
    """解析页面内容,需要获取:排名,学校名称,省市,总分"""
    # 实例化soup对象
    soup = BeautifulSoup(html, 'lxml')
    uList = []
    # 该页面只有一个表格,也只有一个tbody标签 ----> find
    # 获取tbody里面所有的子标签,返回的是生成器:soup.find('tbody').children
    # 获取tbody里面所有的子标签,返回的是列表:soup.find('tbody').contents
    for tr in soup.find('tbody').children:
        # 有些tr可能没有内容,获取的tr标签不存在
        # isinstance(tr, bs4.element.Tag) ----> 判断tr是否为标签对象
        if isinstance(tr, bs4.element.Tag):
            # 返回tr里面的所有td标签
            tds = tr('td')
            # 将每个学校信息以元组的方式存储到列表变量uList中
            uList.append((tds[0].string, tds[1].string, tds[2].string, tds[3].string))
    return uList


def printUnivList(uList):
    """打印学校信息"""
    # format的使用:{0}:变量的位置;冒号后面执行属性信息:^10 --> 占10个字节位置,并且居中
    print('{0:^10} {1:^10} {2:^10} {3:^10}'.format('排名','学校名称','省市','总分'))
    for item in uList:
        print('{0:^10} {1:^10} {2:^10} {3:^10}'.format(item[0],item[1],item[2],item[3]))


def saveUnivData(uList,year):
    """保存学校信息"""
    with open('doc/ranking-%s.csv' %(year),'w') as f:
        writer = csv.writer(f)
        # 将列表的每条数据依次写入csv文件,并以逗号分隔
        writer.writerows(uList)
        print('写入完成......')

if __name__ == '__main__':
    start_year = int(input('开始爬取年份:'))
    end_year = int(input('结束爬取年份:'))
    for year in range(start_year,end_year+1):
        url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming%s.html' %(year)
        content = get_content(url)
        uList = getUnivList(content)
        saveUnivData(uList,year)
        printUnivList('%s年信息爬取完成......' %(year))

运行结果:
在这里插入图片描述
爬取结果(2016年爬取结果为例):

在这里插入图片描述
根据文件存储路径找到文件所在位置,右击文件----> open with ----> other Application ----> 选择Execl打开文件,即导出为电子表格。

猜你喜欢

转载自blog.csdn.net/King15229085063/article/details/87782043