Python3 urllib库学习

python3将python2的urllib和urllib2库整合为一个urllib库,由于近期用到了这个库就参考官方文档和网上的资料总结了一下
导入

import urllib

urllib.request

urllib.request.urlopen()

发起一个请求

response = urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) 
# url 要打开的网址,可以是字符串或者是request对象
# data 要发送给服务器的数据(POST方法)
# timeout 网站的访问超时时间,单位为s
# cafile和capath 用于HTTPS请求中,设置CA证书及其路径

返回对象提供的方法

  •     read() , readline() ,readlines() , fileno() , close() :对HTTPResponse类型数据进行操作
    
  •     info():返回HTTPMessage对象,表示远程服务器返回的头信息
    
  •     getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到
    
  •     geturl():返回请求的url
    

返回对象的属性
对于HTTP 和 HTTPS请求

  • status 返回状态码
  • reason 返回状态的详细信息

urllib.request.Request()

使用该方法来返回一个request对象

request = urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
# url 包含网址的字符串
# data 要发送给服务器的数据对象,对于POST请求,要通过urllib.parse.urlencode() 方法进行编码
# header 头部信息,必须为字典类型
# method 请求方法,如果data为None则为GET,否则为POST

头部信息示例

headers = {
     'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                   r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
     'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
     'Connection': 'keep-alive'
  }
  •     User-Agent :这个头部可以携带如下几条信息:浏览器名和版本号、操作系统名和版本号、默认语言
    
  •     Referer:可以用来防止盗链,有一些网站图片显示来源http://***.com,就是检查Referer来鉴定的
    
  •     Connection:表示连接状态,记录Session的状态。
    

也可以通过返回的request对象的 add_header(key, val) 方法来添加header信息

request.add_header('Origin', 'https://passport.weibo.cn')
request.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')
request.add_header('Referer', 'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F')

urllib.request.ProxyHandler()

使用同一个IP去爬取同一个网站上的网页,久了之后会被该网站服务器屏蔽。使用代理服务器。 (使用代理服务器去爬取某个网站的内容的时候,在对方的网站上,显示的不是我们真实的IP地址,而是代理服务器的IP地址)

urllib.request.ProxyHandler(proxies=None)
data = {
        'name': 'zjw',
        'age': 23,
        'gender': 'male'
    }
proxy = request.ProxyHandler({'http': '5.22.195.215:80'})  # 设置proxy
opener = request.build_opener(proxy)  # 挂载opener
request.install_opener(opener)  # 安装opener
data = parse.urlencode(data).encode('utf-8')
page = opener.open(url, data).read()
page = page.decode('utf-8')
return page

urllib.request.urlretrieve()

将远程数据下载到本地,例如下载图片

urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None)
#返回由文件名及头部信息组成的元组(filename, headers)
#url 远程数据的地址
#filename 保存文件的路径,如果为空,则下载为临时文件
#reporthook 钩子函数 连接服务器成功以及每个数据块下载完成时各调用一次,包含3个参数,依次为已经下载的数据块,数据块的大小,总文件的大小,可用于显示下载进度
#data post到服务器的数据   

urllib.parse

urllib.parse.urlencode()

将包含字符串或字节内容的映射对象或二维元组序列转换为ASCII文本字符

urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus)

其转换结果用于POST操作时,还需将其编码为字节

data = {
    'name': 'zjw',
    'age': 23,
    'gender': 'male'
}
data = urllib.parse.urlencode(data).encode('utf-8')
#经编码后结果为 b'name=zjw&age=23&gender=male'
#返回结果需解码
response = request.urlopen(url, data=data).read().decode('utf-8')

urllib.parse.parse_qs()

将返回的query字符串转换为字典

urllib.parse.parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace')
# 例如 {b'name':[b'zjw'],b'age':[b'23'],b'gender':[b'male']}

urllib.parse.parse_qsl()

将返回的query字符串转换为包含二维元组的列表

urllib.parse.parse_qsl(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace')
# 例如 [(b'name',b'zjw'),(b'age',b'23'),(b'gender',b'male')]

urllib.error

错误:

  • urllib.error.URLError

  • urllib.error.HTTPError

  • urllib.error.ContentTooShortError
    当urlretrieve()方法下载数据的大小小于实际期望值时触发该错误

处理:

from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError

req = Request('http://www.python.org/')
try:
  response = urlopen(req)
except HTTPError as e:
  print('The (www.python.org)server could not fulfill the request.')
  print('Error code: ', e.code)
except URLError as e:
  print('We failed to reach a server.')
  print('Reason: ', e.reason)
else:
  print("good!")
  print(response.read().decode("utf8"))

如果觉得这篇文章帮助了您,请打赏一个小红包鼓励作者继续创作哦!!!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值