展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > 使用Python的HTTP客户端模块urllib和urllib3的教程

使用Python的HTTP客户端模块urllib和urllib3的教程

一、urllib概述:urllib是Python中请求url连接的官方标准库,就是你安装了python,这个库就已经可以直接使用了,基本上涵盖了基础的网络请求功能。在Python2中主要为urllib和urllib2,在Python3中整合成了urllib。Python3.x中将urllib2合并到了urllib,之后此包分成了以下四个模块:urllib.request:它是最基本的http请求模块,用来模拟发送请求urllib.error:异常处理模块,如果出现错误可以捕获这些异常urllib.pars

一、urllib

概述:

urllib是Python中请求url连接的官方标准库,就是你安装了python,这个库就已经可以直接使用了,基本上涵盖了基础的网络请求功能。在Python2中主要为urllib和urllib2,在Python3中整合成了urllib。

Python3.x中将urllib2合并到了urllib,之后此包分成了以下四个模块:

  • urllib.request: 它是最基本的http请求模块,用来模拟发送请求

  • urllib.error: 异常处理模块,如果出现错误可以捕获这些异常

  • urllib.parse: 一个工具模块,提供了许多URL处理方法,如:拆分、解析、合并等

  • urllib.robotparser:主要用来识别网站的robots.txt文件,然后判断哪些网站可以爬

二、urllib.parse模块

它支持如下协议的URL处理:file,ftp,gopher,hdl,http,https,imap,mailto,mms,news,nntp,prospero,rsync,rtsp,rtspu,sftp,sip,sips,snews,svn,snv+ssh,telnet,wais

1、urlparse()、urlunparse():将url字符串解析成元组

语法:urllib.parse.urlparse(urlstring,scheme='',allow_fragments=True)

可以传递3个参数

  • urlstring:待解析的URL,字符串

  • scheme:它是默认的协议,如http或者https,URL如果不带http协议,可以通过scheme来指定,如果URL中制定了http协议则URL中生效

  • allow_fragments:是否忽略fragment即锚点,如果设置为False,fragment部分会被忽略,反之不忽略

该方法可以实现URL的识别和分段,分别是scheme(协议),netloc(域名),path(路径),params(参数),query(查询条件),fragment(锚点)

import urllib.parse

url = "http://www.baidu.com"
parsed = urllib.parse.urlparse(url)
print(parsed)
# 输出:ParseResult(scheme='http', netloc='www.baidu.com', path='', params='', query='', fragment='') #返回的是一个parseresult类型的元组对象,可以通过属性或者索引来获取值

与urlparse()相反,urlunparse通过列表或者元祖的形式接受一个可迭代的对象,实现URL构造

from urllib.parse import urlunparse
data=['http','www.baidu.com','index.html','user','a=6','comment']
print(urlunparse(data)) #构造一个完整的URL

#output
#http://www.baidu.com/index.html;user?a=6#comment

2、urlsplit()、urlunsplit():URL分割与组合

与urlparse()方法类似,它会返回5个部分,只是把params合并到path中。

from urllib.parse import urlsplit

result = urlsplit('http://www.baidu.com/index.html;user?id=5#comment')
print(result)
print(result.query)
# output
# SplitResult(scheme='http', netloc='www.baidu.com', path='/index.html;user', query='id=5', fragment='comment')
# id=5

与urlunparse()类似,它也是将链接的各部分组合完整的链接的方法,传入的参数也是可迭代的对象,如列表元祖等,唯一的区别是长度必须是5个,它省略了params

from urllib.parse import urlsplit,urlunsplit
data=['http','www.baidu.com','index.html','a=5','comment']
result=urlunsplit(data)
print(result)

#output
#http://www.baidu.com/index.html?a=5#comment

3、urlencode()、parse_qs():查询字符串与字典类型转换

urlencode() 将dict中的键值对以连接符&划分。

