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 相关文章推荐
全面解析Python的While循环语句的使用方法
Oct 13 Python
Python编写登陆接口的方法
Jul 10 Python
Python时间戳使用和相互转换详解
Dec 11 Python
python绘制散点图并标记序号的方法
Dec 11 Python
python截取两个单词之间的内容方法
Dec 25 Python
python 实现敏感词过滤的方法
Jan 21 Python
Pycharm远程调试原理及具体配置详解
Aug 08 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
Feb 17 Python
python同时遍历两个list用法说明
May 02 Python
Python如何在循环内使用list.remove()
Jun 01 Python
Django mysqlclient安装和使用详解
Sep 17 Python
Python 制作自动化翻译工具
Apr 25 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开发框架总结收藏
2008/04/24 PHP
使用PHP实现下载CSS文件中的图片
2015/12/06 PHP
基于CI框架的微信网页授权库示例
2016/11/25 PHP
jQuery 学习入门篇附实例代码
2010/03/16 Javascript
Javascript 中的 &amp;&amp; 和 || 使用小结
2010/04/25 Javascript
Javascript算符的优先级介绍
2013/03/20 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
AngularJS  ng-table插件设置排序
2016/09/21 Javascript
Nodejs 获取时间加手机标识的32位标识实现代码
2017/03/07 NodeJs
JavaScript实现的斑马线表格效果【隔行变色】
2017/09/18 Javascript
代码详解JS操作剪贴板
2018/02/11 Javascript
Angular 如何使用第三方库的方法
2018/04/18 Javascript
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
2018/11/15 Javascript
JavaScript时间与时间戳的转换操作实例分析
2018/12/07 Javascript
Node.js事件的正确使用方法
2019/04/05 Javascript
layui框架与SSM前后台交互的方法
2019/09/12 Javascript
Angular封装表单控件及思想总结
2019/12/11 Javascript
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
python中实现数组和列表读取一列的方法
2018/04/03 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
python计算波峰波谷值的方法(极值点)
2020/02/18 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
Eagle Eyes Optics鹰眼光学:高性能太阳镜
2018/12/07 全球购物
安德玛加拿大官网:Under Armour加拿大
2019/10/02 全球购物
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
意大利包包和行李箱销售网站:Bagaglio.it
2021/03/02 全球购物
一套比较完整的软件测试人员面试题
2012/05/13 面试题
实习教师自我鉴定
2013/12/09 职场文书
《雨霖铃》教学反思
2014/02/22 职场文书
乡镇领导班子批评与自我批评材料
2014/09/23 职场文书
大学运动会加油稿200字(5篇)
2014/09/27 职场文书
2014年标准化工作总结
2014/12/17 职场文书
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android