网页抓取及信息提取(一)

时间煮雨
@R星校长

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

当我们想要在浏览器中打开一个网页时,需要在浏览器的地址栏中输入该网页的url,例如在地址栏中输入百度搜索网站的首页urlhttps://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是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调,我们可以利用这个回调函数来显示当前的下载进度;
  • datapost到服务器的数据。该方法返回一个包含两个元素的元组(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 **********#

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值