urllib库是python内置的HTTP请求库,包含一下4个模块:
request:是最基本的HTTP请求模块,可以用来模拟发送请求。
error:异常处理模块,如果出现请求错误,可以捕获异常,然后进行重试或其他操作以保证程序不会意外终止。
parse:一个工具模块,提供了许多URL处理方法,比如拆分、解析、合并等
robotparser:主要是用来识别网站的robots.txt文件,然后判断哪些网站可以爬,哪些网站不可以爬,一般用的比较少。
1.URLopen()
urllib.request模块提供了最基本的构造HTTP请求的方法,利用它可以模拟浏览器的一个请求发起内容。
以python官网为例:
#urlopen的使用
import urllib.request
response = urllib.request.urlopen('https://www.python.org')
print(response.read().decode('utf-8'))
输出结果如下:
使用type()方法输出响应类型:
#利用type()方法输出响应的类型
import urllib.request
response = urllib.request.urlopen('https://www.python.org')
print(type(response))
输出结果为:
可以发现它是一个HTTPResponse类型的对象,主要包含read()、readinto()、getheader(name)、getheaders()、fileno()等方法,以及msg、version、status、reason、debuglevel、closed等属性。
例如:调用read()方法可以得到返回网页的内容,调用status方法可以得到返回结果的状态码:
#调用方法和属性
import urllib.request
response = urllib.request.urlopen('https://www.python.org')
print(response.status)
print(response.getheaders())
print(response.getheader('Server'))
运行结果为:
urlopen函数的API:
urllib.request.urlopen(url,data = None,[timeout,]*,cafile = None,capath = None,cadefault = False,context = None)
data参数
data参数是可选的,如果使用,需要用bytes方法将参数转化为字节流编码,另外使用data后,请求方式就变成了POST方式
import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({'word':'hello'}),encoding='utf8')
response = urllib.request.urlopen('http://httpbin.org/post',data = data)
print(response.read())
传递了一个参数word,值是hello。它需要被转码成bytes(字节流)类型。使用了bytes()方法,该方法第一个参数需要str类型,需要用urllib.parse模块里的urlencode()方法来将参数字典转为字符串,第二个参数指定编码格式。运行结果如下:
b'{\n "args": {}, \n "data": "", \n "files": {}, \n "form": {\n "word": "hello"\n }, \n "headers": {\n "Accept-Encoding": "identity", \n "Content-Length": "10", \n "Content-Type": "application/x-www-form-urlencoded", \n "Host": "httpbin.org", \n "User-Agent": "Python-urllib/3.8", \n "X-Amzn-Trace-Id": "Root=1-60f81561-6376ab2566bb9e4525f0204e"\n }, \n "json": null, \n "origin": "111.164.173.185", \n "url": "http://httpbin.org/post"\n}\n'
timeout参数
timeout参数用于设置超时时间,单位为秒,意思是如果请求超出了设置的这个时间,还没有得到响应,就抛出异常。
#设置超时时间,0.05s过后没有响应,于是抛出URLError错误
import urllib.request
response = urllib.request.urlopen('http://httpbin.org/get',timeout=0.05)
print(response.read())
运行结果:URLError:
因此可以设置超时时间,控制一个页面若长时间无响应,就跳过抓取,使用try except语句实现。
import socket
import urllib.request
import urllib.error
try:
response = urllib.request.urlopen('http://httpbin.org/get',timeout = 0.1)
except urllib.error.URLError as e:
if isinstance(e.reason,socket.timeout):
print('TIME OUT')
输出结果为TIME OUT。
其他参数:
context参数必须是ssl.SSLContext类型,用来指定SSL设置。
cafile和capth这两个参数分别指定CA证书和它的路径