urlencode()在构造GET请求参数时很有用,可以将字典类型的请求数据转变为url编码

import urllib.parse
dic = {'name':'melon','age':18}
data = urllib.parse.urlencode(dic)

print(data)     #age=18&name=melon

parse_qs()与urlencode()正好相反,它是用来反序列化的,如将GET参数转换回字典格式

from urllib.parse import urlencode,parse_qs,urlsplit
params = {'username':'zs','password':'123'}
base_url='http://www.baidu.com'
url=base_url+'?'+urlencode(params) #将字典转化为get参数

query=urlsplit(url).query  #获去URL的query参数条件
print(parse_qs(query))  #根据获取的GET参数转换为字典格式

#output
#{'username': ['zs'], 'password': ['123']}

4、quote()、unquote():URL编码与解码

quote:URL编码处理,该方法可以将内容转换为URL编码的格式。

如参数中带有中文等非ASCII码时,有时会导致乱码的问题,此时用这个方法将中文字符转化为URL编码

from urllib.parse import quote
key='中文'
url='https://www.baidu.com/s?key='+quote(key)
print(url)

#output
#https://www.baidu.com/s?key=%E4%B8%AD%E6%96%87

unquote(url):URL解码处理,与quote()相反,URL上的特殊字符还原

from urllib.parse import quote, urlsplit, unquote

key = '中文'
url = 'https://www.baidu.com/s?key=' + quote(key)
print(url)
unq = urlsplit(url).query.split('=')[1]  # 获取参数值

print(unquote(unq))  # 解码参数

5、urljoin():将url的根域名和新url拼合成一个完整的url

格式:urljoin(baseurl,newurl,allowFrag=None)

通过将基本URL(base)与另一个URL(url)组合起来构建完整URL,它会使用基本URL组件,协议(schemm)、域名(netloc)、路径(path)、来提供给URL中缺失的部分进行补充,最后返回结果。

base_url提供了三项内容scheme,netloc,path,如果这3项在新的链接中不存在就给予补充,如果新的链接存在就使用新的链接部分,而base_url中的params,query和fragment是不起作用的。

通过urljoin()方法可以实现链接的解析、拼接和生成。

import urllib.parse

url = "http://www.baidu.com"
new_path = urllib.parse.urljoin(url, "index.html")
print(new_path)
# 输出:http://www.baidu.com/index.html

三、urllib.request模块

1、urlretrieve():下载url到html文件。

urlretrieve(url,filename,reporthook,data)

不写路径filename则会被存为临时文件,可以用 urllib.urlcleanup() 来清理缓存

file_name = urllib.request.urlretrieve('http://www.baidu.com','%s/baidu.html'%BASE_DIR)

2、urlopen():打开一个url的方法,返回一个文件对象,然后可以进行类似文件对象的操作

模块中最常用的函数为urlopen():

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

参数如下:

  • url: 请求的网址,str类型,也可以是一个request对象

  • data:要发送到服务器的数据,data参数是可选的,内容为字节流编码格式的即bytes类型,如果传递data参数,urlopen将使用Post方式请求。

  • timeout:设置网站的访问超时时间,单位为秒,如果请求超出了设置时间还未得到响应则抛出异常,支持HTTP,HTTPS,FTP请求。

  • 其他参数:context参数,她必须是ssl.SSLContext类型,用来指定SSL设置,此外,cafile和capath这两个参数分别指定CA证书和它的路径,会在https链接时用到。

1、urlopen的方法:

urlopen返回http.client.HTTPResponse对象,提供方法:

  • read():获取响应返回的数据,只能使用一次。

  • readline():返回得是二进制格式得页面中得第一行

  • readlines() :以二进制格式 返回所有得数据 以列表格式保存

  • fileno():

  • close() :

  • info():返回一个httplib.HTTPMessage 对象,表示远程服务器返回的头信息。

  • getcode():返回Http状态码,如果是http请求,200表示请求成功完成;404表示网址未找到。

  • getheaders():获取返回响应的响应报头。

  • geturl():返回请求的url。

