urllib是python内置的HTTP请求库,包含了4个模块
- request:这是最基本的HTTP请求模块,可以模拟请求的发送
- error:异常处理模块。如果出现异常,那么我们可以捕获这些异常
- parse:一个工具模块,提供了许多URL的处理方法
- robotparser:主要是用来识别网站的robots.txt文件
那么我们先从request模块说起:
request模块有一个最常用的方法:urlopen,那他是干哈的捏,其实就是我们最基础的爬虫,模拟浏览器的请求,具体怎么用嘞?话不多说,上代码!
建议可以分别试试不用decode方法和用decode方法返回数据的区别
实际上,我们返回的response是一个HTTPResponse对象,这一点可以通过输出type(response)来验证,我这里就不演示了。既然返回的是一个对象,那相应的就会有一些方法,所以下面我演示一下一些常用的方法,废话不多说,上代码!
具体参数的含义可以看我文章:爬虫中关于network中返回参数的各个含义https://blog.csdn.net/qq_52046196/article/details/141337128?spm=1001.2014.3001.5501
看到这里,恭喜你,urlopen的最基础的使用方法你已经学会了。接下来我们要扩展一下用法:
讲解之前我们需要了解一下urlopen方法的API,也就是可填入参数有哪些
挺多的对吧,但是这里我们只需要记住三个常用的参数:
- url:就是我们之前使用过的填入要访问的网址
- data:如果说我们要传入数据,就会使用到data参数
- timeout:设置超时时间,单位为秒,意思是如果我们访问的网址响应时间超出我们设置的时间,那么就会抛出异常,如果没有设置,就用全局默认时间
由于我们上面已经介绍过了url的使用,所以这里就不再次介绍了
data参数用法
timeout用法:
以上就是urllib.request模块中urlopen的使用方法,但是这样的话真的就够了吗 no~ no~ no~
仅仅使用这个方法是没办法构建一个完整的请求的,比如加入Header的请求头信息,那要怎么办呢,谁来救救我。千呼万唤始出来,你的强来了,他就是Request 类
首先我们需要先了解这个类的一些参数,这里我们重点讲解headers,method参数
那这些参数怎么用捏,老规矩,上代码!
其实Request的作用就是方便我们构建请求,发送请求,但是其实主要作用就是使用headers这个参数,后续可以用这个参数实现UA伪装,其余的其实都差不多(我感觉)
如果不知道什么是UA伪装可以看我之前的文章:
Request说:我来组成头部(一个不太好笑的笑话hhh)属实给我写累了,开个不太好笑的笑话放松一下
好的我们继续:
介绍完了request的两个方法urlopen,Request,现在我们来介绍更高级的方法
Handler,这个是个啥捏,可以理解为一个处理器,然后这个Handler是一个统称,可以有很多种Handler,他们的作用各不相同,比如:
- HTTPDefaultErrorHandler:用于处理HTTP响应错误的,所有错误都会抛出HTTPError类型的异常
- HTTPCookieProcessor:用于处理Cookie
- HTTPPasswordMgr:用于管理密码,维护这用户名 密码的对照表
- HTTPBasicAuthHandler:用于管理认证,如果一个链接打开需要认证,那么可以用这个类来解决问题
要了解Handler的用法,我们还要了解他的好兄弟,Opener,他们之间有啥关♂系呢,以及他们怎么用的捏,我来用代码说明,来人!上代码,上代码啊啊啊啊!!!
呼!总算搞定urllib中request模块的比较常用的一些类或者方法了,当然其中穿插着一些parse模块的用法,我真的要写吐了,呕呕呕,但是你以为这篇就算完了吗,别急,还有一个模块 (这里不展开讲robotparser模块的用法了,一是用得不多,二是我真写不下去了!!!后续真用上再来更新这篇文章吧)
oh no,突然发现还有个没写,又回来补,靠,以为终于写完了,天杀的Cookie
上代码!!!
大家如果对这块代码的注释看不太懂的话,可以看上个代码那块的注释,结合起来理解,其实原理都差不多的,如果是无法理解程序的流程的话,建议可以倒着来理解(代码从后往前看):获取响应 -> 保存在handler中 -> handler将数据传给cookie -> 遍历cookie,这段代码中其实可以不用创建一个变量来保存请求的结果,但是不写的话总感觉少点啥,就先写上吧
还有个就是以文本形式保存cookie,其实就比上面的代码多几行,上代码!
接上文,既然可以存储,那可以读取吗,当然可以
当然,这里的MozillaCookieJar也可以换成LWPCookieJar,表示以LWP格式存储文件
谁!是谁!没错,他就是 error 模块
别担心,学完了request模块之后,error模块就会简单很多,当然error本来也比较简单,
error包括两个类
- URLError类:来自urllib的error模块,继承自OSError类,由request模块产生的异常都可以捕获这个类来处理,他有一个reason属性,可以返回错误的原因,其实主要是处理访问网址出现的一些报错
咋用捏,来人!再上代码!!!
这个就有个好处:程序没有直接报错,而是正常运行且输出了一个结果,这样可以避免程序运行终止,且我们异常可以得到有效的处理,而不是程序运行报错,弹出来一堆英文,还要找半天。大家可以试试用异常处理和不用异常处理的区别,我这里就不展开讨论了
- HTTPError:他是URLError的子类,专门用来处理HTTP请求错误,例如认证请求失败,有三个属性
- code:返回HTTP状态码
- reason:同父类一样,返回错误原因
- headers:返回请求头
怎么用捏,来人,来人啊,哦,没人了,我来上代码!!!
有个细节注意一下啊,由于HTTPError是URLError的子类,我们可以先捕获子类的错误信息,再捕获父类的报错信息,俗话说,子不教父之过嘛,这样就减少了代码的运行量,因为很大程度报错都在子类上,如果子类实在没错,再从父类中找,又是一个极小的细节
还有个模块:parse,主要是对URL的一些操作,我感觉后期可以用其他的方式替代,这里就不展开讲解了
-------------------------------------------------完结撒花-----------------------------------------------------------