中国大学排名定向爬虫
在这之前,我们先了解一下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打开文件,即导出为电子表格。