在urlopen()方法中,直接写入要访问的url地址字符串,该方法就会主动的访问目标网址,然后返回访问结果。

返回的访问结果是一个http.client.HTTPResponse对象,使用该对象的read()方法即可获取访问网页获取的数据,这个数据是二进制格式的,所以我们还需要使用decode()方法来将获取的二进制数据进行解码,转换成我们可以看的懂得字符串。

import urllib.request

req = urllib.request.urlopen('http://www.baidu.com')
print(req.read().decode())
print(req.getheaders())  # 以列表元祖对的形式返回响应头信息
print(req.getheader('Content-Type'))  # 返回响应头中的Content-Type值
print(req.info())  # 返回网页的头信息
print(req.info()['Content-Type'])  # 返回响应头中的Content-Type值
2、for循环读取

不需要使用read()方法 。

for line in urlopen('https://。。.html'):
    line = line.decode('utf-8')  # Decoding the binary data to text.
    if 'EST' in line or 'EDT' in line:  # look for Eastern Time
        print(line)
3、GET请求

GET请求和我们平常get访问方式一样,直接把参数写到网址上面就好了。

import urllib.request
import urllib.parse

dic = {'name':'melon','age':18}
data = urllib.parse.urlencode(dic)

req = urllib.request.urlopen('http://127.0.0.1:8000/index?%s'%data) #通过urlopen方法访问拼接好的url

content = req.read()
4、POST请求

在urlopen()方法中,urlopen()默认的访问方式是GET,当在urlopen()方法中传入data参数时,则会发起POST请求。

注意:传递的data数据需要为bytes格式,如data=b'word=hello'。

import urllib.request
import urllib.parse
import json

dic = {'name':'melon','age':18}
data = urllib.parse.urlencode(dic)

req = urllib.request.Request('http://127.0.0.1:8000/index', data.encode()) #encode:将url编码类型的请求数据转变为bytes类型

opener = urllib.request.urlopen(req)
content = json.loads(opener.read().decode()) #read()方法是读取返回bytes数据内容,decode转换后为str
5、请求头参数模拟

当我们需要模拟一些其他的参数的时候,简单的urlopen() 方法已经无法满足我们的需求了,这个时候我们就需要使用下面的urllib.request中的Request对象来帮助我们实现一些其它参数的模拟,比如请求头。

Request对象如下所示:

# Request对象实例化
req   = urllib.request.Request(url, data=None, headers={},origin_req_host=None,unverifiable=False, method=None)
  • url:请求的URL,必须传递的参数,其他都是可选参数

  • data:上传的数据,必须传bytes字节流类型的数据,如果它是字典,可以先用urllib.parse模块里的urlencode()编码

  • headers:它是一个字典,传递的是请求头数据,可以通过它构造请求头,也可以通过调用请求实例的方法add_header()来添加 
    例如:修改User_Agent头的值来伪装浏览器,比如火狐浏览器可以这样设置: 
    {'User-Agent':'Mozilla/5.0 (compatible; MSIE 5.5; Windows NT)'}

  • origin_req_host:指请求方的host名称或者IP地址

  • unverifiable:表示这个请求是否是无法验证的,默认为False,如我们请求一张图片如果没有权限获取图片那它的值就是true

  • method:是一个字符串,用来指示请求使用的方法,如:GET,POST,PUT等

from urllib import request

url='http://httpbin.org/post'
headers={
     'User-Agent':'Mozilla/5.0 (compatible; MSIE 5.5; Windows NT)',
     'Host':'httpbin.org'
 }  #定义头信息

dict={'name':'germey'}

data = bytes(parse.urlencode(dict),encoding='utf-8')
req = request.Request(url=url,data=data,headers=headers,method='POST')
#req.add_header('User-Agent','Mozilla/5.0 (compatible; MSIE 8.4; Windows NT') #也可以request的方法来添加
resp = request.urlopen(req) 
print(resp.read().decode())

