Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan modul klien HTTP Python urllib dan urllib3

Cara menggunakan modul klien HTTP Python urllib dan urllib3

王林
王林ke hadapan
2023-05-20 19:58:231817semak imbas

1. urllib

Ikhtisar:

urllib ialah pustaka standard rasmi untuk meminta sambungan url dalam Python Walaupun anda memasang python, pustaka ini boleh digunakan secara langsung meliputi fungsi permintaan rangkaian asas. Dalam Python2, mereka terutamanya urllib dan urllib2, dan dalam Python3, mereka disepadukan ke dalam urllib.

Dalam Python3 Modul permintaan http digunakan untuk mensimulasikan permintaan penghantaran urllib2urllib

    urllib.error: Modul pengendalian pengecualian, jika ralat berlaku, pengecualian ini boleh ditangkap
  • urllib .parse: Modul alat yang menyediakan banyak kaedah pemprosesan URL, seperti: pemisahan, penghuraian, penggabungan, dll.
  • urllib. robotparser: digunakan terutamanya untuk mengenal pasti fail robots.txt tapak web, Kemudian tentukan tapak web mana yang boleh dirangkak
  • 2. modul urllib.parse
  • Ia menyokong pemprosesan URL daripada protokol berikut: fail, ftp, gopher, hdl, http, https, imap, mailto,mms,news,nntp,prospero,rsync,rtsp,rtspu,sftp,sip,sip,snews,svn,snv+ssh,telnet ,wais

  • 1. urlparse(), urlunparse() : Menghuraikan rentetan url menjadi tuple

Sintaks: urllib.parse.urlparse(urlstring,scheme='',allow_fragments =Benar)

boleh melepasi 3 Parameter

urlstring: URL untuk dihuraikan, rentetan

    skim: Ia adalah protokol lalai, seperti http atau https, jika URL bukan Dengan protokol http, anda boleh menentukannya melalui skema Jika protokol http dinyatakan dalam URL, ia akan berkuat kuasa dalam URL
  • skema (protokol), netloc (nama domain), laluan (path), param (parameter), pertanyaan (keadaan pertanyaan), serpihan (anchor)
  • 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类型的元组对象,可以通过属性或者索引来获取值
  • Bertentangan dengan urlparse(), urlunparse menerima objek lelaran dalam bentuk senarai atau tuple untuk melaksanakan pembinaan 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 >
  • Serupa dengan kaedah urlparse(), ia akan mengembalikan 5 bahagian, tetapi menggabungkan param ke dalam laluan.
  • 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

    Serupa dengan urlunparse(), ia juga merupakan kaedah menggabungkan pelbagai bahagian pautan ke dalam pautan lengkap Parameter yang dihantar juga merupakan objek yang boleh diubah, seperti senarai nenek moyang, dll. Satu-satunya perbezaan ialah bahawa panjangnya mestilah 5 , ia menghilangkan 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(): rentetan pertanyaan dan penukaran jenis kamus

urlencode() menghubungkan pasangan nilai kunci dalam dict dengan penyambung & bahagi. urlencode() berguna apabila membina parameter permintaan GET, yang boleh menukar data permintaan jenis kamus kepada pengekodan URL

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

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

parse_qs() hanyalah bertentangan dengan urlencode(), ia digunakan Penyahserialisasian , seperti menukar parameter GET kembali kepada format kamus

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 petikan(), unquote(): pengekodan dan penyahkodan URL

petikan: pemprosesan pengekodan URL, kaedah ini boleh Kandungan ditukar kepada. Format berkod URL.

Jika parameter mengandungi kod Cina dan lain-lain kod bukan ASCII, kadangkala ia akan menyebabkan aksara bercelaru Dalam kes ini, gunakan kaedah ini untuk menukar aksara Cina kepada pengekodan 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

nyah petikan(url). : Pemprosesan Penyahkodan URL, bertentangan dengan petikan(), aksara khas pada URL dipulihkan

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: menggabungkan nama domain akar url dan url baharu menjadi url lengkap

format: urljoin(baseurl,newurl,allowFrag=None)

Membina URL lengkap dengan menggabungkan URL asas (asas) dengan URL lain (url) Ia akan menggunakan komponen URL asas, protokol (schemm), nama domain ( netloc), laluan, untuk menyediakan bahagian yang hilang dalam URL, dan akhirnya mengembalikan hasilnya.

base_url menyediakan tiga item, skema, netloc, dan laluan Jika ketiga-tiga item ini tidak wujud dalam pautan baharu, ia akan ditambah Jika pautan baharu itu wujud, bahagian pautan baharu akan digunakan params dalam base_url , pertanyaan dan serpihan tidak mempunyai kesan.

Penghuraian pautan, penyambungan dan penjanaan boleh dicapai melalui kaedah 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>

3. modul urllib.request

1.

urlretrieve(url,filename,reporthook,data)

Jika anda tidak menulis nama fail laluan, ia akan disimpan sebagai fail sementara Anda boleh menggunakan urllib.urlcleanup() untuk membersihkan cache

file_name = urllib.request.urlretrieve(&#39;http://www.baidu.com&#39;,&#39;%s/baidu.html&#39;%BASE_DIR)

2. kaedah membuka url dan mengembalikan objek fail, dan kemudian anda boleh melakukan operasi yang serupa dengan objek fail

Fungsi yang paling biasa digunakan dalam modul ialah urlopen():

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

Parameternya ialah seperti berikut:

url: URL permintaan, jenis str atau objek permintaan

data: data yang akan dihantar kepada pelayan, parameter data adalah pilihan, dan kandungan dalam format pengekodan strim bait adalah jenis bait Jika parameter data diluluskan, urlopen akan menggunakan kaedah Pos untuk meminta.

masa tamat: Tetapkan tamat masa akses tapak web dalam beberapa saat Jika permintaan melebihi masa yang ditetapkan dan belum menerima respons, pengecualian akan dilemparkan Menyokong permintaan HTTP, HTTPS dan FTP .

Parameter lain: parameter konteks, yang mestilah jenis ssl.SSLContext, digunakan untuk menentukan tetapan SSL Selain itu, kedua-dua parameter cafile dan capath masing-masing menentukan sijil CA dan laluannya . Akan digunakan untuk pautan 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())

    Atas ialah kandungan terperinci Cara menggunakan modul klien HTTP Python urllib dan urllib3. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam