Python3学习urllib的使用方法示例


Posted in Python onNovember 29, 2017

urllib是python的一个获取url(Uniform Resource Locators,统一资源定址符)了,可以利用它来抓取远程的数据进行保存,本文整理了一些关于urllib使用中的一些关于header,代理,超时,认证,异常处理处理方法。

1.基本方法

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

  1. url:  需要打开的网址
  2. data:Post提交的数据
  3. timeout:设置网站的访问超时时间

直接用urllib.request模块的urlopen()获取页面,page的数据格式为bytes类型,需要decode()解码,转换成str类型。

from urllib import request
response = request.urlopen(r'http://python.org/') # <http.client.HTTPResponse object at 0x00000000048BC908> HTTPResponse类型
page = response.read()
page = page.decode('utf-8')

urlopen返回对象提供方法:

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

1、简单读取网页信息

import urllib.request 
response = urllib.request.urlopen('http://python.org/') 
html = response.read()

2、使用request

urllib.request.Request(url, data=None, headers={}, method=None)

使用request()来包装请求,再通过urlopen()获取页面。

import urllib.request 
req = urllib.request.Request('http://python.org/') 
response = urllib.request.urlopen(req) 
the_page = response.read()

3、发送数据,以登录知乎为例

''''' 
Created on 2016年5月31日 
 
@author: gionee 
''' 
import gzip 
import re 
import urllib.request 
import urllib.parse 
import http.cookiejar 
 
def ungzip(data): 
  try: 
    print("尝试解压缩...") 
    data = gzip.decompress(data) 
    print("解压完毕") 
  except: 
    print("未经压缩,无需解压") 
   
  return data 
     
def getXSRF(data): 
  cer = re.compile('name=\"_xsrf\" value=\"(.*)\"',flags = 0) 
  strlist = cer.findall(data) 
  return strlist[0] 
 
def getOpener(head): 
  # cookies 处理 
  cj = http.cookiejar.CookieJar() 
  pro = urllib.request.HTTPCookieProcessor(cj) 
  opener = urllib.request.build_opener(pro) 
  header = [] 
  for key,value in head.items(): 
    elem = (key,value) 
    header.append(elem) 
  opener.addheaders = header 
  return opener 
# header信息可以通过firebug获得 
header = { 
  'Connection': 'Keep-Alive', 
  'Accept': 'text/html, application/xhtml+xml, */*', 
  'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3', 
  'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0', 
  'Accept-Encoding': 'gzip, deflate', 
  'Host': 'www.zhihu.com', 
  'DNT': '1' 
} 
 
url = 'http://www.zhihu.com/' 
opener = getOpener(header) 
op = opener.open(url) 
data = op.read() 
data = ungzip(data) 
_xsrf = getXSRF(data.decode()) 
 
url += "login/email" 
email = "登录账号" 
password = "登录密码" 
postDict = { 
  '_xsrf': _xsrf, 
  'email': email, 
  'password': password, 
  'rememberme': 'y'  
} 
postData = urllib.parse.urlencode(postDict).encode() 
op = opener.open(url,postData) 
data = op.read() 
data = ungzip(data) 
 
print(data.decode())

4、http错误

import urllib.request 
req = urllib.request.Request('http://www.lz881228.blog.163.com ') 
try: 
  urllib.request.urlopen(req) 
except urllib.error.HTTPError as e: 
print(e.code) 
print(e.read().decode("utf8"))

5、异常处理

from urllib.request import Request, urlopen 
from urllib.error import URLError, HTTPError 
 
req = Request("http://www.abc.com /") 
try: 
  response = urlopen(req) 
except HTTPError as e: 
  print('The server couldn't 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"))

6、http认证

import urllib.request 
 
# create a password manager 
password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm() 
 
# Add the username and password. 
# If we knew the realm, we could use it instead of None. 
top_level_url = "https://3water.com /" 
password_mgr.add_password(None, top_level_url, 'rekfan', 'xxxxxx') 
 
handler = urllib.request.HTTPBasicAuthHandler(password_mgr) 
 
# create "opener" (OpenerDirector instance) 
opener = urllib.request.build_opener(handler) 
 
# use the opener to fetch a URL 
a_url = "https://3water.com /" 
x = opener.open(a_url) 
print(x.read()) 
 
# Install the opener. 
# Now all calls to urllib.request.urlopen use our opener. 
urllib.request.install_opener(opener) 
a = urllib.request.urlopen(a_url).read().decode('utf8') 
 
print(a)

7、使用代理

import urllib.request 
 
proxy_support = urllib.request.ProxyHandler({'sock5': 'localhost:1080'}) 
opener = urllib.request.build_opener(proxy_support) 
urllib.request.install_opener(opener) 
 
a = urllib.request.urlopen("http://www.baidu.com ").read().decode("utf8") 
print(a)

8、超时

import socket 
import urllib.request 
 
# timeout in seconds 
timeout = 2 
socket.setdefaulttimeout(timeout) 
 
# this call to urllib.request.urlopen now uses the default timeout 
# we have set in the socket module 
req = urllib.request.Request('https://3water.com /') 
a = urllib.request.urlopen(req).read() 
print(a)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
CentOS安装pillow报错的解决方法
Jan 27 Python
Python中operator模块的操作符使用示例总结
Jun 28 Python
利用 Monkey 命令操作屏幕快速滑动
Dec 07 Python
利用Python查看目录中的文件示例详解
Aug 28 Python
Python设计模式之门面模式简单示例
Jan 09 Python
Python学习_几种存取xls/xlsx文件的方法总结
May 03 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
Dec 18 Python
Python实现的简单线性回归算法实例分析
Dec 26 Python
django中使用Celery 布式任务队列过程详解
Jul 29 Python
Python 使用threading+Queue实现线程池示例
Dec 21 Python
python实现ssh及sftp功能(实例代码)
Mar 16 Python
python自动化八大定位元素讲解
Jul 09 Python
Python实现的选择排序算法示例
Nov 29 #Python
Python实现的桶排序算法示例
Nov 29 #Python
[原创]教女朋友学Python(一)运行环境搭建
Nov 29 #Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
Nov 29 #Python
基于Python函数的作用域规则和闭包(详解)
Nov 29 #Python
JSONLINT:python的json数据验证库实例解析
Nov 28 #Python
详解如何使用Python编写vim插件
Nov 28 #Python
You might like
php 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
2010/06/03 PHP
深入PHP5中的魔术方法详解
2013/06/17 PHP
详解WordPress开发中的get_post与get_posts函数使用
2016/01/04 PHP
PHP编写简单的App接口
2016/08/28 PHP
tbody元素支持嵌套的注意方法
2007/03/24 Javascript
Script的加载方法小结
2011/01/12 Javascript
JavaScript自定义事件介绍
2013/08/29 Javascript
JS实现判断滚动条滚到页面底部并执行事件的方法
2014/12/18 Javascript
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
jQuery使用toggleClass方法动态添加删除Class样式的方法
2015/03/26 Javascript
JQuery中Bind()事件用法分析
2015/05/05 Javascript
JavaScript事件详细讲解
2016/06/27 Javascript
运用js教你轻松制作html音乐播放器
2020/04/17 Javascript
Angular中实现树形结构视图实例代码
2017/05/05 Javascript
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
2018/03/19 Javascript
[46:00]Ti4 冒泡赛第二轮LGD vs C9 2
2014/07/14 DOTA
记录Django开发心得
2014/07/16 Python
python实现通过代理服务器访问远程url的方法
2015/04/29 Python
基于进程内通讯的python聊天室实现方法
2015/06/28 Python
python3 实现验证码图片切割的方法
2018/12/07 Python
python读取并定位excel数据坐标系详解
2019/06/26 Python
python+numpy实现的基本矩阵操作示例
2019/07/19 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
HTML5 WebGL 实现民航客机飞行监控系统
2019/07/25 HTML / CSS
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
幼儿园教师教学反思
2014/02/06 职场文书
致1500米运动员广播稿
2014/02/07 职场文书
租房协议书
2014/04/10 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
2016高一新生军训心得体会
2016/01/11 职场文书
MySQL窗口函数的具体使用
2021/11/17 MySQL