python的内置urllib库(HTTP请求库)

介绍:

Python urllib 库用于操作网页 URL,并对网页的内容进行抓取处理。

urllib库主要包含以下几个模块:

  • urllib.request - 打开和读取 URL
  • urllib.error- 包含 urllib.request 抛出的异常。
  • urllib.parse - 解析 URL
  • urllib.robotparser - 解析 robots.txt 文件

可以通过以下语句来引入urllib库:

import urllib.request # 引入urllib.request库
import urllib.error # 引入urllib.error库
import urllib.parse # 引入urllib.parse库
import urllib.robotparser # 引入urllib.robotparser库

1. urllib.request

介绍:

urllib.request 可以模拟浏览器的一个请求发起过程。我们可以使用 urllib.request 的 urlopen 方法来打开一个 URL。

语法:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

参数说明:

  • url:url 地址。
  • data:发送到服务器的其他数据对象,默认为 None。
  • timeout:设置访问超时时间。
  • cafilecapath:cafile 为 CA 证书, capath 为 CA 证书的路径,使用 HTTPS 需要用到。
  • cadefault:已经被弃用。
  • context:ssl.SSLContext类型,用来指定 SSL 设置。

实例:

from urllib.request import urlopen
request = urlopen('http://www.baidu.com')
print(request.read())

以上代码使用urlopen()打开一个URL,然后使用read()函数获取网页的HTML实体代码。

1.1 read()函数

read()是读取整个网页的内容,我们也可以在read()中传递参数,指定读取的长度:

from urllib.request import urlopen
request = urlopen('http://www.baidu.com')
print(request.read(10))

以上代码表示读取网页的前10个字符。

除了read()函数外,还包括以下两个读取网页内容的函数:

  • readline():读取文件的一行内容
from urllib.request import urlopen
request = urlopen('http://www.baidu.com')
print(request.readline())
  • readlines():读取文件的全部内容,它会把读取的内容赋值给一个列表变量
from urllib.request import urlopen
request = urlopen('http://www.baidu.com')
print(request.readlines())

返回的是一个列表:

[b’…………b’\t’]

1.2 getcode()函数

介绍:

我们在对网页进行抓取时,经常需要判断网页是否可以正常访问,这里我们就可以使用 getcode() 函数获取网页状态码,返回 200 说明网页正常,返回 404 说明网页不存在。

实例:

from urllib.request import urlopen
request = urlopen('http://www.baidu.com')
print(request.getcode())

返回的内容为:

200

说明网页能正常访问。

1.3 File write()函数 (补充:将抓取的网页保存到本地)

from urllib.request import urlopen
request = urlopen('http://www.baidu.com')
html = request.read()  # 将读取到的内容保存到html变量中
file = open('baidu.html',"wb")  # 创建一个baidu.html的文件用于保存抓取到的页面
file.write(html)  # 将html写入文件中
file.close()  # 关闭文件

python 加载本地html python加载lib库_HTTP

此时在根目录下生成了一个baidu.html文件。

1.4 quote()和unquote() (补充:URL的编码与解码)

介绍:

URL 的编码与解码可以使用 urllib.request.quote()urllib.request.unquote() 方法。

实例:

import urllib.requestbaseURL = 'http://www.baidu.com'

encode_url =urllib.request.quote(baseURL)
print(encode_url)

decode_url = urllib.request.unquote(baseURL)
print(decode_url)

以上代码运行结果为:

http%3A//www.baidu.com
http://www.baidu.com

1.5 Request类 (重点:模拟头部信息)

介绍:

我们抓取网页一般需要对 headers(网页头信息)进行模拟,这时候需要使用到 urllib.request.Request 类。

语法:

class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
  • url:url 地址。
  • data:发送到服务器的其他数据对象,默认为 None。
  • headers:HTTP 请求的头部信息,字典格式。
  • origin_req_host:请求的主机地址,IP 或域名。
  • unverifiable:很少用整个参数,用于设置网页是否需要验证,默认是False。。
  • method:请求方法, 如 GET、POST、DELETE、PUT等。

实例:

我们在实例中将发起一次POST请求,为此将使用到一个网站http://www.httpbin.org/#/HTTP_Methods/post_post,在网页中依次选择如下:

python 加载本地html python加载lib库_服务器_02

python 加载本地html python加载lib库_HTTP_03

python 加载本地html python加载lib库_python_04

python 加载本地html python加载lib库_python_05

import urllib.requestimport urllib.parsebaseURL = 'http://www.httpbin.org/post'  # URL地址
header = {    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'}  # 模拟用户代理信息,防止出现418错误
data = urllib.parse.urlencode({'name':'Merrill_he'}).encode('utf-8')  # 发送到服务器的其他数据对象,使用utf-8进行编码
request = urllib.request.Request(baseURL,headers=header,method="POST",data=data)  # 请求头函数
response = urllib.request.urlopen(request).read()  # 返回的内容
print(response)

以上代码的运行结果为:

b'{\n  "args": {}, \n  "data": "", \n  "files": {}, \n  "form": {\n    "name": "Merrill_he"\n  }, \n  "headers": {\n    "Accept-Encoding": "identity", \n    "Content-Length": "15", \n    "Content-Type": "application/x-www-form-urlencoded", \n    "Host": "www.httpbin.org", \n    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36", \n    "X-Amzn-Trace-Id": "Root=1-60b3a8fd-564a91df502f64a05dcdb096"\n  }, \n  "json": null, \n  "origin": "211.97.3.152", \n  "url": "http://www.httpbin.org/post"\n}\n'

python 加载本地html python加载lib库_python_06

运行结果与响应体一致。

2. urllib.error

介绍:

urllib.error 模块为 urllib.request 所引发的异常定义了异常类,基础异常类是 URLError。

urllib.error 包含了两个方法,URLError 和 HTTPError。

  • URLError 是 OSError 的一个子类,用于处理程序在遇到问题时会引发此异常(或其派生的异常),包含的属性 reason 为引发异常的原因
  • HTTPError 是 URLError 的一个子类,用于处理特殊 HTTP 错误例如作为认证请求的时候,包含的属性 code 为 HTTP 的状态码, reason 为引发异常的原因,headers 为导致 HTTPError 的特定 HTTP 请求的 HTTP 响应头
import urllib.request
import urllib.error
try:    
	request = urllib.request.urlopen('http://www.baidu101.com')
except urllib.error.HTTPError as e:
	if e.code == 404:        
		print("您访问的页面丢失啦!")

3. urllib.parse

介绍:

urllib.parse 用于解析 URL。

语法:

urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)

参数说明:

  • urlstring 为 字符串的 url 地址
  • scheme 为协议类型
  • allow_fragments 参数为 false,则无法识别片段标识符。相反,它们被解析为路径,参数或查询组件的一部分,并 fragment 在返回值中设置为空字符串

4. urllib.robotparser

介绍:

urllib.robotparser 用于解析 robots.txt 文件。robots.txt(统一小写)是一种存放于网站根目录下的 robots 协议,它通常用于告诉搜索引擎对网站的抓取规则。

语法:

class urllib.robotparser.RobotFileParser(url='')