在python2中有urllib库和urllib2库来实现请求的发送,但在python3后统一为urllib库,由于urllib库是Python内置库,所以不需要额外安装下载。
request:最基本的HTTP請求模塊,用來模拟发送请求(如:在瀏覽器輸入網址後回車) ★
error:異常處理模塊,如果出現請求錯誤,我們則可以捕獲這些異常。★
parse:一個工具模塊,提供許多處理URL的方法:如拆分、解析、合併等★
robotparser:主要用於識別網站的robots.txt文件,用来判斷是否可以爬取,但用得比较少
有星的是书本上讲解的重点
一、urllib的Request模块中的具体用法
1.1、urlopen()
它是urllib.request模块提供的最基本的构造http请求方法,利用它可以模拟浏览器的一个请求发送过程,同时它还带有处理授权验证、重定向、浏览器Cookies等
实例: 用了4行代码获取了Python官网的源代码,而urllib.request.urlopen()响应类型是HTTPResponse类型(可以用type()方法输出)
HTTPResponse类型包含了:read():网页内容、readinto()、getheader(name)、getheaders():响应的头部信息、fileno()、等方法
msg、version、status:状态码、reason、debuglevel、closed等属性
利用最基本的urlopen()方法,完成了最简单的网页的GET的请求抓取
完整的API:urllip.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)
cafile、capath这个两个参数分别指定CA证书和它的路径,context参数,它必须是SSL.Context类型,指定SSL设置、 cadefault参数现在已经弃用,默认值为False
参数:data可选,需要使用bytes(字节流)类型,而byte()第一个参数需要str类型,它(byte())需要在urllib.parse.urllib()方法将参数字典转化为str类型,第二个参数指定编码格式。注:这是的标码"UTF-8",这里要大写。之前按照书上"utf-8"导致执行几次都保错
httpbin.org它提供了HTTP请求测试,而http://httpbin.org/post,这个链接可用来测试POST请求。且其中包含了我们传统的data参数(成功的前提下)
timeout参数:用于设置超时时间,单位为秒,如果时间超出这个设定的时间,还没得到响应则会抛出异常,它支持http、https、ftp、请求
使用urlopen()方法的用法,通过这个最基本的方法,可以完成简单的请求和网页抓取
1.2、Request
如果使用rulopen()可以实现最基本的请求,但不足以构建一个完整的请求,如果需要加入Headres等信息,就需要更加强大的类来构建(Request类)
使用的依然是rulopen()方法来发送请求,但该方法参数不再是URL,而是一个Request对象,通过构造这个数据结构,可以将请求独立成一个对象,更加丰富和零活地配置参数
API:urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
第一个参数url:用于请求URL,这是必传参数,其他都是可选
第二个参数data::如果要传必须是bytes字节类型。若是字典,可先用urllib.parse模块里的urlencode()编码
第三个参数headers:它是一个字典并且是请求头,在构造请求时通过headers参数直接构造,也可以通过add_header()添加,而添加请求头常用的用法是修改User-Agent来伪装浏览器。User-Agent默认是Python-urllib,例如伪装成火狐:User-Agent:Mozilla/5.0(x11;U; linux i686) Gecko/20071127 Firefox/2.0.0.11
第四个参数origin_req_host:指的是请求方的host名称或者IP地址
第五个参数unverifiable:表示请求是否无法验证,默认False,意思是用户没有足够的权限来选择接收这个请求的结果。例如请求HTML文档的图片,但我们无法自动抓取图像的权限,这时值为True
第六个参数method:用来指示请求的使用方法,GET POST PUT
右图为代码,左图为结果
url请求URL,headers中指定了User-Agent和host,参数data用urlencode()和bytes()方法转成字节流
3、高级用法
然而对于更高级的的操作,如Cookies、代理等,则需要用到更加强大的Handler,可以理解它为各种处理器,利用其几乎可以做到HTTP请求中的所有请求
BaseHandler类,它是Handler的父类,它提供default_open()、protocol_request()等,各种Handler子类都继承这个BaseHandler
之前,使用过urlopen(),它是urllib提供的一个方法,之前的urlopen()和Request()相当于封装好以及极其常用的请求方法,但现在需要更高级的功能,则需要更深入地进行配置,所以这里需要使用到Opener
Opener可以使用open()方法,它和urlopen返回的类型一样,简单来说就是使用Handler来构建Opener
这是本人学习之后的总结,若有不当,请联系博主删除