人生苦短,我用Python上一篇传送门:小白学Python爬虫(一):入门小白学Python爬虫(二):前期准备(一)基础类库的安装小白学习Python爬虫(三):前期准备(二)Linux基础介绍小白学习Python爬虫(四):前期准备(三)Docker基础介绍小白学习Python爬虫(五):前期准备准备工作(四)数据库基础小白学习Python爬虫(六):前期准备(五)爬虫框架安装小白学习Python爬虫(七):HTTP基础小白学习Python爬虫(八):网页基础学习Python爬虫(9):爬虫基础学习Python爬虫(10):Session和Cookies入门等到实战篇,有没有精彩?想到了一句歌词:终于等到了你~~~首先是官方文档地址:官方文档地址:https://docs.python.org/3/lib...在之前的前期准备中,我们一起安装了很多第三方请求库。在介绍这些第三方库之前,先介绍一下Python3自带的HTTP请求库urllib。urlliburllib是一个包,其中包含几个用于处理URL的模块:request:基本的HTTP请求模块。错误:异常处理模块。parse:用于解析URL的模块。robotparser:识别网站中的robots.txt文件。urllib.request要说怎么学最快,当然是查官方文档了,首先给出官方文档的地址。urllib.request的官方文档:https://docs.python.org/3/lib...这里的解释是最权威的,目前有中文版,但是翻译貌似是机器翻译,质量不行高的。实在看不懂只能看小编的XBB了。urlopenurllib.request模块提供了构造HTTP请求的最基本方法。它可以模拟浏览器的一个请求发起过程,同时也处理认证(authenticaton)、重定向(redirection)、浏览器Cookies等。内容。Syntax:urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)当然这么强大的模块要赶快试用。首先,我们使用它爬取我的博客站点:importurllib.requestresponse=urllib.request.urlopen('https://www.geekdigging.com/')print(response.read().decode('utf-8'))小编这里就不展示运行结果了,比较长。仅仅三行代码,我们就完成了对网站源码的抓取,是不是很简单?当我们得到源代码后,就可以从中提取出想要的链接和文本信息。同学们看到打印出来的内容,可以猜到这个内容是什么数据类型,会不会是字符串类型?使用type()来查看它。print(type(response))结果:urlopen返回一个HTTPResponse类型的对象。官方文档对HTTPResponse的解释如下:一个HTTPResponse实例包装了来自服务器的HTTP响应。它提供对请求标头和实体主体的访问。响应是一个可迭代对象,可以在with语句中使用。一般的想法是HTTPResponse是HTTP响应的包装器。它提供对请求标头和请求正文的访问。响应是一个可迭代对象。HTTPResponse主要包括read()、readline()、getheader(name)、getheaders()、fileno()等方法,以及msg、version、status、reason、debuglevel、closed等属性。importurllib.request#获取HTTP协议版本号(HTTP/1.0为10,HTTP/1.1为11)print(response.version)#获取响应码print(response.status)print(response.getcode())#获取响应描述字符串print(response.reason)#获取实际请求的页面url(防止重定向)print(response.geturl())#获取具体的响应头信息print(response.getheader(name="Content-Type"))#获取响应头信息,返回二元组列表print(response.getheaders())#获取响应头信息,返回字符串print(response.info())#读取响应体print(response.readline()).decode('utf-8'))的结果有点长,这里就不贴了。学生可以自己运行。datadata用于表示向服务器请求中的附加参数信息。data默认为None,此时以GET方式发送请求;当用户提供数据参数时,请求改为以POST模式发送。让我们举个例子。这里我们使用httpbin提供的测试接口。本项目在Github上为postmanlabs提供了一个开源项目。Github地址为:https://github.com/postmanlab...。importurllib.requestimporturllib.parsepost_data=bytes(urllib.parse.urlencode({'name':'geekdigging','hello':'world'}),encoding='utf8')response=urllib.request.urlopen('https://httpbin.org/post',data=post_data)print(response.read().decode('utf-8'))值得注意的是,这里我们以dict的形式传递了两个参数,它必须要转码成bytes字节流,这里用到了bytes()方法,第一个参数是我们需要转换的字符串,第二个参数是编码方式。这里我们请求的路径是https://httpbin.org/post,这个链接可以用来测试POST请求,它可以返回我们刚刚请求的一些信息。响应结果如下:{"args":{},"data":"","files":{},"form":{"hello":"world","name":"geekdigging"},"headers":{"Accept-Encoding":"identity","Content-Length":"28","Content-Type":"application/x-www-form-urlencoded","Host":"httpbin.org","User-Agent":"Python-urllib/3.7"},"json":null,"origin":"218.79.141.143,218.79.141.143","url":"https://httpbin.org/post"}从返回的响应信息中,我们可以看到请求头的相关信息,比如我们请求的数据的content-type是application/x-www-form-urlencoded,也就是说我们的方式提交数据是表单提交,也可以看到请求的来源是我当前电脑的ip地址,可以看到我们提交的数据表单等相关信息。timeouttimeout用于以秒为单位设置超时时间。如果请求超过设定的时间还没有得到响应,就会抛出异常。让我们看一个小例子:importurllib.requestimporturllib.parseresponse=urllib.request.urlopen('http://httpbin.org/get',timeout=1)print(response.read().decode('utf-8'))我们先把超时设置为1s,看看响应结果:{"args":{},"headers":{"Accept-Encoding":"identity","Host":"httpbin.org","User-Agent":"Python-urllib/3.7"},"origin":"218.79.141.143,218.79.141.143","url":"https://httpbin.org/get"}可以看到作为正常的响应,我们设置超时为0.1s,然后看结果:importurllib.requestimporturllib.parseresponse=urllib.request.urlopen('http://httpbin.org/get',timeout=0.1)print(response.read().decode('utf-8'))您已经可以看到异常被抛出:Traceback(mostrecentcalllast):...socket.timeout:timedoutDuringthehandlingoftheaboveexception,发生另一个异常:Traceback(mostrecentcalllast):...urllib.error.URLError:Processfinishedwithexitcode1hasalot的内容,我省略了很多内容。我们可以看到这里确实抛出了超时异常。同学们还记得我们前面提到的异常处理吗?这时候我们可以添加一个异常处理器来捕获超时异常。importurllib.requestimporturllib.errorimportsockettry:response=urllib.request.urlopen('http://httpbin.org/get',timeout=0.1)print(response.read().decode('utf-8'))excepturllib.error.URLErrorase:ifisinstance(e.reason,socket.timeout):print('请求超时~~~')else:print(e)结果如下:请求超时~~~证明我们成功捕获了请求超时异常。还有其他几个参数:cafile,capath,cadefault用于实现对可信CA证书的HTTP请求,一般很少使用;context,用于实现SSL加密传输,一般很少使用。好了,本文的内容到此结束。希望所有同学都能自己敲出上面的示例代码。示例代码本系列所有代码编辑器都会放在代码管理仓库Github和Gitee上,方便大家使用。示例代码-Github示例代码-Gitee如果我的文章对你有帮助,请扫码关注作者的公众号:获取最新干货推送:)