【Educoder作业】※网页抓取及信息提取

【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 utf8就变成字符串了,我们就可以操作了。

# -*- 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('&nbsp;', '')
                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()
  • 25
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值