第二章 Urllib库的使用
Python内置的HTTP请求库,包含如下4个模块:
- request:它是最基本的HTTP请求模块,可以用来模拟发送请求,需要给库方法传入URL以及额外的参数
- error:异常处理模块,如果出现错误,我们可以捕获这些异常,然后进行重试或其他操作以保证程序不会意外终止
- parse:一个工具模块,提供了许多URL处理方法,如拆分,解析,合并等
- robotparser:主要用来识别网站的robots.txt文件,然后判断哪些网站可以爬,哪些网站不可以爬,一般用的比较少
2.1 基本使用
2.1.1 urlopen()
import urllib.request
# 定义一个url,待访问的网址
url = 'http://www.baidu.com'
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(url)
# read()方法返回的是字节形式的二进制数据,转换成字符串要解码decode()
content = response.read().decode('utf-8')
print(content)
2.1.2 1个类型与6个方法
一、response响应是HTTPResponse类型
import urllib.request
url = 'http://www.baidu.com'
response = urllib.request.urlopen(url)
print(type(response))
结果:
<class 'http.client.HTTPResponse'>
二、6个方法
- response.read() 一个字节一个字节的读,read()方法中的数字表示返回的字节的个数
- readline() 读取一行
- readlines() 一行一行的读直到读完
- getcode() 返回状态码,是200就没毛病
- geturl() 返回的是url地址
- getheaders() 返回的是状态信息及响应头
2.1.3 data参数
如果要添加该参数,它需要被转码成字节流类型,即 bytes 类型,通过 bytes()方法转化。一旦传递了这个参数,它的请求方式不再是GET方式,而是POST方式。
2.1.4 timeout参数
timeout参数用于设置超时时间(单位:秒),支持HTTP,HTTPS,FTP请求。如果请求超出了设置的时间还没有得到响应,就会抛出异常。不指定该参数就会使用全局默认时间。
import urllib.request
url = 'http://www.baidu.com'
response = urllib.request.urlopen(url=url, timeout=0.1)
content = response.read().decode('utf-8')
print(content)
报错:
socket.timeout: timed out
2.1.5 Request
利用urlopen()可以实现最基本请求的发起,但是这些简单的参数不足以构建完整的请求。要在请求中加入Headers等信息,需要用更强大的Request类,可以查看一下该类需要的参数。
说明:
- url参数是必传参数,其他都是可选参数
- data参数必须传bytes(字节流)类型,如果它是字典先用urllib.parse模块的urlencode()方法编码,还要encode()编码
- headers是一个字典,就是请求头,我们可以在构造请求时通过headers参数直接构造,也可以调用请求实例add_header()方法添加,最常用的添加请求头就是通过UA伪装
- origin_req_host指的是请求方的host名称或者ip地址
- unverifiable表示这个请求是否是无法验证的,默认False
- method表示请求使用的方法,GET,POST,PUT等
2.2 解析链接
urllib库中的parse模块,他定义了处理URL的标准接口,url中各部分抽取,合并,转换。
2.2.1 urlparse()
可以实现url的识别与分段
import urllib.parse
url = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E5%91%A8%E6%9D%B0%E4%BC%A6'
response = urllib.parse.urlparse(url)
print(type(response), response)
<class 'urllib.parse.ParseResult'> ParseResult(scheme='https', netloc='www.baidu.com', path='/s', params='', query='ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E5%91%A8%E6%9D%B0%E4%BC%A6', fragment='')
- 协议(scheme)
- 域名(netloc)