3、urllib.request的高级类

BaseHandler类:

在urllib.request模块里的BaseHandler类,他是所有其他Handler的父类,他是一个处理器,比如用它来处理登录验证,处理cookies,代理设置,重定向等

BaseHandler的子类包括:

  • HTTPDefaultErrorHandler:用来处理http响应错误,错误会抛出HTTPError类的异常

  • HTTPRedirectHandler:用于处理重定向

  • HTTPCookieProcessor:用于处理cookies

  • ProxyHandler:用于设置代理,默认代理为空

  • HTTPPasswordMgr:永远管理密码,它维护用户名和密码表

  • HTTPBasicAuthHandler:用户管理认证,如果一个链接打开时需要认证,可以使用它来实现验证功能

build_opener(*handlers)方法用于构建一个自定义的OpenerDirector对象。

build.opener(handler1,handler2…)

之前的urlopen()方法就是urllib提供的一个Opener,通过Handler处理器来构建Opener实现Cookies处理,代理设置,密码设置等

Opener的方法包括:

  • add_handler(handler):添加处理程序到链接中

  • open(url,data=None[,timeout]):打开给定的URL与urlopen()方法相同

  • error(proto,*args):处理给定协议的错误

设置全局后既可以用urlopen()方法, 也可以用opener.open() ,不安装的话只能用opener.open()方法

# 将这个opener设置为全局的opener,之后所有的,不管是opener.open()还是urlopen() 发送请求,都将使用自定义
request.install_opener(opener)
resp = request.urlopen(url)
1、密码验证:HTTPBasicAuthHandler和ProxyBasicAuthHandler

HTTPPasswordMgrWithDefaultRealm()类创建一个密码管理对象,用来保存HTTP请求相关的用户名和密码,主要应用两个场景:

  • 验证代理授权的用户名和密码(ProxyBasicAuthHandler())

  • 验证web客户端的用户名和密码(HTTPBasicAuthHandler())

在下面的方法中我们还用到了一个新的东西,即request.build_opener()方法,其实urlopen()就是通过构造好了的opener对象发送请求,在这里我们使用request.build_opener()方法重构了一个opener()对象,我们可以通过这个对象实现urlopen()实现的任何东西。

from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
from urllib.error import URLError

username='username'
passowrd='password'
url='http://localhost'
p=HTTPPasswordMgrWithDefaultRealm() #构造密码管理实例
p.add_password(None,url,username,passowrd) #添加用户名和密码到实例中
auth_handler=HTTPBasicAuthHandler(p) #传递密码管理实例构建一个验证实例
opener=build_opener(auth_handler)  #构建一个Opener
try:
    result=opener.open(url)  #打开链接,完成验证,返回的结果是验证后的页面内容
    html=result.read().decode('utf-8')
    print(html)
except URLError as e:
    print(e.reason)
2、设置Proxy代理:ProxyHandler

使用爬虫来爬取数据的时候,如果过于频繁的访问,而且网站还设有限制的话,很有可能会禁封我们的ip地址,这个时候就需要设置代理,来隐藏我们的真实IP。

urllib提供了urllib.request.ProxyHandler()方法可动态的设置代理IP池。将代理IP以字典形式传入该方法,然后通过urllib.reques.build_opener()创建opener对象,用该对象的open()方法向服务器发送请求。

from urllib import request
  
url = 'http://httpbin.org/ip'
proxy = {'http': '218.18.232.26:80', 'https': '218.18.232.26:80'}
proxies = request.ProxyHandler(proxy)  # 创建代理处理器
opener = request.build_opener(proxies)  # 创建opener对象
  
resp = opener.open(url)
print(resp.read().decode())
3、添加Cookie:HTTPCookieProcessor

