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

第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

    webpage = req.urlopen(url)  # 按照类文件的方式打开网页

    data = webpage.read()  # 一次性读取网页的所有数据

   

# 2.将读data以二进制写模式写入以学号命名的 “nudt.txt” 文件:

    outfile = open("nudt.txt", 'wb')  # 按二进制写方式打开文件

    outfile.write(data)  # 将网页数据写入文件

    outfile.close()

#********** 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中提取2014到2021每一年分数线子网站地址添加到urls列表中

    years = [2021,2020,2019,2018,2017,2016, 2015, 2014]

    for year in years:

        index = data.find("%s年录取分数统计(生长军官学员)" %year)

        href= data[index-134:index-97]# 根据单个特征串提取url子串

        website = 'https://www.nudt.edu.cn/bkzs/xxgk/lqfs/'

        urls.append(website+href)

# #********** End **********#

    return urls

 第3关:网页数据分析

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

import urllib.request as req

import re

# 国防科技大学本科招生信息网中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'', data, re.S)

firsttable = table[0]           # 取网页中的第一个表格

# 数据清洗,将表中的 ,\u3000,和空格号去掉

firsttable = firsttable.replace(' ', '')

firsttable = firsttable.replace('\u3000', '')

firsttable = firsttable.replace(' ', '')

def step3():

    score = []

# 请按下面的注释提示添加代码,完成相应功能,若要查看详细html代码,可在浏览器中打开url,查看页面源代码。

#********** Begin *********#

# 1.按tr标签对获取表格中所有行,保存在列表rows中:

    rows = re.findall(r'', firsttable, re.S)

# 2.迭代rows中的所有元素,获取每一行的td标签内的数据,并把数据组成item列表,将每一个item添加到scorelist列表:

    scorelist = []

    for row in rows:

            items = []

            tds = re.findall(r'(.*?)', row, re.S)

            for td in tds:

                rightindex = td.find('

')  # 返回-1表示没有找到                 leftindex = td[:rightindex].rfind('>')                 items.append(td[leftindex +1:rightindex])             scorelist.append(items) # 3.将由省份,分数组成的7元列表(分数不存在的用\代替)作为元素保存到新列表score中,不要保存多余信息     for record in scorelist[2:]:         record.pop()         score.append(record) #********** End **********#     return score

你可能感兴趣的:(头歌,爬虫)