@R星校长
第1
关:利用URL获取超文本文件并保存至本地
当我们想要在浏览器中打开一个网页时,需要在浏览器的地址栏中输入该网页的url
,例如在地址栏中输入百度搜索网站的首页url
:https://www.baidu.com/ ,点击确认后,浏览器将向服务器发出一个对该网的请求;服务器端收到请求后,会返回该网页的超文本文件,浏览器收到服务器端发来的网页超文本文件后,对其进行解析,然后在窗口中显示该超文本文件对应的网页。如下图所示。
网页对应的超文本文件如下图所示。
本关我们将使用Python程序,实现通过网页的url
,获得服务器返回的超文本文件,并打印出来的功能。
相关知识
课程视频(《网页数据 - 利用URL获取超文本文件》)
下面通过文字进一步详细描述获取网页并保存至本地的实现方法。
访问url的urlopen()方法
Python
提供了urllib.request
模块用来处理网页的url
。
urllib.request.urlopen(url[, data[, proxies]])
:创建一个表示远程url
的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。
参数说明:一般我们只用到第一个参数。
url
表示远程数据的路径,一般是网页的网址;data
表示以post
方式提交到url
的数据;proxies
用于设置代理。
返回值说明:urlopen()
返回一个类文件对象,返回结果可使用read()
, eadline()
, readlines()
,fileno()
,close()
等方法直接使用。下面给出了具体的使用示例:
# coding=utf-8
import urllib.request as req
f = req.urlopen('http://www.baidu.com')
firstLine = f.readline() #读取html页面的第一行
print(firstLine)
print(firstLine.decode('utf-8'))
其中:
- ‘http://www.baidu.com’: 要访问的url,百度搜索首页的网址;
- req.urlopen():
调用了urllib.request.urlopen()方法,引用时用req替代了urllib.request; - f.readline(): f是类文件对象,进行行读取操作。
输出结果:
b'<!DOCTYPE html>\n'
<!DOCTYPE html>
对比下面图片中显示的网页源代码,输出结果和第一行内容一致。
将远程数据下载到本地的urlretrieve()方法
urllib.request.urlretrieve(url[, filename[, reporthook[, data]]])
:将url
定位的服务器端的html
文件下载到你本地的硬盘中。如果不指定filename
,则会存为临时文件。
参数说明:一般我们只用到前两个参数。
url
外部或者本地url
地址;filename
指定了保存到本地的路径(如果未指定该参数,urllib
会生成一个临时文件来保存数据);reporthook
是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调,我们可以利用这个回调函数来显示当前的下载进度;data
指post
到服务器的数据。该方法返回一个包含两个元素的元组(filename,
headers),filename表示保存到本地的路径,header表示服务器的响应头。
返回值说明:urlretrieve()
返回一个二元组(filename
, mine_hdrs
),下面给出了具体的使用示例:
# coding=utf-8
import urllib.request as req
url = 'http://www.baidu.com'
path = 'D:\\baidu.html'
req.urlretrieve(url, path)
输出结果:在D
盘目录下会创建一个baidu.html
文件。
文件操作
1. 打开文件的open()
函数
open(file[, mode[, buffering[, encoding[, errors[, newline[, closefd=True]]]]]])
参数说明:一般我们会用到以下三个参数:
file
文件路径,以字符串输入;
mode
文件打开模式,详见预备知识,以字符串输入;
encoding
表示的是返回的数据采用何种编码,一般采用utf8
或者gbk
。
返回值说明:open()
函数返回一个文件对象。
下面给出了具体的使用示例:
# coding=utf-8
`f = open("D:\example.txt","w")
以只写方式打开D
盘目录下的example.txt
文件,若文件不存在则创建该文件。
2. 关闭文件对象的close()
方法
close()
方法用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作,否则会触发ValueError
错误。close()
方法允许调用多次。
当file
对象,被引用到操作另外一个文件时,Python会自动关闭之前的file
对象。 使用close()
方法关闭文件是一个好的习惯。
# coding=utf-8
file = open("D:\example.txt","w")
file.close()
上述代码将打开的文件对象file
关闭。
3. 读文件,文件对象的read()
,readline()
,readlines()
方法
f.read([size]): size
为读取的长度,以byte
为单位;f.readline([size])
: 读一行,如果定义了size
,有可能返回的只是一行的一部分;f.readlines()
:
把文件每一行作为一个列表的一个成员,并返回这个列表。它的内部是通过循环调用readline()
来实现的。
# coding=utf-8
file = open("D:\example.txt","r")
file.read()
上述代码可以读取example.txt
文件的所有内容,注意打开文件时要给文件对象读的权限。
4. 写文件,文件对象的write()
,writelines()
方法
f.write(str)
:str
是一个字符串,存放你要写入的内容;f.writelines(sequence)
:sequence
是一个序列,比如列表,它会迭代帮你写入文件。
# coding=utf-8
f = open('D:\example.txt','w')
list = ['frog',' ','cat',' ','dog']
f.writelines(list)
f.close()
上述代码可以将list
中的元素写入D
盘下的example.txt
文件,文件中会出现如下内容:frog cat dog
。
注意:writelines()
方法不会为每一个元素自动添加换行。
编程要求
利用urllib.request
模块中的方法,补全step1()
函数。该函数将国防科技大学本科招生信息网中录取分数网页抓取下来,并保存在本地,具体要求:
正确使用urllib.request
的相关函数获取指定url
的内容;
将获取的页面内容,写入本地文件,命名为nudt.txt
。
开始你的任务吧,祝你成功!
# -*- coding: utf-8 -*-
import urllib.request as req
import os
import hashlib
# 国防科技大学本科招生信息网中录取分数网页URL:
url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/index.html' # 录取分数网页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 **********#