有时候当我们访问一些网站的时候需要进行翻页或者跳转等其它操作,为了防止无法访问我们想要的数据,需要让网站识别我们是同一个用户。这个时候我们就需要带上cookie进行访问。

在设置cookie的时候由于urllib并没有很好的处理cookie的对象,所以在这里我们需要用到一个别的库,即http库,并使用里面的cookiejar来进行cookie的管理:

CookieJar类关系:CookieJar —-派生—->FileCookieJar —-派生—–>MozillaCookieJar和LWPCookieJar

from http import cookiejar
from urllib import request
  
cookie = cookiejar.CookieJar() # 创建一个cookiejar对象
cookies = request.HTTPCookieProcessor(cookie) # 使用HTTPCookieProcessor创建cookie处理器
opener = request.build_opener(cookies) # 并以它为参数创建Opener对象
resp = opener.open('https://www.baidu.com') # 使用这个opener来发起请求
  
# 查看之前的cookie对象,则可以看到访问百度获得的cookie
for i in cookie:
    print(i)

cookies保存到文件:

1、以Mozilla型浏览器的cookies格式:

cookie=http.cookiejar.MozillaCookieJar(filename=fielname)

import http.cookiejar,urllib.request
fielname='cookies.txt'
cookie=http.cookiejar.MozillaCookieJar(filename=fielname) #创建保存cookie的实例,保存浏览器类型的Mozilla的cookie格式
handler=urllib.request.HTTPCookieProcessor(cookie) #构建一个handler
opener=urllib.request.build_opener(handler) #构建Opener
response=opener.open('http://www.baidu.com') #请求
cookie.save(ignore_discard=True,ignore_expires=True)

从文件中读取cookies:

2、也可以保存为libwww-perl(LWP)格式的Cookies文件

cookie=http.cookiejar.LWPCookieJar(filename=fielname)

import http.cookiejar,urllib.request
#fielname='cookiesLWP.txt'
#cookie=http.cookiejar.LWPCookieJar(filename=fielname) #LWP格式的cookies
cookie=http.cookiejar.LWPCookieJar()
cookie.load('cookiesLWP.txt',ignore_discard=True,ignore_expires=True)

handler=urllib.request.HTTPCookieProcessor(cookie) #构建一个handler
opener=urllib.request.build_opener(handler) #构建Opener
response=opener.open('http://www.baidu.com') #请求
print(response.read().decode('utf-8'))

当然,如果把上面这个生成的opener对象使用install_opener方法来设置为全局的,opener对象之后的每次访问都会带上这个cookie。

4、证书验证

通过添加忽略ssl证书验证关闭证书验证,由于urllib并没有很好的处理ssl的对象,所以在这里我们需要用到一个别的库,即ssl库,如下:

import ssl
from urllib import request
 
context = ssl._create_unverified_context()
res = urllib.request.urlopen(request, context=context)

当你 urllib.urlopen一个 https 的时候会验证一次 SSL 证书,当目标使用的是自签名的证书时就会出现一个URLError,如果是这样可以在开头加上

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

四、urllib.error模块

urllib的error模块定义了由request模块产生的异常,如果出现问题,request模块便会抛出error模块中定义的异常。

在urllib中主要设置了两个异常,一个是URLError,一个是HTTPError,HTTPError是URLError的子类。

1、URLError基类

URLError类来自urllib库的error模块,它继承自OSError类,是error异常模块的基类,由request模块产生的异常都可以通过捕获这个类来处理

它只有一个属性reason,即返回错误的原因

from urllib import request,error

try:
    response=request.urlopen('https://hehe,com/index')
except error.URLError as e:
    print(e.reason)  #如果网页不存在不会抛出异常,而是返回捕获的异常错误的原因(Not Found)

reason如超时则返回一个对象

import socket
import urllib.request
import urllib.error
try:
    response=urllib.request.urlopen('https://www.baidu.com',timeout=0.001)
