爬虫实战——网页抓取及信息提取

第1关:利用URL获取超文本文件并保存至本地

# -*- coding: utf-8 -*-
import urllib.request as req
import os
import hashlib
 
# 国防科技大学本科招生信息网中录取分数网页URL:
url = 'https://www.nudt.edu.cn/bkzs/xxgk/lqfs/index.htm'  # 录取分数网页URL
 
 
def step1():
# 请按下面的注释提示添加代码,完成相应功能
#********** Begin *********#
# 1.将网页内容保存到data
    x = req.urlopen(url)
    date = x.read()
# 2.将data以二进制写模式写入以学号命名的 “nudt.txt” 文件:
    with open('nudt.txt','wb') as f:
        f.write(date)
#********** End **********#

第2关:提取子链接

# -*- coding: utf-8 -*-

import urllib.request as req


# 国防科技大学本科招生信息网中录取分数网页URL:
url = 'https://www.nudt.edu.cn/bkzs/xxgk/lqfs/index.htm'  # 录取分数网页URL
webpage = req.urlopen(url)  # 按照类文件的方式打开网页
data = webpage.read()       # 一次性读取网页的所有数据

data = data.decode('utf-8')  # 将byte类型的data解码为字符串(否则后面查找就要另外处理了)


def step2():
# 建立空列表urls,来保存子网页的url
    urls = []
    
# 请按下面的注释提示添加代码,完成相应功能
#********** Begin *********#
# 从data中提取2016到2012每一年分数线子网站地址添加到urls列表中

    years = [2016, 2015, 2014, 2013,2012]
    for year in years:
        index = data.find("国防科技大学%s年录取分数统计" %year)
        href = data[index-80:index-39]   # 根据各个特征串提取url子串
        website = 'https://www.nudt.edu.cn'
        urls.append(website+href)

#********** End **********#
    return urls

第3关:网页数据分析

# -*- coding: utf-8 -*-
import urllib.request as req
import re
import data_analysis

# 国防科技大学本科招生信息网中2016年录取分数网页URL:
url = 'https://www.nudt.edu.cn/bkzs/xxgk/lqfs/6a4ee15ca795454083ed233f502b262b.htm'

webpage = req.urlopen(url)      # 根据超链访问链接的网页
data = webpage.read()           # 读取超链网页数据
data = data.decode('utf-8')     # byte类型解码为字符串

# 获取网页中的第一个表格中所有内容:
table = re.findall(r'<table(.*?)</table>', data, re.S)
firsttable = table[0]           # 取网页中的第一个表格
# 数据清洗,将表中的&nbsp,\u3000,和空格号去掉
firsttable = firsttable.replace('&nbsp;', '')
firsttable = firsttable.replace('\u3000', '')
firsttable = firsttable.replace(' ', '')


def step3():
    score = []
# 请按下面的注释提示添加代码,完成相应功能,若要查看详细html代码,可在浏览器中打开url,查看页面源代码。
###### Begin ######
# 1.按tr标签对获取表格中所有行,保存在列表rows中:
    rows = re.findall(r'<tr(.*?)</tr>', firsttable, re.S)

# 2.迭代rows中的所有元素,获取每一行的td标签内的数据,并把数据组成item列表,将每一个item添加到scorelist列表:
    scorelist = []
    for row in rows:
        items = []
        tds = re.findall(r'<td.*?>(.*?)</td>', row, re.S)
        for td in tds:
            rightindex = td.find('</span>')        # 返回-1表示没有找到
            leftindex = td[:rightindex].rfind('>')
            items.append(td[leftindex+1:rightindex])
        scorelist.append(items)


# 3.将由省份,分数组成的7元列表(分数不存在的用\代替)作为元素保存到新列表score中,不要保存多余信息
    for record in scorelist[3:]:
        record.pop()
        score.append(record)
####### End #######

    return score

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值