urllib和urllib3
urllib库
- urllib 是一个用来处理网络请求的python标准库,它包含4个模块
- urlib.requests:请求模块,用于发起网络请求
- urlib.parse:解析模块,用于解析URL
- urlib.error:异常处理模块,用于处理request引起的异常
- urllib.robotparse:用于解析robots.txt文件
urlib.requests
- request模块主要负责构造和发起网络请求,并在其中添加Headers,Proxy等。利用它可以模拟浏览器的请求发起过程
- urlopen方法
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
- urlopen是一个简单发送网络请求的方法。它接收一个字符串格式的url,它会向传入的url发送网络请求,然后返回结果
- urlopen默认会发送get请求,当传入data参数时,则会发起POST请求。data参数是字节类型、者类文件对象或可迭代对象
- 还才可以设置超时,如果请求超过设置时间,则抛出异常。timeout没有指定则用系统默认设置,timeout只对,http,https以及ftp连接起作用。它以秒为单位,比如可以设置timeout=0.1 超时时间为0.1秒
- Request对象
-
请求头添加
通过urllib发送的请求会有一个默认的Headers: “User-Agent”:“Python-urllib/3.6”,指明请求是由urllib发送的。所以遇到一些验证User-Agent的网站时,需要我们自定义Headers把自己伪装起来 -
操作Cookie
-
设置代理
-
- Response对象的属性和方法
urlib库中的类或或者方法,在发送网络请求后,都会返回一个urllib.response的对象。它包含了请求回来的数据结果- read():获取响应返回的数据,只能用一次
- readline():读取一行
- info():获取响应头信息
- geturl():获取访问的url
- getcode():返回状态码
urlib.parse
parse模块是一个工具模块,提供了需要对url处理的方法,用于解析url
- parse.quote()
- url中只能包含ascii字符,在实际操作过程中,get请求通过url传递的参数中会有大量的特殊字符,例如汉字,那么就需要进行url编码
- parse.urlencode()
- 发送请求的时候,往往会需要传递很多的参数,如果用字符串方法去拼接会比较麻烦,parse.urlencode()方法就是用来拼接url参数的
urlib.error
error模块主要负责处理异常,如果请求出现错误,我们可以用error模块进行处理主要包含URLError和HTTPError
- URLError:是error异常模块的基类,由request模块产生的异常都可以用这个类来处理
- HTTPError:是URLError的子类,主要包含三个属性
- Code:请求的状态码
- reason:错误的原因
- headers:响应的报头
urllib.robotparse
- robotparse模块主要负责处理爬虫协议文件,robots.txt.的解析
- Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取
- robots.txt文件是一个文本文件,使用任何一个常见的文本编辑器,比如Windows系统自带的Notepad,就可以创建和编辑它 。robots.txt是一个协议,而不是一个命令。robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt文件告诉spider程序在服务器上什么文件是可以被查看的
urlid3库
urllib3 是一个基于python3的功能强大,友好的http客户端。越来越多的python应用开始采用urllib3.它提供了很多python标准库里没有的重要功能
-
简单使用
import urllid3 http = urllib3.PoolManager() #实例化对象构造请求 #发送请求 r = http.request('GET','http://desk.zol.com.cn/pc/,headers=header)
-
http响应提供以下属性
-
status(状态码)
-
headers(头文件)
-
data(网页的原始数据)
-
stream(32)(若返回的是字节数可获取字节的大小)
-
使用时应在
http.request
中加上preload_content=Felse
r = http.reqest('GET','http://httpbin.org/bytes/1024',preload_content=False) for chunk in r.stream(32): print(chunk) #或者直接当成文件来处理 for line in r: print(line)
-
-
-
http代理
http = urllib3.PoolManager('http://xxx.xx.xxx.xx:65535') #在此设置指代理
urild3我不经常使用,以上未完,日后再补
Requests库
- 发起请求
Requests的请求不再像urllib一样需要去构造各种Request、opener和handler,使用Requests构造的方法,并在其中传入需要的参数即可
import requests
#使用GET进行请求
resp_get = requests.get('https://www.baidu.com')
#使用post进行请求,并将需要的数据传给data即可
resp_post = request.post('http://httpbin.org/post',data={'key':'value'})
-
传递,查看URL
传递URL参数也不用再像urllib中那样需要去拼接URL,而是简单的,构造一个字典,并在请求时将其传递给params参数
import requests
param = {'key1':'value1',
'key2':'value2'}
#有时会遇到相同的URL参数名,但值不同,此时可如下书写
peee = {'key1':'value1',
'key2':['value2','value3']}
resp_get = requests.get('https://httpbin.org/get',params=param)
print(resp_get.url) #直接 .url 即可查看当前请求下的url
-
同样Requests可以使用以下参数
-
headers
-
传入写好的头文件以键值对格式传入
-
cookies
- 传入写好的cookies同样是键值对形式
-
使用代理
- 使用
proxies
传入代理同样为键值对形式
- 使用
-
重定向
-
在网络请求中,我们常常会遇到状态码是3开头的重定向问题,在Requests中是默认开启允许重定向的,即遇到重定向时,会自动继续访问,我们可以重新设置
resp = requests.get('http://xxxxx.com',allow_redirects=False)
-
-