except urllib.error.URLError as e:
    print(e.reason)
    if isinstance(e.reason,socket.timeout):
        print('time out')

2、HTTPError

它是URLError的子类,专门用来处理HTTP请求错误,比如认证请求失败,它有3个属性:

  • code:返回HTTP的状态码,如404页面不存在,500服务器错误等

  • reason:同父类,返回错误的原因

  • headers:返回请求头

举例:

from urllib import request,error

try:
    response=request.urlopen('http://cuiqingcai.com/index.htm')
except error.HTTPError as e:  #先捕获子类异常
    print(e.reason,e.code,e.headers,sep='\n')
except error.URLError as e:  #再捕获父类异常

    print(e.reason)
else:
    print('request successfully')

五、urllib.robotparser模块

利用urllib的robotparser模块,我们可以实现网站Robots协议的分析

1、Robots协议

也称为爬虫协议、机器人协议,它的全名叫做网络爬虫排除标准(Robots Exclusion Protocol),用来告诉爬虫和搜索引擎哪些网页可以抓取,哪些不可以抓取,它通常是一个robots.txt的文本文件,一般放在网站的根目录下。

当搜索爬虫访问一个站点时,它首先会检查这个站点根目录下是否存在robots.txt文件,如果存在,搜索爬虫会根据其中定义的爬去范围来爬取,如果没有找到,搜索爬虫会访问所有可直接访问的页面

我们来看下robots.txt的样例:

User-agent: *
Disallow: /
Allow: /public/

它实现了对所有搜索爬虫只允许爬取public目录的功能,将上述内容保存为robots.txt文件放在网站根目录下,和网站的入口文件(index.html)放在一起

1、User-agent描述了搜索爬虫的名称,将其设置为*则代表协议对任何爬虫有效,如设置为Baiduspider则代表规则对百度爬虫有效,如果有多条则对多个爬虫受到限制,但至少需要指定一条

一些常见的搜索爬虫名称:

  • BaiduSpider 百度爬虫 www.baidu.com

  • Googlebot Google爬虫 www.google.com

  • 360Spider 360爬虫 www.so.com

  • YodaoBot 有道爬虫 www.youdao.com

  • ia_archiver Alexa爬虫 www.alexa.cn

  • Scooter altavista爬虫 www.altavista.com

2、Disallow指定了不允许抓取的目录,如上例中设置的/则代表不允许抓取所有的页面

3、Allow一般和Disallow一起使用,用来排除单独的某些限制,如上例中设置为/public/则表示所有页面不允许抓取,但可以抓取public目录

设置示例:

#禁止所有爬虫
User-agent: *
Disallow: /

#允许所有爬虫访问任何目录,另外把文件留空也可以
User-agent: *
Disallow:

#禁止所有爬虫访问某那些目录
User-agent: *
Disallow: /home/
Disallow: /tmp/

#只允许某一个爬虫访问
User-agent: BaiduSpider
Disallow:
User-agent: *
Disallow: /

2、rebotparser模块

用来解析robots.txt,该模块提供了一个类RobotFileParser,它可以根据某网站的robots.txt文件来判断一个抓取爬虫时都有权限来抓取这个网页

urllib.robotparser.RobotFileParser(url='')

robotparser类常用的方法:

  • set_url():用来设置robots.txt文件的连接,如果在创建RobotFileParser对象是传入了连接,就不需要在使用这个方法设置了

  • read():读取reobts.txt文件并进行分析,它不会返回任何内容,但执行那个了读取和分析操作

  • parse():用来解析robots.txt文件,传入的参数是robots.txt某些行的内容,并安装语法规则来分析内容

  • can_fetch():该方法传入两个参数,第一个是User-agent,第二个是要抓取的URL,返回的内容是该搜索引擎是否可以抓取这个url,结果为True或False

  • mtime():返回上次抓取和分析robots.txt的时间

  • modified():将当前时间设置为上次抓取和分析robots.txt的时间

from urllib.robotparser import RobotFileParser

rp = RobotFileParser()  #创建对象
rp.set_url('https://www.cnblogs.com/robots.txt') #设置robots.txt连接,也可以在创建对象时指定
rp.read()  #读取和解析文件
print(rp.can_fetch('*','https://i.cnblogs.com/EditPosts.aspx?postid=9170312&update=1')) #判断链接是否可以被抓取

六、urllib3库

urllib3增加了连接池等功能,两者互相都有补充的部分。许多Python的原生系统已经开始使用urllib3。

urllib3提供了很多python标准库urllib里所没有的重要特性:

  • 线程安全

  • 连接池

  • 客户端SSL/TLS验证

  • 文件分部编码上传

  • 协助处理重复请求和HTTP重定位

  • 支持gzip和deflate压缩编码

  • 支持HTTP和SOCKS代理

  • 100%测试覆盖率

urllib3是一个第三方库,pip安装:

pip install urllib3

通过urllib3访问一个网页,那么必须首先构造一个PoolManager对象,然后通过PoolMagent中的request方法或者 urlopen()方法来访问一个网页,两者几乎没有任何区别。

class urllib3.poolmanager.PoolManager(num_pools = 10,headers = None,** connection_pool_kw )

生成一个PoolManager所需要的参数:

  • num_pools 代表了缓存的池的个数,如果访问的个数大于num_pools,将按顺序丢弃最初始的缓存,将缓存的个数维持在池的大小。

  • headers 代表了请求头的信息,如果在初始化PoolManager的时候指定了headers,那么之后每次使用PoolManager来进行访问的时候,都将使用该headers来进行访问。

  • ** connection_pool_kw 是基于connection_pool 来生成的其它设置

当访问网页完成之后,将会返回一个HTTPResponse对象。

使用request()或者urlopen(),获取GET请求的响应内容:

import urllib3

data = json.dumps({'abc': '123'})
http = urllib3.PoolManager(num_pools=5, headers={'User-Agent': 'ABCDE'})
  
resp1 = http.request('GET', 'http://www.baidu.com', body=data)
resp2 = http.urlopen('GET', 'http://www.baidu.com', body=data)
  
print(resp2.data.decode())

使用request()或者urlopen(),进行 POST 请求:

import urllib3
import json
  
data = json.dumps({'abc': '123'})
http = urllib3.PoolManager(num_pools=5, headers={'User-Agent': 'ABCDE'})
  
resp1 = http.request('POST', 'http://www.httpbin.org/post', body=data,timeout=5,retries=5)
#resp2 = http.urlopen('POST', 'http://www.httpbin.org/post', body=data,timeout=5,retries=5)
  
print(resp1.data.decode())

注意事项:urllib3 并没有办法单独设置cookie,所以如果你想使用cookie的话,可以将cookie放入到headers中

1、request()和urlopen()方法的区别:

urlopen()比request()有三个参数是不一样的,你会发现request()具有fields,headers两个参数。所以更多的也就使用 request() 方法了。

推荐使用request()来进行访问的,因为使用request()来进行访问有两点好处,

  • 可以直接进行post请求,不需要将 data参数转换成JSON格式

  • 直接进行GET请求,不需要自己拼接url参数

语法:

  • request(self, method, url, fields=None, headers=None, **urlopen_kw)

  • urlopen(self, method, url, redirect=True, **kw):

2、设置代理:ProxyManager

如果你需要使用代理来访问某个网站的话, 那么你可以使用 ProxyManager 对象来进行设置

def __init__(self, proxy_url, num_pools=10, headers=None,proxy_headers=None, **connection_pool_kw):

ProxyManager和PoolManager的方法基本完全相同。

import urllib3
import json
 
