Python3 urllib库介绍
Python3的urllib库是python自带的,可以在python document里找到。包含四个模块:
urllib.request,urllib.error,urllib.parse,urllib.robotparser
python2和python3中urllib区别
在python2中,有urllib库和urllib2库;
在python3中,urllib2合并到urllib库中。
Python2 | Python3 |
urllib2 | urllib.request |
urllib2.urlopen() | urllib.request.urlopen() |
urllib2.Request() | urllib.request.Request() |
打开请求urlopen()
- 打开请求
urllib.request.urlopen()
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
|
- 访问简单的网页
import urllib url='http://www.baidu.com' response=urllib.request.urlopen(url) html=response.read().decode(‘utf-8’) # 要decode才能正常显示html内容 fp=open('re.html','wb') #'b' binary mode 用b保存bytes类型。 fp.write(html); |
- 设置超时
timeout参数
import urllib url='http://www.baidu.com' response = urllib.request.urlopen(url, timeout=1) html=response.read() |
构造请求urllib.request.Request
- 构造请求
urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
|
- 构造简单请求Request并打开。
import urllib url='http://www.baidu.com' request=urllib.request.Request(url) response=urllib.request.urlopen(request) fp=open('re.html','wb')#'b' binary mode 用b保存bytes类型。 fp.write(response.read().decode('utf-8')); |
- 仿造浏览器标识。
是修改urllib.request.Request(headers)的headers参数,其是字典对象。
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36'}
import urllib url='http://www.baidu.com' headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36'} request=urllib.request.Request(url,headers=headers) response=urllib.request.urlopen(request) fp=open('re.html','wb')#'b' binary mode 用b保存bytes类型。 fp.write(response.read().decode('utf-8')); |
- 高级用法
- Handler与Opener
当需要使用代理或者Cookies时候,需要使用Handler处理器与OpenDirector,其中OpenDirector实例称为opener。比如urlopen() 这个方法就是 urllib 为我们提供的一个Opener。
Handler包括
ProxyHandler:为请求设置代理 HTTPCookieProcessor:处理 HTTP 请求中的 Cookies HTTPDefaultErrorHandler:处理 HTTP 响应错误。 HTTPRedirectHandler:处理 HTTP 重定向。 HTTPPasswordMgr:用于管理密码,它维护了用户名密码的表。 HTTPBasicAuthHandler:用于登录认证,一般和 HTTPPasswordMgr 结合使用。 |
opener对象是由 build_opener(handler) 方法来创建出来,再使用 install_opener(opener)方法,即先创建再安装。
注意:install_opener 实例化会得到一个全局的 opener 对象。
- 使用代理ProxyHandler
import urllib url='http://ip.cip.cc'#这个网站直接返回访问者IP,如果代理成功则是代理IP #仿造浏览器标识 headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36' } #使用代理 IPandPort='116.209.53.230:9999' proxy_handler=urllib.request.ProxyHandler({ 'http': 'HTTP://'+IPandPort, 'https': 'HTTP://'+IPandPort }) opener = urllib.request.build_opener(proxy_handler) urllib.request.install_opener(opener) #构建请求 request=urllib.request.Request(url,headers=headers) #打开请求 response=urllib.request.urlopen(request,timeout=6) print(response.read().decode('utf-8')) |
- 认证登录
用账号和密码进行登录网站,不同网站认证不一样。
- Cookies设置
不同网站不一样。略
HTTPResponse对象
使用 urllib.request.urlopen() 或者opener.open(url) 返回结果是一个 http.client.HTTPResponse 对象。
它具有 msg、version、status、reason、debuglevel、closed等属性以及read()、readinto()、getheader(name)、getheaders()、fileno()等函数。
- 异常处理
- 错误处理
使用urllib.error来接收urllib.request产生的异常。urllib.error有两个方法:urllib.erro.URLError和urllib.erro.HTTPError。
如果在urllib.request产生异常时,用HTTPError和URLError一起捕获异常,那么需要将HTTPError放在URLError的前面,因为HTTPError是URLError的一个子类。如果URLError放在前面,出现HTTP异常会先响应URLError,这样HTTPError就捕获不到错误信息了。
URLError | 它具有一个属性reason,即返回错误的原因。 | |
HTTPError | 专门处理 HTTP 和 HTTPS 请求的错误 | 1、code:HTTP 请求返回的状态码。 2、reason:与父类用法一样,表示返回错误的原因。 3、headers`:HTTP 请求返回的响应头信息。 |
from urllib import request,error try: response = request.urlopen('http://www.google.com') except error.HTTPError as e: print(e.code,'\n',e.reason,'\n',e.headers) print('\n****************\n') except error.URLError as eu: print(eu.reason) |
作者的其他回答:
这篇服务器的使用经验帮助了近千人,简明实用,阐述到位。值得你花几分钟看一下。
自己拥有一台服务器可以做哪些很酷的事情 阿里云域名注册与备案、服务器ECS购买与登录
服务器建立个人网站,看看这个,少走弯路不买错,堪称完美避坑指南。
阿里云服务器快速建网站 (安装BT宝塔面板和wordpress)
朋友们都点赞的服务器选购指南,5分钟看一遍,能节约你4小时选购时间。
还有好十几篇这么优秀的经验分享,都收在我个人回答里,关注我,你将获得不一样的经验。
阿里云推荐
架设个人博客网站、企业门户都可以使用ECS。如果其网站如个人博客主要面向国内用户访问,为加快速度还是建议选用国内的服务器商。
[阿里云域名] (https://wanwang.aliyun.com/domain/com/?userCode=yos4xyvp)连接,
[阿里云服务器ECS] (https://www.aliyun.com/minisite/goods?userCode=yos4xyvp) 链接
为什么选择阿里云
- 以前域名注册一般选老牌域名服务商,其中万网已经被阿里收购到旗下了。
- 提供域名备案服务。备案业务还是很贴心的。提交完备案信息之后,第二天阿里云小姐姐会帮你免费形式审查一下,还会主动打电话过来帮助校正。如果是自己动手提交备案信息给ICP备案机构,万一因为低级错误被驳回就浪费了十天左右时间。
- 域名ICP备案需要服务器,阿里云也提供服务器购买,一条龙服务嘛。服务器在阿里云毕竟服务器才是支出大头,域名什么的都是小意思了。而且购买完服务器之后,还会有客服主动打电话过来询问使用情况,需不需要技术支持,还是挺不错的。
- 阿里云服务器购买新用户有优惠,最基础的话一年下来不超过100元。如果是本科生的话免费使用的。
- 备案完成之前,服务器不算租赁时间。比如说3月1日我购买了一年的服务器,域名提交备案。18日域名备案审核通过。服务器租赁时间重新按18日算起,即可以用到第二年3月18日。相当于免费多用几天。占了一点小便宜。