1、urllib库
1.1 4个模块
urllib 是一个用来处理网络请求的python标准库,它包含4个模块。
(1 )urllib.requests---------请求模块,用于发起网络请求
(2)urllib.parse---------解析模块,用于解析URL
(3)urllib.error---------异常处理模块,用于处理request引起的异常
(4)urllib.robotparse--------用于解析robots.txt文件
1.2 urllib.request模块
request模块主要负责构造和发起网络请求,并在其中添加Headers,Proxy等。利用它可以模拟浏览器的请求发起过程。
主要步骤如下:
(1)发起网络请求
(2)添加Headers
(3)操作cookie
(4)使用代理
1.2.1 urlopen方法
urllib.request.urlopen(url, data=None,timeout=None,capath=None, cadefault=False, context=None)
urlopen是一个简单发送网络请求的方法。它接收一个字符串格式的url,它会向传入的url发送网络请求,然后返回结果。
![](https://img.haomeiwen.com/i14894401/81123fef10aa9b8e.png)
urlopen默认会发送get请求,当传入data参数时,则会发起POST请求。data参数是字节类型、者类文件对象或可迭代对象。
![](https://img.haomeiwen.com/i14894401/0990655ca0766f6f.png)
还才可以设置超时,如果请求超过设置时间,则抛出异常。timeout没有指定则用系统默认设置,timeout只对,http,https以及ftp连接起作用。它以秒为单位,比如可以设置timeout=0.1 超时时间为0.1秒。
![](https://img.haomeiwen.com/i14894401/d00f95fb2362fd88.png)
1.2.2Request对象
利用openurl可以发起最基本的请求,但这几个简单的参数不足以构建一个完整的请求,可以利用更强大的Request对象来构建更加完整的请求。
![](https://img.haomeiwen.com/i14894401/98f29bdbbcf882e2.png)
(1)请求头添加
通过urllib发送的请求会有一个默认的Headers: “User-Agent”:“Python-urllib/3.6”,指明请求是由urllib发送的。所以遇到一些验证User-Agent的网站时,需要我们自定义Headers把自己伪装起来。
![](https://img.haomeiwen.com/i14894401/5adc3fa8c24766c6.png)
(2) 操作cookie
在开发爬虫过程中,对cookie的处理非常重要,urllib的cookie的处理如下案例:
![](https://img.haomeiwen.com/i14894401/2742c33c692b8be8.png)
(3) 设置代理
运行爬虫的时候,经常会出现被封IP的情况,这时我们就需要使用ip代理来处理,urllib的IP代理的设置如下:
![](https://img.haomeiwen.com/i14894401/a9109a3be4776eb3.png)
1.2.3 Response对象
urlib库中的类或或者方法,在发送网络请求后,都会返回一个urllib.response的对象。它包含了请求回来的数据结果。它包含了一些属性和方法,供我们处理返回的结果。
(1) read() 获取响应返回的数据,只能用一次
![](https://img.haomeiwen.com/i14894401/fbc3ad13a8c511bf.png)
(2) readline() 读取一行
![](https://img.haomeiwen.com/i14894401/14badef02cff077a.png)
(3) info() 获取响应头信息
![](https://img.haomeiwen.com/i14894401/f89439efbde23804.png)
(4) geturl() 获取访问的url
![](https://img.haomeiwen.com/i14894401/fa205bcd4f120c3f.png)
(5) getcode() 返回状态码
![](https://img.haomeiwen.com/i14894401/cfbf4774f9710d2e.png)
1.3 urllib.parse模块
parse模块是一个工具模块,提供了需要对url处理的方法,用于解析url。
1.3.1 parse.quote()
url中只能包含ascii字符,在实际操作过程中,get请求通过url传递的参数中会有大量的特殊字符,例如汉字,那么就需要进行url编码。
例如https://baike.baidu.com/item/URL编码/3703727?fr=aladdin
我们需要将编码进行url编码
![](https://img.haomeiwen.com/i14894401/6233bfdd411dbe54.png)
运行结果:
![](https://img.haomeiwen.com/i14894401/de4ad92afc0f1fa9.png)
利用parse.unquote()可以反编码回来。
1.3.2 parse.urlencode()
在发送请求的时候,往往会需要传递很多的参数,如果用字符串方法去拼接会比较麻烦,parse.urlencode()方法就是用来拼接url参数的。
![](https://img.haomeiwen.com/i14894401/552b4cd4ed1332ad.png)
运行结果:
![](https://img.haomeiwen.com/i14894401/e50f2909b7c24751.png)
也可以通过parse.parse_qs()方法将它转回字典
![](https://img.haomeiwen.com/i14894401/5657c3e62320485e.png)
运行结果:
![](https://img.haomeiwen.com/i14894401/0ed9d564a2a57b00.png)
1.4 urllib.error模块
error模块主要负责处理异常,如果请求出现错误,我们可以用error模块进行处理
主要包含URLError和HTTPError。
(1)URLError:是error异常模块的基类,由request模块产生的异常都可以用这个类来处理。
(2)HTTPError:是URLError的子类,主要包含三个属性:
![](https://img.haomeiwen.com/i14894401/12cabc36db5bdaac.png)
1.5 urllib.robotparse模块
robotparse模块主要负责处理爬虫协议文件,robots.txt.的解析。
https://www.taobao.com/robots.txt
Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
robots.txt文件是一个文本文件,使用任何一个常见的文本编辑器,比如Windows系统自带的Notepad,就可以创建和编辑它 [1] 。robots.txt是一个协议,而不是一个命令。robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt文件告诉蜘蛛程序在服务器上什么文件是可以被查看的。
2、urllib3
2.1 简介
urllib3 是一个基于python3的功能强大,友好的http客户端。越来越多的python应用开始采用urllib3.它提供了很多python标准库里没有的重要功能。
urllib3通过pip来安装:
pip install urllib
urllib3功能强大使用简单:
![](https://img.haomeiwen.com/i14894401/3f1df7ca6edf31f9.png)
2. 2 构造请求(request)
![](https://img.haomeiwen.com/i14894401/72c645f24813047d.png)
2.3 Response content
http响应对象提供status, data,和header等属性。
![](https://img.haomeiwen.com/i14894401/eb0d5433e5711219.png)
运行结果:
![](https://img.haomeiwen.com/i14894401/b7fb1bf0a25fe397.png)
2.4 JSON content
返回的json格式数据可以通过json模块,load为字典数据类型。
![](https://img.haomeiwen.com/i14894401/5375a3b2bf475bda.png)
运行结果:
![](https://img.haomeiwen.com/i14894401/d2c5dd07109b8609.png)
2.5 Binary content
响应返回的数据都是字节类型,对于大量的数据我们通过stream来处理更好:
![](https://img.haomeiwen.com/i14894401/21892c429adb116a.png)
也可以当做一个文件对象来处理
![](https://img.haomeiwen.com/i14894401/52a1da78c1e1d161.png)
2.6 Proxies
可以利用ProxyManager进行http代理操作
![](https://img.haomeiwen.com/i14894401/5ec5e07796ec4a36.png)
2.7 Request data
(1)Headers
request方法中添加字典格式的headers参数去指定请求头
![](https://img.haomeiwen.com/i14894401/1db1db91ba61cfb3.png)
(2)Query parameters
get,head,delete请求,可以通过提供字典类型的参数fields来添加查询参数。
![](https://img.haomeiwen.com/i14894401/64ea686d4c0511e5.png)
对于post和put请求,如果需要查询参数,需要通过url编码将参数编码成正确格式然后拼接到url中。
![](https://img.haomeiwen.com/i14894401/7530ba9599bee750.png)
(3)Form data
对于put和post请求,需要提供字典类型的参数field来传递form表单数据。
![](https://img.haomeiwen.com/i14894401/8b974dea75e4275f.png)
(4)JSON
当我们需要发送json数据时,我们需要在request中传入编码后的二进制数据类型的body参数,并制定Content-Type的请求头。
![](https://img.haomeiwen.com/i14894401/133bcbded2151bb3.png)
(5)Files & binary data
对于文件上传,我们可以模仿浏览器表单的方式.
![](https://img.haomeiwen.com/i14894401/dc08fe79dc954e32.png)
对于二进制的数据上传,我们用指定body的方式,并设置Content-Type的请求头
![](https://img.haomeiwen.com/i14894401/ef887063aafd8c90.png)
3 、爬虫一般开发流程
开发一个爬虫可以简单的分为一下5个步骤:
(1)找到目标数据
(2)分析请求流程
(3)构造http请求
(4)提取清洗数据
(5)数据持久化
作业:利用urllib3 下载 百度图片首页所有图片,保存到当前文件夹下的imgs文件夹
![](https://img.haomeiwen.com/i14894401/c021a4fb998ceb6d.png)
网友评论