python urllib和urllib3包

urllib.request

urllib当中使用最多的模块,涉及请求,响应,浏览器模拟,代理,cookie等功能。

1. 快速请求

urlopen返回对象提供一些基本方法:

  • read 返回文本数据
  • info 服务器返回的头信息
  • getcode 状态码
  • geturl 请求的url

request.urlopen(url, data=None, timeout=10)
#url:  需要打开的网址
#data:Post提交的数据
#timeout:设置网站的访问超时时间

from urllib import request
import ssl
# 解决某些环境下报<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
ssl._create_default_https_context = ssl._create_unverified_context
url = ‘https://www.jianshu.com‘
#返回<http.client.HTTPResponse object at 0x0000000002E34550>
response = request.urlopen(url, data=None, timeout=10)
#直接用urllib.request模块的urlopen()获取页面,page的数据格式为bytes类型,需要decode()解码,转换成str类型。
page = response.read().decode(‘utf-8‘)

2.模拟PC浏览器和手机浏览器

需要添加headers头信息,urlopen不支持,需要使用Request

PC

import urllib.request

url = ‘https://www.jianshu.com‘
# 增加header
headers = {
‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36‘
}
request = urllib.request.Request(url,headers=headers)
response = urllib.request.urlopen(request)
#在urllib里面 判断是get请求还是post请求,就是判断是否提交了data参数
print(request.get_method())

>> 输出结果
GET

手机

req = request.Request(‘http://www.douban.com/‘)
req.add_header(‘User-Agent‘, ‘Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) ‘
                             ‘AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25‘)
with request.urlopen(req) as f:
    print(‘Status:‘, f.status, f.reason)
    for k, v in f.getheaders():
        print(‘%s: %s‘ % (k, v))
    print(‘Data:‘, f.read().decode(‘utf-8‘))

3.Cookie的使用

客户端用于记录用户身份,维持登录信息

import http.cookiejar, urllib.request

# 1 创建CookieJar对象
cookie = http.cookiejar.CookieJar()
# 使用HTTPCookieProcessor创建cookie处理器,
handler = urllib.request.HTTPCookieProcessor(cookie)
# 构建opener对象
opener = urllib.request.build_opener(handler)
# 将opener安装为全局
urllib.request.install_opener(opener)
data = urllib.request.urlopen(url)

# 2 保存cookie为文本
import http.cookiejar, urllib.request
filename = "cookie.txt"
# 保存类型有很多种
## 类型1
cookie = http.cookiejar.MozillaCookieJar(filename)
## 类型2
cookie = http.cookiejar.LWPCookieJar(filename)

