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
:设置访问超时时间。 -
cafile
和capath
: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() # 关闭文件
此时在根目录下生成了一个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
,在网页中依次选择如下:
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'
运行结果与响应体一致。
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='')