requests

Python标准库中提供了:urllib等模块以供Http请求,但是,它的 API 太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。

  1. # 发送get请求
  2. import urllib.request
  3.  
  4. f = urllib.request.urlopen('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')
  5. result = f.read().decode('utf-8')
  1. # 发送携带请求头的GET请求
  2. import urllib.request
  3.  
  4. req = urllib.request.Request('http://www.example.com/')
  5. req.add_header('Referer', 'http://www.python.org/')
  6. r = urllib.request.urlopen(req)
  7.  
  8. result = f.read().decode('utf-8')

注:更多见Python官方文档:https://docs.python.org/3.5/library/urllib.request.html#module-urllib.request

Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。

安装模块

  1. pip3 install requests

使用模块

  1. # 1、无参数实例
  2.  
  3. import requests
  4.  
  5. ret = requests.get('https://github.com/timeline.json')
  6.  
  7. print(ret.url)
  8. print(ret.text)
  9.  
  10. # 2、有参数实例
  11.  
  12. import requests
  13.  
  14. payload = {'key1': 'value1', 'key2': 'value2'}
  15. ret = requests.get("http://httpbin.org/get", params=payload)
  16.  
  17. print(ret.url)
  18. print(ret.text)
  19.  
  20. GET请求
  1. # 1、基本POST实例
  2.  
  3. import requests
  4.  
  5. payload = {'key1': 'value1', 'key2': 'value2'}
  6. ret = requests.post("http://httpbin.org/post", data=payload)
  7.  
  8. print(ret.text)
  9.  
  10. # 2、发送请求头和数据实例
  11.  
  12. import requests
  13. import json
  14.  
  15. url = 'https://api.github.com/some/endpoint'
  16. payload = {'some': 'data'}
  17. headers = {'content-type': 'application/json'}
  18.  
  19. ret = requests.post(url, data=json.dumps(payload), headers=headers)
  20.  
  21. print(ret.text)
  22. print(ret.cookies)
  23.  
  24. POST请求
  1. requests.get(url, params=None, **kwargs)
  2. requests.post(url, data=None, json=None, **kwargs)
  3. requests.put(url, data=None, **kwargs)
  4. requests.head(url, **kwargs)
  5. requests.delete(url, **kwargs)
  6. requests.patch(url, data=None, **kwargs)
  7. requests.options(url, **kwargs)
  8.  
  9. # 以上方法均是在此方法的基础上构建
  10. requests.request(method, url, **kwargs)
  11.  
  12. 其他请求

更多requests模块相关的文档见:http://cn.python-requests.org/zh_CN/latest/

Http请求和XML实例

实例:检测QQ账号是否在线

  1. import urllib
  2. import requests
  3. from xml.etree import ElementTree as ET
  4.  
  5. # 使用内置模块urllib发送HTTP请求,或者XML格式内容
  6. """
  7. f = urllib.request.urlopen('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')
  8. result = f.read().decode('utf-8')
  9. """
  10.  
  11. # 使用第三方模块requests发送HTTP请求,或者XML格式内容
  12. r = requests.get('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')
  13. result = r.text
  14.  
  15. # 解析XML格式内容
  16. node = ET.XML(result)
  17.  
  18. # 获取内容
  19. if node.text == "Y":
  20. print("在线")
  21. else:
  22. print("离线")

实例:查看火车停靠信息

  1. import urllib
  2. import requests
  3. from xml.etree import ElementTree as ET
  4.  
  5. # 使用内置模块urllib发送HTTP请求,或者XML格式内容
  6. """
  7. f = urllib.request.urlopen('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=')
  8. result = f.read().decode('utf-8')
  9. """
  10.  
  11. # 使用第三方模块requests发送HTTP请求,或者XML格式内容
  12. r = requests.get('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=')
  13. result = r.text
  14.  
  15. # 解析XML格式内容
  16. root = ET.XML(result)
  17. for node in root.iter('TrainDetailInfo'):
  18. print(node.find('TrainStation').text,node.find('StartTime').text,node.tag,node.attrib)

注:更多接口猛击这里

logging

用于便捷记录日志且线程安全的模块

1单文件日志

  1. import logging
  2.   
  3.   
  4. logging.basicConfig(filename='log.log',
  5.                     format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
  6.                     datefmt='%Y-%m-%d %H:%M:%S %p',
  7.                     level=10)
  8.   
  9. logging.debug('debug')
  10. logging.info('info')
  11. logging.warning('warning')
  12. logging.error('error')
  13. logging.critical('critical')
  14. logging.log(10,'log')

日志等级:

  1. CRITICAL = 50
  2. FATAL = CRITICAL
  3. ERROR = 40
  4. WARNING = 30
  5. WARN = WARNING
  6. INFO = 20
  7. DEBUG = 10
  8. NOTSET = 0

注:只有【当前写等级】大于【日志等级】时,日志文件才被记录。

日志记录格式:

2 多文件日志

对于上述记录日志的功能,只能将日志记录在单文件中,如果想要设置多个日志文件,logging.basicConfig将无法完成,需要自定义文件和日志操作对象。

  1. # 定义文件
  2. file_1_1 = logging.FileHandler('l1_1.log', 'a')
  3. fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")
  4. file_1_1.setFormatter(fmt)
  5.  
  6. file_1_2 = logging.FileHandler('l1_2.log', 'a')
  7. fmt = logging.Formatter()
  8. file_1_2.setFormatter(fmt)
  9.  
  10. # 定义日志
  11. logger1 = logging.Logger('s1', level=logging.ERROR)
  12. logger1.addHandler(file_1_1)
  13. logger1.addHandler(file_1_2)
  14.  
  15. # 写日志
  16. logger1.critical('')
  17.  
  18. 日志(一)
  1. # 定义文件
  2. file_2_1 = logging.FileHandler('l2_1.log', 'a')
  3. fmt = logging.Formatter()
  4. file_2_1.setFormatter(fmt)
  5.  
  6. # 定义日志
  7. logger2 = logging.Logger('s2', level=logging.INFO)
  8. logger2.addHandler(file_2_1)
  9.  
  10. 日志(二)

如上述创建的两个日志对象

  • 当使用【logger1】写日志时,会将相应的内容写入 l1_1.log 和 l1_2.log 文件中
  • 当使用【logger2】写日志时,会将相应的内容写入 l2_1.log 文件中

系统命令subprocess

执行shell命令的相关模块和函数有:

  • os.system
  • os.spawn*
  • os.popen*          --废弃
  • popen2.*           --废弃
  • commands.*      --废弃,3.x中被移除
  1. import commands
  2.  
  3. result = commands.getoutput('cmd')
  4. result = commands.getstatus('cmd')
  5. result = commands.getstatusoutput('cmd')

以上执行shell命令的相关的模块和函数的功能均在 subprocess 模块中实现,并提供了更丰富的功能。

call 

执行命令,返回状态码

  1. ret = subprocess.call(["ls", "-l"], shell=False)
  2. ret = subprocess.call("ls -l", shell=True)

  

check_call

执行命令,如果执行状态码是 0 ,则返回0,否则抛异常

  1. subprocess.check_call(["ls", "-l"])
  2. subprocess.check_call("exit 1", shell=True)

  

check_output

执行命令,如果状态码是 0 ,则返回执行结果,否则抛异常

  1. subprocess.check_output(["echo", "Hello World!"])
  2. subprocess.check_output("exit 1", shell=True)

  

subprocess.Popen(...)

用于执行复杂的系统命令

参数:

  • args:shell命令,可以是字符串或者序列类型(如:list,元组)
  • bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲
  • stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
  • preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
  • close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。
    所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
  • shell:同上
  • cwd:用于设置子进程的当前目录
  • env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
  • universal_newlines:不同系统的换行符不同,True -> 同意使用 \n
  • startupinfo与createionflags只在windows下有效
    将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等
  1. # 执行普通命令
  2. import subprocess
  3. ret1 = subprocess.Popen(["mkdir","t1"])
  4. ret2 = subprocess.Popen("mkdir t2", shell=True)

