urllib和urllib3
- urllib库
urllib 是一个用来处理网络请求的python标准库,它包含4个模块。
urllib.request---请求模块,用于发起网络请求
urllib.parse---解析模块,用于解析URL
urllib.error---异常处理模块,用于处理request引起的异常
urllib.robotparser robots.tx---用于解析robots.txt文件
urllib.request模块
request模块主要负责构造和发起网络请求,并在其中添加Headers,Proxy等。 利用它可以模拟浏览器的请求发起过程。
- 发起网络请求
- 操作cookie
- 添加Headers
- 使用代理
关于urllib.request.urlopen参数的介绍
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
urlopen是一个简单发送网络请求的方法。它接收一个字符串格式的url,它会向传入的url发送网络请求,然后返回结果。
先写一个简单的例子:
from urllib import request
response = request.urlopen(url='http://www.httpbin.org/get')
print(response.read().decode())
urlopen默认会发送get请求,当传入data参数时,则会发起POST请求。data参数是字节类型、者类文件对象或可迭代对象。
from urllib import request
response = request.urlopen(url='http://www.httpbin.org/post',
data=b'username=q123&password=123')
print(response.read().decode())
还才可以设置超时,如果请求超过设置时间,则抛出异常。timeout没有指定则用系统默认设置,timeout只对,http,https以及ftp连接起作用。它以秒为单位,比如可以设置timeout=0.1 超时时间为0.1秒。
from urllib import request
response = request.urlopen(url='https://www.baidu.com/',timeout=0.1)
Request对象
利用openurl可以发起最基本的请求,但这几个简单的参数不足以构建一个完整的请求,可以利用更强大的Request对象来构建更加完整的请求。
1 . 请求头添加
通过urllib发送的请求会有一个默认的Headers: “User-Agent”:“Python-urllib/3.6”,指明请求是由urllib发送的。所以遇到一些验证User-Agent的网站时,需要我们自定义Headers把自己伪装起来。
from urllib import request
headers ={
'Referer': 'https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&tn=baidu&wd=python%20urllib%E5%BA%93&oq=python%2520urllib%25E5%25BA%2593&rsv_pq=947af0af001c94d0&rsv_t=66135egC273yN5Uj589q%2FvA844PvH9087sbPe9ZJsjA8JA10Z2b3%2BtWMpwo&rqlang=cn&rsv_enter=0&prefixsug=python%2520urllib%25E5%25BA%2593&rsp=0',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
response = request.Request(url='https://www.baidu.com/',headers=headers)
response = request.urlopen(response)
print(response.read().decode())
2. 操作cookie
在开发爬虫过程中,对cookie的处理非常重要,urllib的cookie的处理如下案例
from urllib import request
from http import cookiejar
# 创建一个cookie对象
cookie = cookiejar.CookieJar() # 创一个cookie处理器
cookies = request.HTTPCookieProcessor(cookie) # 以它为参数,创建opener对象
opener = request.build_opener(cookies)
# 使用这个opener 来发请求
res =opener.open('https://www.baidu.com/') print(cookies.cookiejar)
3. 设置代理
运行爬虫的时候,经常会出现被封IP的情况,这时我们就需要使用ip代理来处理,urllib的IP代理的设置如下:
from urllib import request
url ='http://httpbin.org/ip' #代理地址
proxy ={'http':'172.0.0.1:3128'} # 代理处理器
proxies =request.ProxyBasicAuthHandler(proxy) # 创建opener对象
opener = request.build_opener(proxies) res =opener.open(url)
print(res.read().decode())
urlib库中的类或或者方法,在发送网络请求后,都会返回一个urllib.response的对象。它包含了请求回来的数据结果。它包含了一些属性和方法,供我们处理返回的结果
read() 获取响应返回的数据,只能用一次
readline() 读取一行
info() 获取响应头信息
geturl() 获取访问的url
getcode() 返回状态码
urllib.parse模块
parse.urlencode() 在发送请求的时候,往往会需要传递很多的参数,如果用字符串方法去拼接会比较麻烦,parse.urlencode()方法就是用来拼接url参数的。
from urllib import parse
params = {'wd':'测试', 'code':1, 'height':188}
res = parse.urlencode(params)
print(res) 打印结果为wd=%E6%B5%8B%E8%AF%95&code=1&height=188
也可以通过parse.parse_qs()方法将它转回字典
print(parse.parse_qs('wd=%E6%B5%8B%E8%AF%95&code=1&height=188'))
urllib.error模块
error模块主要负责处理异常,如果请求出现错误,我们可以用error模块进行处理 主要包含URLError和HTTPError
URLError:是error异常模块的基类,由request模块产生的异常都可以用这个类来处理
HTTPError:是URLError的子类,主要包含三个属性
- Code:请求的状态码
- reason:错误的原因
- headers:响应的报头
from urllib import request,error
try:
response = request.urlopen("http://pythonsite.com/1111.html")
except error.HTTPError as e:
print(e.reason)
print(e.code)
print(e.headers)
except error.URLError as e:
print(e.reason) else:
print("reqeust successfully")
urllib.robotparse模块
robotparse模块主要负责处理爬虫协议文件,robots.txt.的解析。 https://www.taobao.com/robots.txt
Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取
- urllib库
urllib3 是一个基于python3的功能强大,友好的http客户端。越来越多的python应用开始采用urllib3.它提供了很多python标准库里没有的重要功能
安装:
pip install urllib3
构造请求(request)
import urllib3
# 创建连接
http = urllib3.PoolManager()
# 发送请求
res = http.request('GET','https://www.baidu.com/')
# 状态码
print(res.status)
# 返回的数据
print(res.data.decode())
发送post请求
import urllib3
# 创建连接
http = urllib3.PoolManager()
# 发送请求
res = http.request('POST','https://www.baidu.com/',fields={'hello':'word'})
# 状态码
print(res.status)
# 返回的数据
print(res.data.decode())
http响应对象提供status, data,和header等属性
status--状态码
data--读取返回的数据
header--请求头
返回的json格式数据可以通过json模块,load为字典数据类型。
import json
data={'attribute':'value'}
encode_data= json.dumps(data).encode() r = http.request('POST',
'http://httpbin.org/post',
body=encode_data,
headers={'Content-Type':'application/json'}
)
print(r.data.decode('unicode_escape'))
响应返回的数据都是字节类型,对于大量的数据我们通过stream来处理更好
import urllib3
http = urllib3.PoolManager()
r =http.request('GET','http://httpbin.org/bytes/1024',preload_content=False)
for chunk in r.stream(32):
print(chunk)
也可以当做一个文件对象来处理
import urllib3
http = urllib3.PoolManager()
r =http.request('GET','http://httpbin.org/bytes/1024',preload_content=False)
for chunk in r:
print(chunk)
urllib3库Proxies(代理IP)
import urllib3
proxy = urllib3.ProxyManager('http://172.0.0.1:3128')
res =proxy.request('GET','https://www.baidu.com/')
print(res.data)
urllib3库headers(添加请求头)
import urllib3
http = urllib3.PoolManager()
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'
}
res = http.request('GET','https://www.baidu.com/',headers=headers)
print(res.data)
JSON 当我们需要发送json数据时,我们需要在request中传入编码后的二进制数据类型的body参数,并制定Content-Type的请求头
JSON:在发起请求时,可以通过定义body 参数并定义headers的Content-Type参数来发送一个已经过编译的JSON数据:
import json
data={'attribute':'value'}
encode_data= json.dumps(data).encode() r = http.request('POST',
'http://httpbin.org/post',
body=encode_data,
headers={'Content-Type':'application/json'}
)
print(r.data.decode('unicode_escape'))
对于二进制的数据上传,我们用指定body的方式,并设置Content-Type的请求头
#使用multipart/form-data编码方式上传文件,可以使用和传入Form data数据一样的方法进行,并将文件定义为一个元组的形式 (file_name,file_data):
with open('1.txt','r+',encoding='UTF-8') as f:
file_read = f.read() r = http.request('POST',
'http://httpbin.org/post',
fields={'filefield':('1.txt', file_read, 'text/plain')
})
print(r.data.decode('unicode_escape')) #二进制文件
with open('websocket.jpg','rb') as f2:
binary_read = f2.read() r = http.request('POST',
'http://httpbin.org/post',
body=binary_read,
headers={'Content-Type': 'image/jpeg'})
#
# print(json.loads(r.data.decode('utf-8'))['data'] )
print(r.data.decode('utf-8'))
urllib和urllib3的更多相关文章
- python中urllib, urllib2,urllib3, httplib,httplib2, request的区别
permike原文python中urllib, urllib2,urllib3, httplib,httplib2, request的区别 若只使用python3.X, 下面可以不看了, 记住有个ur ...
- Python网络请求urllib和urllib3详解
Python网络请求urllib和urllib3详解 urllib是Python中请求url连接的官方标准库,在Python2中主要为urllib和urllib2,在Python3中整合成了urlli ...
- Python 爬虫十六式 - 第二式:urllib 与 urllib3
Python请求标准库 urllib 与 urllib3 学习一时爽,一直学习一直爽! 大家好,我是 Connor,一个从无到有的技术小白.上一次我们说到了什么是HTTP协议,那么这一次我们就要动 ...
- python urllib和urllib3包使用
urllib包 urllib是一个包含几个模块来处理请求的库.分别是: urllib.request 发送http请求 urllib.error 处理请求过程中,出现的异常. urllib.parse ...
- python urllib和urllib3包使用(转载于)
urllib.request 1. 快速请求 2.模拟PC浏览器和手机浏览器 3.Cookie的使用 4.设置代理 urllib.error URLError HTTPError urllib.par ...
- python urllib和urllib3包
urllib.request urllib当中使用最多的模块,涉及请求,响应,浏览器模拟,代理,cookie等功能. 1. 快速请求 urlopen返回对象提供一些基本方法: read 返回文本数据 ...
- 请求库urllib和urllib3
# coding=utf-8 # urllib """ 使用python的urllib库去模拟浏览器请求网页,常用内容如下: urllib.request 发送HTTP请 ...
- Python2和Python3中urllib库中urlencode的使用注意事项
前言 在Python中,我们通常使用urllib中的urlencode方法将字典编码,用于提交数据给url等操作,但是在Python2和Python3中urllib模块中所提供的urlencode的包 ...
- 潭州课堂25班:Ph201805201 爬虫基础 第三课 urllib (课堂笔记)
Python网络请求urllib和urllib3详解 urllib是Python中请求url连接的官方标准库,在Python2中主要为urllib和urllib2,在Python3中整合成了url ...
随机推荐
- loadrunner怎么进行内容检查
运行测试时,常常需要验证某些内容是否出现在返回的页面上.内容检查验证脚本运行时 Web 页面上是否出现期望的信息.可以插入两种类型的内容检查:➤ 文本检查.检查文本字符串是否出现在 Web 页面上.➤ ...
- java的static块及相关内容
原文地址:http://blog.csdn.NET/lubiaopan/article/details/4802430 感谢原作者! static{}(即static块),会在类被加载的时候执 ...
- python移除系统多余大文件-乾颐堂
文件多了乱放, 突然有一天发现硬盘空间不够了, 于是写了个python脚本搜索所有大于10MB的文件,看看这些大文件有没有重复的副本,如果有,全部列出,以便手工删除 使用方式 加一个指定目录的参数 比 ...
- Python爬虫入门七之正则表达式
在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的 ...
- console对象的理解
console对象代表浏览器的JS控制台,虽然不是标准,但已经成为事实的标准 console对象的作用 a.显示代码运行错误信息 b.提供一个命令行接口,用来与网页互动 console对象拥有很多方法 ...
- CentOS7 Failed to start LSB: Bring up/down
原文地址:http://addam.blog.51cto.com/5041993/1839518 刚刚装好的虚拟机突然不能上网了,报错很诡异,具体报错如下: /etc/init.d/network r ...
- Android 文件存放路径【转】
对于应用携带的静态数据,可以放置在应用的assets目录或者res,raw目录下.对于assets目录下的静态数据,存在当文件最大支持1MB的局限,读取方式如下: 1 InputStream is = ...
- 编写高质量代码改善C#程序的157个建议——建议106:为静态类添加静态构造函数
建议106:为静态类添加静态构造函数 静态类可以拥有构造方法,这就是静态构造方法.静态构造方法与实例构造方法比较有几个自己的特点: 只被执行一次,且在第一次调用类成员之前被运行时执行. 代码无法调用它 ...
- Opengl中的GLUT下的回调函数
void glutDisplayFunc(void (*func)(void)); 注册当前窗口的显示回调函数 参数: func:形为void func()的函数,完成具体的绘制操作 这个函数告诉GL ...
- APUE(4)---文件和目录 (2)
七.函数umask umask函数为进程设置文件模式创建屏蔽字,并返回之前的值,这是少数几个没有出错返回函数中的一个.其中cmask是9个常量(S_IR/W/XUSR.S_IR/W/XGRP.S_IR ...