data = {'abc': '123'}
proxy = urllib3.ProxyManager('http://50.233.137.33:80', headers={'connection': 'keep-alive'})
resp1 = proxy.request('POST', 'http://www.httpbin.org/post', fields=data)
print(resp1.data.decode())
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 Python
相关文章 更多
精品专题 更多
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

Mac软件 更多
Shapr3D macOS版
Shapr3D macOS版

Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。

REAPER macOS版
REAPER macOS版

REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。

Ableton Live macOS版
Ableton Live macOS版

Ableton Live 是面向音乐制作人与现场表演者的数字音频工作站,提供编曲视图、独具特色的现场视图、音频录制、MIDI创作、实时变速、乐器及效果器。Mac版原生支持Apple芯片,并可连接音频接口、MIDI控制器和第三方插件。

Adobe After Effects macOS版
Adobe After Effects macOS版

Adobe After Effects 是面向动态图形、影视特效与视频合成的专业创作软件。它提供关键帧动画、遮罩抠像、运动跟踪、三维空间、文字动画和表达式等工具,并可与 Premiere Pro、Photoshop、Illustrator

Adobe Audition macOS版
Adobe Audition macOS版

Adobe Audition 是面向播客、影视后期、音乐制作及内容创作者的专业音频工作站,提供波形精修、多轨录制与混音、频谱编辑、降噪修复、响度匹配和效果处理工具,并可与 Adobe Premiere 协同完成视频声音制作。

Adobe Bridge macOS版
Adobe Bridge macOS版

Adobe Bridge 是面向摄影师、设计师及内容团队的免费数字资产管理工具,可集中预览照片、视频和 Adobe 项目文件,并利用评级、标签、关键词、元数据、筛选与收藏集完成分类检索。它还支持批量重命名、格式导出、相机导入及 Camera

Adobe Illustrator macOS版
Adobe Illustrator macOS版

Adobe Illustrator 是 Adobe 推出的专业矢量图形设计软件,适合在 Mac 上制作标志、图标、插画、包装、信息图及印刷版面。它以路径和锚点构建可无损缩放的图形,并提供钢笔、形状、文字、图像描摹、渐变、画板及生成式功能。

Adobe InDesign macOS版
Adobe InDesign macOS版

Adobe InDesign 是面向印刷品与数字出版物的专业版面设计软件,可在 Mac 上制作书籍、杂志、宣传册、海报、报告及交互式文档。它提供精细的文字样式、网格、母版、长文档管理和印前输出能力。

Adobe Lightroom Classic macOS版
Adobe Lightroom Classic macOS版

Adobe Lightroom Classic 是面向桌面摄影工作流的照片管理与后期处理软件,可将原始照片保存在本地硬盘,通过目录、关键词、评分和收藏夹高效整理图库,并提供 RAW 冲印、蒙版、镜头校正、批量同步及多格式导出等功能。

Adobe Media Encoder macOS版
Adobe Media Encoder macOS版

Adobe Media Encoder 是 Adobe 推出的专业音视频编码与转码工具,可通过队列、预设和监视文件夹批量完成格式转换、代理文件创建及多平台成片输出,并与 Premiere Pro、After Effects 等软件紧密协作。

Adobe Photoshop macOS版
Adobe Photoshop macOS版

Adobe Photoshop 是面向摄影师、设计师和内容创作者的专业图像处理软件,提供图层、蒙版、选区、修复、调色、文字排版、智能对象及生成式编辑等能力。Mac 版支持 Intel 与 Apple Silicon 处理器。

Adobe Premiere Pro macOS版
Adobe Premiere Pro macOS版

Adobe Premiere Pro 是面向专业视频制作的非线性剪辑软件,提供多轨时间线、调色、音频处理、字幕、代理工作流和多格式输出能力,并可与 After Effects、Audition、Photoshop 及 Frame.io 协同

WINDOWS 更多
3dmax(3ds max)
3dmax(3ds max)

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

photoshop
photoshop

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365简体中文
Office 365简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。