终端输入的命令分为两种:

  • 输入即可得到输出,如:ifconfig
  • 输入进行某环境,依赖再输入,如:python
  1. import subprocess
  2.  
  3. obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',)
  1. import subprocess
  2.  
  3. obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
  4. obj.stdin.write("print(1)\n")
  5. obj.stdin.write("print(2)")
  6. obj.stdin.close()
  7.  
  8. cmd_out = obj.stdout.read()
  9. obj.stdout.close()
  10. cmd_error = obj.stderr.read()
  11. obj.stderr.close()
  12.  
  13. print(cmd_out)
  14. print(cmd_error)
  1. import subprocess
  2.  
  3. obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
  4. obj.stdin.write("print(1)\n")
  5. obj.stdin.write("print(2)")
  6.  
  7. out_error_list = obj.communicate()
  8. print(out_error_list)
  1. import subprocess
  2.  
  3. obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
  4. out_error_list = obj.communicate('print("hello")')
  5. print(out_error_list)

shutil

高级的 文件、文件夹、压缩包 处理模块

shutil.copyfileobj(fsrc, fdst[, length])

将文件内容拷贝到另一个文件中

  1. import shutil
  2.  
  3. shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))

  

shutil.copyfile(src, dst)
拷贝文件

  1. shutil.copyfile('f1.log', 'f2.log')

  

shutil.copymode(src, dst)
仅拷贝权限。内容、组、用户均不变

  1. shutil.copymode('f1.log', 'f2.log')

  

shutil.copystat(src, dst)
拷贝状态的信息,包括:mode bits, atime, mtime, flags

  1. shutil.copystat('f1.log', 'f2.log')

  

shutil.copy(src, dst)
拷贝文件和权限

  1. shutil.copy('f1.log', 'f2.log')

  

shutil.copy2(src, dst)
拷贝文件和状态信息

  1. shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))

  

shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)
递归的去拷贝文件夹

  1. shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
  1. import shutil
  2.  
  3. shutil.copytree('f1', 'f2', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
shutil.rmtree(path[, ignore_errors[, onerror]])

递归的去删除文件

  1. shutil.rmtree('folder1')

  

shutil.move(src, dst)
递归的去移动文件,它类似mv命令,其实就是重命名。

  1. shutil.move('folder1', 'folder3')

 

shutil.make_archive(base_name, format,...)

创建压缩包并返回文件路径,例如:zip、tar

创建压缩包并返回文件路径,例如:zip、tar

  • base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
    如:www                        =>保存至当前路径
    如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/
  • format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
  • root_dir: 要压缩的文件夹路径(默认当前目录)
  • owner: 用户,默认当前用户
  • group: 组,默认当前组
  • logger: 用于记录日志,通常是logging.Logger对象
  1. #将 /Users/wupeiqi/Downloads/test 下的文件打包放置当前程序目录
  2. import shutil
  3. ret = shutil.make_archive("wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test')
  4.  
  5. #将 /Users/wupeiqi/Downloads/test 下的文件打包放置 /Users/wupeiqi/目录
  6. import shutil
  7. ret = shutil.make_archive("/Users/wupeiqi/wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test')

  

shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:

  1. import zipfile
  2.  
  3. # 压缩
  4. z = zipfile.ZipFile('laxi.zip', 'w')
  5. z.write('a.log')
  6. z.write('data.data')
  7. z.close()
  8.  
  9. # 解压
  10. z = zipfile.ZipFile('laxi.zip', 'r')
  11. z.extractall()
  12. z.close()
  13.  
  14. zipfile解压缩

zipfile解压缩

  1. import tarfile
  2.  
  3. # 压缩
  4. tar = tarfile.open('your.tar','w')
  5. tar.add('/Users/wupeiqi/PycharmProjects/bbs2.log', arcname='bbs2.log')
  6. tar.add('/Users/wupeiqi/PycharmProjects/cmdb.log', arcname='cmdb.log')
  7. tar.close()
  8.  
  9. # 解压
  10. tar = tarfile.open('your.tar','r')
  11. tar.extractall() # 可设置解压地址
  12. tar.close()
  13.  
  14. tarfile解压缩

tarfile解压缩

练习题:

1、通过HTTP请求和XML实现获取电视节目

API:http://www.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx

2、通过HTTP请求和JSON实现获取天气状况

API:http://wthrcdn.etouch.cn/weather_mini?city=北京

[Python笔记]第十篇:模块续的更多相关文章

  1. [Python笔记]第八篇:模块

    本篇主要内容:python常用模块用法介绍 什么是模块 模块,用一大段代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性 ...

  2. Python 学习 第十篇 CMDB用户权限管理

    Python 学习 第十篇 CMDB用户权限管理 2016-10-10 16:29:17 标签: python 版权声明:原创作品,谢绝转载!否则将追究法律责任. 不管是什么系统,用户权限都是至关重要 ...

  3. Python:笔记(2)——函数与模块

    Python:笔记(2)——函数与模块 Python函数 关于函数 1.我们可以使用Help来查看函数的帮助信息 2.调用函数的时候,如果传入的参数数量或者类型不符合均会报错. 3.函数名其实就是一个 ...

  4. Python基础笔记系列十:模块

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 模块 #1.类比于java中的jar包,模块能让你能够有逻辑地组织你的Py ...

  5. python运维开发(六)----模块续

    内容目录 反射 模块 os模块 sys模块 md5加密模块 re正则匹配模块 configparse模块 xml模块 shutil模块 subprocess模块 反射 利用字符串的形式去对象(模块)中 ...

  6. Python基础(十)-模块

    模块初识 一般把不同功能代码放到不同py文件,一个py文件就是一个模块 三种模块库: 1.Python标准库 2.第三方库 3.自定义库 导入模块:import 库名 (Python解释器只认识执行文 ...

  7. python基础学习十 logging模块详细使用【转载】

    很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,主要用于输出 ...

  8. [Python笔记]第十六篇:web框架之Tornado

    Tornado是一个基于python的web框架,xxxxx 安装 python -m pip install tornado 第一个Tornado程序 安装完毕我们就可以新建一个app.py文件,放 ...

  9. Python笔记(二十九)_模块

    模块 在Python中,一个.py文件就是一个模块 if __name__ == '__main__':所有模块都有一个 __name__ 属性,__name__ 的值取决于如何应用模块 run当前文 ...

随机推荐

  1. Java---实力弹弹球,弹弹弹

    直接上代码了. 微调按钮加画布画几个圆,再实现监听... package cn.hncu.threadDemo.thread2; import java.awt.Canvas; import java ...

  2. Redis结合EntityFramework结合使用的操作类

    最近一段时间在研究redis.  各种不懂, 各种问题.也看了N多的资料. 最终参照着  张占岭 的博客  http://www.cnblogs.com/lori/p/3435483.html   写 ...

  3. lightoj 1063 求割点

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1063 #include<cstdio> #include<cstri ...

  4. zoj 2706 线段树

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1706 trick:关于正数和负数的整除问题,正数整除是自动向下取整的 ...

  5. Django教程:第一个Django应用程序(3)

    Django教程:第一个Django应用程序(3) 2013-10-08 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 #博客: ...

  6. angularJs $injector

    一 angularJS中几种注入方式 Spring中使用构造注入或者设值注入的方式,还需要做一些额外的操作,但是angular中只需要在需要的地方声明一下即可,类似模块的引用,因此十分方便. angu ...

  7. MySQL ERROR 1045错误解决办法

    今天在安装MySQL数据库时,有安装过程中报ERROR 1045错误,网上查了一下,解决方法如下: 1.对于安装过程中该错选择"skip"继续向下安装,完成安装: 2.在MySQL ...

  8. Genymotion开始搞起~

    简介 一:什么是GenymotionGenymotion是一款完全超越BlueStacks的安卓模拟器,正如它中文官网的介绍:快到极致的Android模拟器.英文官网:http://www.genym ...

  9. raw_input() 与 input()的区别

    raw_input和input两个均是 python 的内建函数,通过读取控制台的输入与用户实现交互.但他们的功能不尽相同.下面举两个例子,来说明两者 raw_input和input两个均是 pyth ...

  10. Ubuntu 下 JDK+Tomcat+MySql 环境的搭建

    Linux环境 修改catalina.sh 在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: JAVA_OPTS=&quo ...