【Educoder作业】※网页抓取及信息提取
简易小爬虫?
偷偷告诉各位,前面题的答案都在后一道题里,所以其实我们只需要做第四题
T1 数据获取—分数线目录页
需要注意的是, w e b p a g e . r e a d ( ) webpage.read() webpage.read()出来并不是字符串,而是一个类文件,所以用 d e c o d e decode decode将它转换类型,转成 u t f − 8 utf-8 utf−8就变成字符串了,我们就可以操作了。
# -*- coding: utf-8 -*-
import urllib.request as req
import os
import hashlib
# 国防科技大学本科招生信息网中录取分数目录页URL:
url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/index.html'
def step1():
# 请按下面的注释提示添加代码,完成相应功能
#********** Begin *********#
# 将网页内容保存到webdata
webpage = req.urlopen(url)
webdata = webpage.read()
webdata = webdata.decode('utf-8')
#********** End **********#
outfile = open("nudt.txt", 'w') # 按二进制写方式打开文件
outfile.write(webdata) # 将网页数据写入文件
outfile.close()
T2 数据分析—提取历年分数线数据页链接
这个题的处理,在 T 3 T3 T3中给出的方法是硬查,我就用了一个 w h i l e while while循环来找起点,其余没有区别。
# -*- coding: utf-8 -*-
import urllib.request as req
# 国防科技大学本科招生信息网中录取分数目录页URL:
url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/index.html'
webpage = req.urlopen(url) # 按照类文件的方式打开网页
webdata = webpage.read() # 一次性读取网页的所有数据
webdata = webdata.decode('utf-8') # 将byte类型的data解码为字符串
def step2():
# 建立空列表urls,来保存子网页的url
urls = []
# 请按下面的注释提示添加代码,完成相应功能
#********** Begin *********#
# 从data中提取2012到2016每一年分数线子网站地址添加到urls列表中
pre = 'http://www.gotonudt.cn/'
Gfkd = '国防科技大学'
for i in range(2012, 2017) :
mdl = Gfkd + str(i)
idx = webdata.find(mdl)
while webdata[idx : idx + 4] != 'href' :
#print(idx)
idx -= 1
urls.append(pre + webdata[idx + 7 : idx + 47])
#********** End **********#
return urls
T3 数据获取—获取历年分数线数据网页
这个题可以理解成 T 1 T1 T1和 T 2 T2 T2的结合,没有额外操作。
import urllib.request as req
# 国防科技大学本科招生信息网中录取分数目录页URL:
url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/index.html'
webpage = req.urlopen(url) # 按照类文件的方式打开网页
webdata = webpage.read() # 一次性读取网页的所有数据
webdata = webdata.decode('utf-8') # 将byte类型的data解码为字符串
def step3():
for year in range(2014, 2017):
substr='国防科技大学'+str(year)+'年录取分数统计'
index = webdata.find(substr)
href = webdata[index - 80:index - 39] # 根据单个特征串提取url子串
href = 'http://www.gotonudt.cn'+href # 获得完整域名
# 请按下面的注释提示添加代码,完成相应功能
#********** Begin *********#
# 获取每一年分数线子网站网页并保存到content
sonweb = req.urlopen(href)
content = sonweb.read()
content = content.decode('utf-8')
#********** End **********#
outfile = open(str(year)+"年录取分数网页.txt", 'w') # 按二进制写方式打开文件
outfile.write(content) # 将网页数据写入文件
outfile.close()
T4 数据分析—提取历年分数线的数据
来了,这个作业唯一想考你的题。
首先,本题介绍了正则表达式,难以理解的话可以多看几遍。
剩下的就是简单地列表操作,
a
p
p
e
n
d
append
append和访问而已。
关键有一个去空格,
h
t
m
l
html
html空格是nbsp,全角和半角用输入法打出来即可。
# -*- coding: utf-8 -*-
import urllib.request as req
import re
# 国防科技大学本科招生信息网中录取分数目录页URL:
url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/index.html'
webpage = req.urlopen(url) # 根据超链访问链接的网页
webdata= webpage.read() # 读取超链网页数据
webdata = webdata.decode('utf-8') # byte类型解码为字符串
def step4():
#获取14-16年录取分数网页
for year in range(2014, 2017):
datalist = []
substr='国防科技大学'+str(year)+'年录取分数统计'
index=webdata.find(substr)
href=webdata[ index-80 : index-39 ]
href='http://www.gotonudt.cn'+href
webpage=req.urlopen(href)
content=webpage.read().decode('utf-8')
# 请按下面的注释提示添加代码,完成相应功能,若要查看详细html代码,可在浏览器中打开url,查看页面源代码。
#********** Begin *********#
# 1.获取网页中的第一个表格中所有内容:
tables = re.findall(r'<table.*?>(.*?)</table>', content, re.S)
table = tables[0]
# 2.按tr标签对获取表格中所有行,保存在列表 data_row中:
rows = re.findall(r'<tr.*?>(.*?)</tr>', table, re.S)
# 3.迭代rows中的所有元素,获取每一行的td标签内的数据,对数据进行清洗,将清洗后的数据组成 data_row列表,将每一个 data_row添加到datalist列表:
for row in rows :
datas = re.findall(r'<td.*?>(.*?)</td>', row, re.S)
datarow = []
for i in datas :
Ridx = i.find(r'</span>')
Lidx = i.rfind(r'>', 0, Ridx)
mdl = i[Lidx + 1 : Ridx]
mdl = mdl.strip()
mdl = mdl.replace(' ', '')
mdl = mdl.replace(' ', '')
mdl = mdl.replace(' ', '')
datarow.append(mdl)
datalist.append(datarow)
#********** End **********#
outfile=open(str(year)+'年out.txt','w')
for rows in datalist:
for cell in rows:
outfile.write(cell+'\t')
outfile.write('\n')
outfile.close()