前言:
urllib的帮助文档:https://docs.python.org/zh-cn/3/library/urllib.html
urllib 库,它是 Python 内置的 HTTP 请求库,也就是说我们不需要额外安装即可使用,它包含四个模块:
第一个模块 request,它是最基本的 HTTP 请求模块,它来模拟发送一请求,就像在浏览器里输入网址然后敲击回车一样,只需要给库方法传入 URL 还有额外的参数,就可以模拟实现这个过程。
第二个 error 模块即异常处理模块,如果出现请求错误,可以捕获这些异常,然后进行重试或其他操作保证程序不会意外终止。
第三个 parse 模块是一个工具模块,提供了许多 URL 处理方法,比如拆分、解析、合并等等的方法。
第四个模块是 robotparser,主要是用来识别网站的 robots.txt 文件,然后判断哪些网站可以爬,哪些网站不可以爬的,一般很少用到,不做记录了。
调用方法(分两种方法):
其一:import urllib.request
其二:import urllib
from urllib import request
一、请求模块
1、urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
1)、 url 参数是请求 URL,这个是必传参数,其他的都是可选参数。
2)、data 参数如果要传必须传 bytes(字节流)类型的,如果是一个字典,可以先用 urllib.parse 模块里的 urlencode() 编码。
3)、 headers 参数是一个字典,这个就是 Request Headers 了,你可以在构造 Request 时通过 headers 参数直接构造,也可以通过调用 Request 实例的 add_header() 方法来添加, Request Headers 最常用的用法就是通过修改 User-Agent 来伪装浏览器,默认的 User-Agent 是 Python-urllib,我们可以通过修改它来伪装浏览器。
4)、 origin_req_host 参数指的是请求方的 host 名称或者 IP 地址。
5)、unverifiable 参数指的是这个请求是否是无法验证的,默认是False。意思就是说用户没有足够权限来选择接收这个请求的结果。例如我们请求一个 HTML 文档中的图片,但是我们没有自动抓取图像的权限,这时 unverifiable 的值就是 True。
6)、 method 参数是一个字符串,它用来指示请求使用的方法,比如GET,POST,PUT等等。
2、urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
urlopen()方法中的url参数可以是字符串,也可以是一个Request对象
1)、data参数:post请求;data 参数是可选的,如果要添加 data,它要是字节流编码格式的内容,即 bytes 类型,通过 bytes() 方法可以进行转化。
data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf8')
采用了 bytes() 方法,第一个参数需要是 str(字符串)类型,需要用 urllib.parse 模块里的 urlencode() 方法来将参数字典转化为字符串。第二个参数指定编码格式,在这里指定为 utf8。
2)、urlopen()中的参数timeout:设置请求超时时间,单位为秒,意思就是如果请求超出了设置的这个时间还没有得到响应,就会抛出异常,如果不指定,就会使用全局默认时间。它支持 HTTP、HTTPS、FTP 请求。
3)、context 参数,它必须是 ssl.SSLContext 类型,用来指定 SSL 设置。
cafile 和 capath 两个参数是指定 CA 证书和它的路径,这个在请求 HTTPS 链接时会有用。
cadefault 参数现在已经弃用了,默认为 False。
3、使用代理代理:为了防止被发现封IP,伪装IP
proxy_handler = urllib.request.ProxyHandler({'代理类型':'代理IP : 代理端口号'})
二、处理异常:urllib.error
可以捕获三种异常:URLError,HTTPError(是URLError类的一个子类),ContentTooShortError
URLError只有一个reason属性:报错则是页面不存在:Not Found
HTTPError有三个属性:code,reason,headers
code:返回 HTTP Status Code,即状态码,比如 404 网页不存在,500 服务器内部错误等等。
reason:同父类一样,返回错误的原因。
header:,返回 Request Headers。
三、url解析模块:urllib.parse
from urllib import request, parse
data = bytes(parse.urlencode(dict), encoding='utf8') # 将字典解析成Unicode码,再转换成utf-8,再转换成比特流