# 使用相应的方法读取
cookie = http.cookiejar.LWPCookieJar()
cookie.load(‘cookie.txt‘,ignore_discard=True,ignore_expires=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
……

4.设置代理

当需要抓取的网站设置了访问限制,这时就需要用到代理来抓取数据。

import urllib.request

url = ‘http://httpbin.org/ip‘
proxy = {‘http‘:‘39.134.108.89:8080‘,‘https‘:‘39.134.108.89:8080‘}
proxies = urllib.request.ProxyHandler(proxy) # 创建代理处理器
opener = urllib.request.build_opener(proxies,urllib.request.HTTPHandler) # 创建特定的opener对象
urllib.request.install_opener(opener) # 安装全局的opener 把urlopen也变成特定的opener
data = urllib.request.urlopen(url)
print(data.read().decode())

回到顶部

urllib.error

urllib.error可以接收有urllib.request产生的异常。urllib.error中常用的有两个方法,URLError和HTTPError。URLError是OSError的一个子类,

HTTPError是URLError的一个子类,服务器上HTTP的响应会返回一个状态码,根据这个HTTP状态码,我们可以知道我们的访问是否成功。

URLError

URLError产生原因一般是:网络无法连接、服务器不存在等。

例如访问一个不存在的url

import urllib.error
import urllib.request
requset = urllib.request.Request(‘http://www.usahfkjashfj.com/‘)
try:
    urllib.request.urlopen(requset).read()
except urllib.error.URLError as e:
    print(e.reason)
else:
    print(‘success‘)

>> print结果
[Errno 11004] getaddrinfo failed

HTTPError

HTTPError是URLError的子类,在你利用URLopen方法发出一个请求时,服务器上都会对应一个应答对象response,其中他包含一个数字“状态码”,

例如response是一个重定向,需定位到别的地址获取文档,urllib将对此进行处理。其他不能处理的,URLopen会产生一个HTTPError,对应相应的状态码,

HTTP状态码表示HTTP协议所返回的响应的状态。

from urllib import request, error
    try:
        response = request.urlopen(‘http://cuiqingcai.com/index.htm‘)
    except error.URLError as e:
        print(e.reason)

    # 先捕获子类错误
    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‘)

>> print结果

Not Found

-------------
Not Found
404
Server: nginx/1.10.3 (Ubuntu)
Date: Thu, 08 Feb 2018 14:45:39 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Vary: Cookie
Expires: Wed, 11 Jan 1984 05:00:00 GMT

回到顶部

urllib.parse

urllib.parse.urljoin 拼接url

基于一个base URL和另一个URL构造一个绝对URL,url必须为一致站点,否则后面参数会覆盖前面的host

print(parse.urljoin(‘https://www.jianshu.com/xyz‘,‘FAQ.html‘))
print(parse.urljoin(‘http://www.baidu.com/about.html‘,‘http://www.baidu.com/FAQ.html‘))

>>结果
https://www.jianshu.com/FAQ.html
http://www.baidu.com/FAQ.html

urllib.parse.urlencode 字典转字符串

from urllib import request, parse
url = r‘https://www.jianshu.com/collections/20f7f4031550/mark_viewed.json‘
headers = {
    ‘User-Agent‘: r‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36‘,
    ‘Referer‘: r‘https://www.jianshu.com/c/20f7f4031550?utm_medium=index-collections&utm_source=desktop‘,
    ‘Connection‘: ‘keep-alive‘
}
data = {
    ‘uuid‘: ‘5a9a30b5-3259-4fa0-ab1f-be647dbeb08a‘,
}
#Post的数据必须是bytes或者iterable of bytes,不能是str,因此需要进行encode()编码
data = parse.urlencode(data).encode(‘utf-8‘)
print(data)
req = request.Request(url, headers=headers, data=data)
page = request.urlopen(req).read()
page = page.decode(‘utf-8‘)
print(page)

>>结果
b‘uuid=5a9a30b5-3259-4fa0-ab1f-be647dbeb08a‘
{"message":"success"}

urllib.parse.quote url编码

urllib.parse.unquote url解码

Url的编码格式采用的是ASCII码,而不是Unicode,比如

http://so.biquge.la/cse/search?s=7138806708853866527&q=%CD%EA%C3%C0%CA%C0%BD%E7

from urllib import parse

x = parse.quote(‘山西‘, encoding=‘gb18030‘)# encoding=‘GBK
print(x)  #%C9%BD%CE%F7

city = parse.unquote(‘%E5%B1%B1%E8%A5%BF‘,)  # encoding=‘utf-8‘
print(city)  # 山西

urllib3包

Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库,许多Python的原生系统已经开始使用urllib3。Urllib3提供了很多python标准库里所没有的重要特性:

1.线程安全
2.连接池
3.客户端SSL/TLS验证
4.文件分部编码上传
5.协助处理重复请求和HTTP重定位
6.支持压缩编码
7.支持HTTP和SOCKS代理

安装:

Urllib3 能通过pip来安装:

$pip install urllib3

你也可以在github上下载最新的源码,解压之后进行安装:

$git clone git://github.com/shazow/urllib3.git

$python setup.py install

urllib3的使用:

request GET请求

import urllib3
import requests
#  忽略警告:InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised.
requests.packages.urllib3.disable_warnings()
# 一个PoolManager实例来生成请求, 由该实例对象处理与线程池的连接以及线程安全的所有细节
http = urllib3.PoolManager()
# 通过request()方法创建一个请求:
r = http.request(‘GET‘, ‘http://cuiqingcai.com/‘)
print(r.status) # 200
# 获得html源码,utf-8解码
print(r.data.decode())

request GET请求(添加数据)

 header = {
        ‘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‘
    }
    r = http.request(‘GET‘,
             ‘https://www.baidu.com/s?‘,
             fields={‘wd‘: ‘hello‘},
             headers=header)
    print(r.status) # 200
    print(r.data.decode())

post请求

  #你还可以通过request()方法向请求(request)中添加一些其他信息,如:
    header = {
        ‘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‘
    }
    r = http.request(‘POST‘,
                     ‘http://httpbin.org/post‘,
                     fields={‘hello‘:‘world‘},
                     headers=header)
    print(r.data.decode())

# 对于POST和PUT请求(request),需要手动对传入数据进行编码,然后加在URL之后:
encode_arg = urllib.parse.urlencode({‘arg‘: ‘我的‘})
print(encode_arg.encode())
r = http.request(‘POST‘,
                 ‘http://httpbin.org/post?‘+encode_arg,
                 headers=header)
# unicode解码

print(r.data.decode(‘unicode_escape‘))

发送json数据

#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‘))

上传文件

#使用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‘))

使用Timeout

#使用timeout,可以控制请求的运行时间。在一些简单的应用中,可以将timeout参数设置为一个浮点数:
r = http.request(‘POST‘,
                 ‘http://httpbin.org/post‘,timeout=3.0)

print(r.data.decode(‘utf-8‘))

#让所有的request都遵循一个timeout,可以将timeout参数定义在PoolManager中:
http = urllib3.PoolManager(timeout=3.0)

对重试和重定向进行控制

#通过设置retries参数对重试进行控制。Urllib3默认进行3次请求重试,并进行3次方向改变。
r = http.request(‘GET‘,
                 ‘http://httpbin.org/ip‘,retries=5)#请求重试的次数为5

print(r.data.decode(‘utf-8‘))
##关闭请求重试(retrying request)及重定向(redirect)只要将retries定义为False即可:
r = http.request(‘GET‘,
                 ‘http://httpbin.org/redirect/1‘,retries=False,redirect=False)
print(‘d1‘,r.data.decode(‘utf-8‘))
#关闭重定向(redirect)但保持重试(retrying request),将redirect参数定义为False即可
r = http.request(‘GET‘,
                 ‘http://httpbin.org/redirect/1‘,redirect=False)

原文地址:https://www.cnblogs.com/jiangzhaowei/p/9063442.html

时间: 2024-10-01 11:43:55

python urllib和urllib3包的相关文章

python中urllib, urllib2,urllib3, httplib,httplib2, request的区别

permike原文python中urllib, urllib2,urllib3, httplib,httplib2, request的区别 若只使用python3.X, 下面可以不看了, 记住有个urllib的库就行了 python2.X 有这些库名可用: urllib, urllib2, urllib3, httplib, httplib2, requests python3.X 有这些库名可用: urllib, urllib3, httplib2, requests 两者都有的urllib3

Python网络请求urllib和urllib3详解

Python网络请求urllib和urllib3详解 urllib是Python中请求url连接的官方标准库,在Python2中主要为urllib和urllib2,在Python3中整合成了urllib. 而urllib3则是增加了连接池等功能,两者互相都有补充的部分. urllib urllib作为Python的标准库,基本上涵盖了基础的网络请求功能. urllib.request urllib中,request这个模块主要负责构造和发起网络请求,并在其中加入Headers.Proxy等. 发

python urllib库

python2和python3中的urllib urllib提供了一个高级的 Web 通信库,支持基本的 Web 协议,如 HTTP.FTP 和 Gopher 协议,同时也支持对本地文件的访问. 具体来说,urllib 模块的功能是利用前面介绍的协议来从因特网.局域网.本地主机上下载数据. 使用这个模块就无须用到 httplib.ftplib和 gopherlib 这些模块了,除非需要用到更低层的功能. Python 2 中有 urlib.urlparse.urllib2,以及其他内容.在 Py

python+pcap+dpkt 抓包小实例

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 """ 网络数据包捕获与分析程序 """ 5 6 import pcap 7 import dpkt 8 import json 9 import re 10 import time 11 from urllib import unquote 12 13 # 过滤输出目标ip 14 dst_lists = [ 15 '203.66.1.21

Python标准库 (pickle包,cPickle包)

在之前对Python对象的介绍中 (面向对象的基本概念,面向对象的进一步拓展),我提到过Python"一切皆对象"的哲学,在Python中,无论是变量还是函数,都是一个对象.当Python运行时,对象存储在内存中,随时等待系统的调用.然而,内存里的数据会随着计算机关机和消失,如何将对象保存到文件,并储存在硬盘上呢? 计算机的内存中存储的是二进制的序列 (当然,在Linux眼中,是文本流).我们可以直接将某个对象所对应位置的数据抓取下来,转换成文本流 (这个过程叫做serialize),

python 深入模块和包

模块可以包含可执行语句以及函数的定义. 这些语句通常用于初始化模块. 它们只在 第一次 导入时执行.只在第一次导入的时候执行,第一次.妈蛋的第一次...后面再次导入就不执行了. [1](如果文件以脚本的方式执行,它们也会运行.) 每个模块都有自己的私有符号表, 模块内定义的所有函数用其作为全局符号表. 被导入的模块的名字放在导入模块的全局符号表中. import 语句的一个变体直接从被导入的模块中导入名字到导入模块的符号表中. 例如: >>> >>> from fibo

命令行执行python模块时提示包找不到的问题

庄稼人不是专职python开发的道友,虽然与python相识已多年,可惜相识不相知,只是偶尔借助pydev写一些简单的小工具. 多年来,一直困惑于这样一个问题:同样的工程,同样的代码,使用pydev可以运行任意一个python脚本,而使用命令行运行却不行?命令行下(或者双击执行)总是提示"ImportError: No module named xxx"?pydev究竟做了什么魔术呢? 长话短说,以上面工程为例,如果是在命令行中直接执行 python c.py , 都会提示"

Python:urllib和urllib2的区别(转)

原文链接:http://www.cnblogs.com/yuxc/ 作为一个Python菜鸟,之前一直懵懂于urllib和urllib2,以为2是1的升级版.今天看到老外写的一篇<Python: difference between urllib and urllib2>才明白其中的区别. You might be intrigued by the existence of two separate URL modules in Python -urllib and urllib2. Even

【python】浅谈包

python中的包可以理解为模块的集合.每个包也既可以为单包也可以有多个小包组成. Python中的package定义很简单,其层次结构与目录的层次结构相同,但是每个package必须包含一个__init__.py的文件,__init__.py可以为空文件,只要它存在,就表明此目录应被作为一个package处理. 整个包的目录结构如下: package/  ##包的目录 __init__.py ##包含的__init__.py文件 add_sub/    ##小包目录 __init__.py #