目录
一、urllib
概述:
二、urllib.parse模块
1、urlparse()、urlunparse():将url字符串解析成元组
2、urlsplit()、urlunsplit():URL分割与组合
3、urlencode()、parse_qs():查询字符串与字典类型转换
4、quote()、unquote():URL编码与解码
5、urljoin():将url的根域名和新url拼合成一个完整的url
三、urllib.request模块
1、urlretrieve():下载url到html文件。
2、urlopen():打开一个url的方法,返回一个文件对象,然后可以进行类似文件对象的操作
1、urlopen的方法:
2、for循环读取
3、GET请求
4、POST请求
5、请求头参数模拟
3、urllib.request的高级类
1、密码验证:HTTPBasicAuthHandler和ProxyBasicAuthHandler
2、设置Proxy代理:ProxyHandler
3、添加Cookie:HTTPCookieProcessor
4、证书验证
四、urllib.error模块
1、URLError基类
2、HTTPError
五、urllib.robotparser模块
1、Robots协议
2、rebotparser模块
六、urllib3库
1、request()和urlopen()方法的区别:
2、设置代理:ProxyManager
首页 后端开发 Python教程 Python的HTTP客户端模块urllib与urllib3怎么使用

Python的HTTP客户端模块urllib与urllib3怎么使用

May 20, 2023 pm 07:58 PM
python http urllib

一、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)
# 输出:<a href="http://www.baidu.com/index.html" rel="external nofollow"   target="_blank">http://www.baidu.com/index.html</a>
登录后复制

三、urllib.request模块

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

urlretrieve(url,filename,reporthook,data)
登录后复制

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

file_name = urllib.request.urlretrieve(&#39;http://www.baidu.com&#39;,&#39;%s/baidu.html&#39;%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(&#39;http://www.baidu.com&#39;)
print(req.read().decode())
print(req.getheaders())  # 以列表元祖对的形式返回响应头信息
print(req.getheader(&#39;Content-Type&#39;))  # 返回响应头中的Content-Type值
print(req.info())  # 返回网页的头信息
print(req.info()[&#39;Content-Type&#39;])  # 返回响应头中的Content-Type值
登录后复制
2、for循环读取

不需要使用read()方法 。

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

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

import urllib.request
import urllib.parse

dic = {&#39;name&#39;:&#39;melon&#39;,&#39;age&#39;:18}
data = urllib.parse.urlencode(dic)

req = urllib.request.urlopen(&#39;http://127.0.0.1:8000/index?%s&#39;%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 = {&#39;name&#39;:&#39;melon&#39;,&#39;age&#39;:18}
data = urllib.parse.urlencode(dic)

req = urllib.request.Request(&#39;http://127.0.0.1:8000/index&#39;, 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=&#39;http://httpbin.org/post&#39;
headers={
     &#39;User-Agent&#39;:&#39;Mozilla/5.0 (compatible; MSIE 5.5; Windows NT)&#39;,
     &#39;Host&#39;:&#39;httpbin.org&#39;
 }  #定义头信息

dict={&#39;name&#39;:&#39;germey&#39;}

data = bytes(parse.urlencode(dict),encoding=&#39;utf-8&#39;)
req = request.Request(url=url,data=data,headers=headers,method=&#39;POST&#39;)
#req.add_header(&#39;User-Agent&#39;,&#39;Mozilla/5.0 (compatible; MSIE 8.4; Windows NT&#39;) #也可以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=&#39;username&#39;
passowrd=&#39;password&#39;
url=&#39;http://localhost&#39;
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(&#39;utf-8&#39;)
    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 = &#39;http://httpbin.org/ip&#39;
proxy = {&#39;http&#39;: &#39;218.18.232.26:80&#39;, &#39;https&#39;: &#39;218.18.232.26:80&#39;}
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(&#39;https://www.baidu.com&#39;) # 使用这个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=&#39;cookies.txt&#39;
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(&#39;http://www.baidu.com&#39;) #请求
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=&#39;cookiesLWP.txt&#39;
#cookie=http.cookiejar.LWPCookieJar(filename=fielname) #LWP格式的cookies
cookie=http.cookiejar.LWPCookieJar()
cookie.load(&#39;cookiesLWP.txt&#39;,ignore_discard=True,ignore_expires=True)

handler=urllib.request.HTTPCookieProcessor(cookie) #构建一个handler
opener=urllib.request.build_opener(handler) #构建Opener
response=opener.open(&#39;http://www.baidu.com&#39;) #请求
print(response.read().decode(&#39;utf-8&#39;))
登录后复制

当然,如果把上面这个生成的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(&#39;https://hehe,com/index&#39;)
except error.URLError as e:
    print(e.reason)  #如果网页不存在不会抛出异常,而是返回捕获的异常错误的原因(Not Found)
登录后复制

reason如超时则返回一个对象

import socket
import urllib.request
import urllib.error
try:
    response=urllib.request.urlopen(&#39;https://www.baidu.com&#39;,timeout=0.001)
except urllib.error.URLError as e:
    print(e.reason)
    if isinstance(e.reason,socket.timeout):
        print(&#39;time out&#39;)
登录后复制

2、HTTPError

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

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

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

  • headers:返回请求头

举例:

from urllib import request,error

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

    print(e.reason)
else:
    print(&#39;request successfully&#39;)
登录后复制

五、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=&#39;&#39;)
登录后复制

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(&#39;https://www.cnblogs.com/robots.txt&#39;) #设置robots.txt连接,也可以在创建对象时指定
rp.read()  #读取和解析文件
print(rp.can_fetch(&#39;*&#39;,&#39;https://i.cnblogs.com/EditPosts.aspx?postid=9170312&update=1&#39;)) #判断链接是否可以被抓取
登录后复制

六、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({&#39;abc&#39;: &#39;123&#39;})
http = urllib3.PoolManager(num_pools=5, headers={&#39;User-Agent&#39;: &#39;ABCDE&#39;})
  
resp1 = http.request(&#39;GET&#39;, &#39;http://www.baidu.com&#39;, body=data)
resp2 = http.urlopen(&#39;GET&#39;, &#39;http://www.baidu.com&#39;, body=data)
  
print(resp2.data.decode())
登录后复制

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

import urllib3
import json
  
data = json.dumps({&#39;abc&#39;: &#39;123&#39;})
http = urllib3.PoolManager(num_pools=5, headers={&#39;User-Agent&#39;: &#39;ABCDE&#39;})
  
resp1 = http.request(&#39;POST&#39;, &#39;http://www.httpbin.org/post&#39;, body=data,timeout=5,retries=5)
#resp2 = http.urlopen(&#39;POST&#39;, &#39;http://www.httpbin.org/post&#39;, 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 = {&#39;abc&#39;: &#39;123&#39;}
proxy = urllib3.ProxyManager(&#39;http://50.233.137.33:80&#39;, headers={&#39;connection&#39;: &#39;keep-alive&#39;})
resp1 = proxy.request(&#39;POST&#39;, &#39;http://www.httpbin.org/post&#39;, fields=data)
print(resp1.data.decode())
登录后复制

以上是Python的HTTP客户端模块urllib与urllib3怎么使用的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PHP和Python:解释了不同的范例 PHP和Python:解释了不同的范例 Apr 18, 2025 am 12:26 AM

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

在PHP和Python之间进行选择:指南 在PHP和Python之间进行选择:指南 Apr 18, 2025 am 12:24 AM

PHP适合网页开发和快速原型开发,Python适用于数据科学和机器学习。1.PHP用于动态网页开发,语法简单,适合快速开发。2.Python语法简洁,适用于多领域,库生态系统强大。

Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

vscode怎么在终端运行程序 vscode怎么在终端运行程序 Apr 15, 2025 pm 06:42 PM

在 VS Code 中,可以通过以下步骤在终端运行程序:准备代码和打开集成终端确保代码目录与终端工作目录一致根据编程语言选择运行命令(如 Python 的 python your_file_name.py)检查是否成功运行并解决错误利用调试器提升调试效率

vs code 可以在 Windows 8 中运行吗 vs code 可以在 Windows 8 中运行吗 Apr 15, 2025 pm 07:24 PM

VS Code可以在Windows 8上运行,但体验可能不佳。首先确保系统已更新到最新补丁,然后下载与系统架构匹配的VS Code安装包,按照提示安装。安装后,注意某些扩展程序可能与Windows 8不兼容,需要寻找替代扩展或在虚拟机中使用更新的Windows系统。安装必要的扩展,检查是否正常工作。尽管VS Code在Windows 8上可行,但建议升级到更新的Windows系统以获得更好的开发体验和安全保障。

PHP和Python:深入了解他们的历史 PHP和Python:深入了解他们的历史 Apr 18, 2025 am 12:25 AM

PHP起源于1994年,由RasmusLerdorf开发,最初用于跟踪网站访问者,逐渐演变为服务器端脚本语言,广泛应用于网页开发。Python由GuidovanRossum于1980年代末开发,1991年首次发布,强调代码可读性和简洁性,适用于科学计算、数据分析等领域。

vscode 扩展是否是恶意的 vscode 扩展是否是恶意的 Apr 15, 2025 pm 07:57 PM

VS Code 扩展存在恶意风险,例如隐藏恶意代码、利用漏洞、伪装成合法扩展。识别恶意扩展的方法包括:检查发布者、阅读评论、检查代码、谨慎安装。安全措施还包括:安全意识、良好习惯、定期更新和杀毒软件。

visual studio code 可以用于 python 吗 visual studio code 可以用于 python 吗 Apr 15, 2025 pm 08:18 PM

VS Code 可用于编写 Python,并提供许多功能,使其成为开发 Python 应用程序的理想工具。它允许用户:安装 Python 扩展,以获得代码补全、语法高亮和调试等功能。使用调试器逐步跟踪代码,查找和修复错误。集成 Git,进行版本控制。使用代码格式化工具,保持代码一致性。使用 Linting 工具,提前发现潜在问题。

See all articles