我的第一个爬虫——获取国防科技大学历年录取分数

2019-01-03  本文已影响0人  秋秋_f99f

1、根据URL获取网页

导入urllib.request库,创建一个表示远程的url的类文件对象req.urlopen(' '),如同本地文件一样读取内容。

import urllib.request as req

#根据URL获取网页:

#http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/index.html

url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/index.html'

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

# 读取网页的所有数据,并转换为uft-8编码

data = webpage.read().decode('utf-8')

print(data)

执行成功后可以得到如下的数据:


捕获.PNG

2、网页数据存入文件

将读取的网页数据写入文件:

outfile = open("enrollnudt.txt", 'w') # 打开文件
outfile.write(data) # 将网页数据写入文件
outfile.close()

3、提取链接(历年录取分数统计的URL)

① 发现特殊子串

根据数据的特征,寻找到特殊的子串


1.PNG
② 通过特殊子串进行粗筛

先对“国防科技大学2017年录取分数线统计”这一特殊子串进行粗筛,提取出其URL


2.PNG
urls=[]
website = 'http://www.gotonudt.cn'
for year in range(2012,2018):
     index = data.find('国防科技大学%d年录取分数统计' % year)
     href = data[index-100:index].split('"')[3] # 提取url子串
     # href是相对URL,需要加上站点域名
     urls.append(website+href)
print(urls)

4、根据超链接抓取并保存链接网页内容

# 分析并提取出国防科技大学2016年录取分数统计的超链
years = [2016, 2015, 2014, 2013, 2012]
urls = []
for year in years:
    index = data.find("国防科技大学%s年录取分数统计" %year)
    href = data[index-80:index-39] # 根据单个特征串提取url子串
    # 注意提取的超链href是相对URL,需要加上站点域名
    website = 'http://www.gotonudt.cn'
    urls.append([year,website+href])
for url in urls:
    webpage = req.urlopen(url[1]) # 根据超链访问链接的网页
    data = webpage.read() # 读取超链网页数据
    outfile = open("6-4 enroll%s.txt"%url[0], 'wb') # 按二进制写方式打开文件
outfile.write(data) # 将网页数据写入文件
outfile.close() # 关闭文件

读取到的网页数据已经写入了文件:


image.png

5、提取表格

从抓取的数据中可以发现,数据虽然很零碎但是有规律可循,先看2016年分数线的网页,表格范围从<table>...</table>,导入正规表达式包

def firsttable2file(year, url):
    webpage = req.urlopen(url)
    data = webpage.read().decode('utf-8')
    # 获取网页中的第一个表格中所有内容:
    table = re.findall(r'<table(.*?)</table>', data, re.S)
    firsttable = table[0]
    outfile = open('temp.txt', 'w')
    outfile.write(firsttable)
    outfile.close()

6、提取表格中的行

# 获取表格中所有行:
rows = re.findall(r'<tr(.*?)</tr>', firsttable, re.S)
outfile = open('temp.txt', 'w')
for row in rows:
     outfile.write(row)
     outfile.write('\n')
outfile.close()
上一篇下一篇

猜你喜欢

热点阅读