赞
踩
https://www.zhihu.com/question/24590883
Awesome Python中文版来啦!
本文由 伯乐在线 - 艾凌风 翻译,Namco 校稿。未经许可,禁止转载!
英文出处:github.com。欢迎加入翻译组。
----------------
这又是一个 Awesome XXX 系列的资源整理,由 vinta 发起和维护。内容包括:Web框架、网络爬虫、网络内容提取、模板引擎、数据库、数据可视化、图片处理、文本处理、自然语言处理、机器学习、日志、代码分析等。
伯乐在线已在 GitHub 上发起「Python 资源大全中文版」的整理。欢迎扩散、欢迎加入。
GitHub - jobbole/awesome-python-cn: Python资源大全中文版
环境管理管理 Python 版本和环境的工具
管理包和依赖的工具。
本地 PyPI 仓库服务和代理。
打包为可执行文件以便分发。
将源码编译成软件。
交互式 Python 解析器。
文件管理和 MIME(多用途的网际邮件扩充协议)类型检测。
操作日期和时间的类库。
用于解析和操作文本的库。
一些用来解析和操作特殊文本格式的库。
用来处理人类语言的库。
用以生成项目文档的库。
用来保存和解析配置的库。
用于创建命令行程序的库。
用来进行下载的库.
用来操作图像的库.
光学字符识别库。
用来操作音频的库
用来操作视频和GIF的库。
地理编码地址以及用来处理经纬度的库。
使用HTTP的库。
Python实现的数据库。
用来连接和操作数据库的库。
实现对象关系映射或数据映射技术的库。
全栈 web 框架。
允许或拒绝用户访问数据或功能的库。
内容管理系统
用于电子商务以及支付的框架和库。
用来开发RESTful APIs的库
实现验证方案的库。
模板生成和词法解析的库和工具。
处理事件以及任务队列的库。
对数据进行索引和执行搜索查询的库和软件。
用来创建用户活动的库。
管理、压缩、缩小网站资源的工具。
缓存数据的库。
用来发送和解析电子邮件的库。
用来进行国际化的库。
URL处理解析URLs的库
处理 HTML和XML的库。
爬取网络站点的库
用于进行网页内容提取的库。
进行表单操作的库。
数据验证库。多用于表单验证。
帮助你和电子垃圾进行战斗的库。
用来进行标记的库。
管理界面库。
静态站点生成器是一个软件,它把文本和模板作为输入,然后输出HTML文件。
操作系统进程启动及通信库。
用以进行并发和并行操作的库。
用于网络编程的库。
帮助使用WebSocket的库。
兼容 WSGI 的 web 服务器
兼容 RPC 的服务器。
用来创建图形用户界面程序的库。
超赞的游戏开发库。
用来生成和操作日志的库。
进行代码库测试和生成测试数据的库。
进行代码分析,解析和操作代码库的库和工具。
用来进行代码调试的库。
用来进行科学计算和数据分析的库。
进行数据可视化的库。 参见: awesome-javascript。
计算机视觉库。
机器学习机器学习库。 参见: awesome-machine-learning.
MapReduce 框架和库。
使用 Python 进行函数式编程。
用来访问第三方 API的库。 参见: List of Python API Wrappers and Libraries。
用于 DevOps 的软件和库。
任务调度库。
使用外来函数接口的库。
让 Python 更快的库。
在 Windows 平台上进行 Python 编程。
用来进行网络可视化和SDN(软件定义网络)的工具和库。
用来对硬件进行编程的库。
帮助从 Python 2 向 Python 3迁移的库。
不属于上面任何一个类别,但是非常有用的库。
Python 实现的算法和设计模式。
编辑器和 IDE 的插件
流行的 Python 集成开发环境。
在线工具和简化开发的 API 。
持续集成参见: awesome-CIandCD.
在这里可以找到新的 Python 库。
网站伯乐在线已在 GitHub 上发起「Python 资源大全中文版」的整理。欢迎扩散、欢迎加入。
轮子哥
的回答虽然是个玩笑(urllib、urlib2、urllib3),但是,也确实反映出了Python标准库的混乱。就我个人的使用感受来说,Python和Python标准库在数据结构方面非常强大,但是,在网络和邮件这两块,设计得非常糟糕。正是由于标准库的不完美,才有了更多更好的开源项目。对于Python程序员来说,可谓是"失之东隅,收之桑榆"。重要的是我们要善于发现并使用这些项目。下面就给大家推荐几个我用过的,并且特别好用的项目,而不是简单的贴一下awesome python。相信很多人看完awesome python以后,只是简单的收藏一下,并没有很多帮助。
1. yagmail
Python官网上发邮件的例子( Examples - Python 2.7.13 documentation),大家感受一下。反正我看到这一堆的import就已经被吓退场了。- #!/usr/bin/env python
-
- """Send the contents of a directory as a MIME message."""
-
- import os
- import sys
- import smtplib
- # For guessing MIME type based on file name extension
- import mimetypes
-
- from optparse import OptionParser
-
- from email import encoders
- from email.message import Message
- from email.mime.audio import MIMEAudio
- from email.mime.base import MIMEBase
- from email.mime.image import MIMEImage
- from email.mime.multipart import MIMEMultipart
- from email.mime.text import MIMEText
- import yagmail
- yag = yagmail.SMTP(user='joy_lmx@163.com', password='nicai?', host='smtp.163.com', port='25')
- yag.send(user, subject = "I now can send an attachment", attachments=['a.txt', 'b.jpg'])
2. requests
requests很多人都推荐过了,不过可能一些同学感受不到requests到底好在哪里。我们就以官网的例子为例简单说明,在没有request之前,如果我们要请求https://api.github.com/user,需要像下面这样:
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
-
- import urllib2
-
- gh_url = 'https://api.github.com'
-
- req = urllib2.Request(gh_url)
-
- password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
- password_manager.add_password(None, gh_url, 'user', 'pass')
-
- auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)
- opener = urllib2.build_opener(auth_manager)
-
- urllib2.install_opener(opener)
-
- handler = urllib2.urlopen(req)
-
- print handler.getcode()
- print handler.headers.getheader('content-type')
-
- # ------
- # 200
- # 'application/json'
- >>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
- >>> r.status_code
- 200
- >>> r.headers['content-type']
- 'application/json; charset=utf8'
- >>> r.encoding
- 'utf-8'
- >>> r.text
- u'{"type":"User"...'
- >>> r.json()
- {u'private_gists': 419, u'total_private_repos': 77, ...}
3. psutil
psutil是用来获取操作系统监控以及进程管理的,如果你正在写一个监控系统(或脚本),赶紧去试试。这么说吧,我曾经使用psutil把网易内部的一个监控模块,从1000+行重构到了100+行。
我这里推荐的几个库,可能yagmail对最多人有用。而psutil,对专业的人士最有用。如果你要写一个监控系统,不使用psutil的话,只能直接去/proc目录下读取想用的文件进行计算,或者执行iostat、vmstat、df等linux命令获取命令输出,不管哪一种方法,都要处理很多繁琐的细节。有了psutil以后,就轻松多了。贴段代码大家感受一下:- def get_network_info(self):
- """
- psutil.net_io_counters()
- snetio(bytes_sent=12541464, bytes_recv=21459989, packets_sent=80164, packets_recv=88134, errin=0, errout=0,
- dropin=0, dropout=0)
- """
- return psutil.net_io_counters()
-
- def get_memory_used(self):
- """
- psutil.virtual_memory()
- svmem(total=4159041536, available=3723980800, percent=10.5, used=1599082496,
- free=2559959040, active=587403264, inactive=897105920, buffers=95989760, cached=1068032000)
- """
- memory_info = psutil.virtual_memory()
- memory_used = ( memory_info.total * memory_info.percent / 100 ) / 1024 / 1024
- return memory_used
此外,使用越来越广泛的监控工具glances(如果没用过,要不现在就是试试?),就是用psutil收集相关数据的。
4. BeautifulSoup
如果你写爬虫,还在用XPath解析HTML,那赶紧用用BeautifulSoup,比XPath好用一百倍;如果你还在用正则表达式从HTML中获取内容,BeautifulSoup能让你好用到哭。(补充:评论里大家都说XPath更好用,难道是我思维方式和大家不一样?)
BeautifulSoup是用来解析HTML的,特点就是好用,有人吐槽BeautifulSoup慢?我不在乎BeautifulSoup比XPath慢多少,我只知道,我的时间比机器的更宝贵。
例如,要找到页面中所有的links,如下所示:- from bs4 import BeautifulSoup
- soup = BeautifulSoup(open("index.html"))
- for link in soup.find_all('a'):
- print(link.get('href'))
- <div class="zm-profile-card zm-profile-section-item zg-clear no-hovercard">
- .......
- <a title="天雨白" data-hovercard="p$t$tian-yu-bai" class="zm-item-link-avatar" href="/people/tian-yu-bai">
- </a>
- .......
- </div>
- soup = BeautifulSoup(text)
- #通过属性找到这个div,对于每个用户,对应于这样一个div
- items = soup.find_all('div', class_="zm-profile-card zm-profile-section-item zg-clear no-hovercard")
- for item in items:
- # 获取这个div下的<a>标签的title属性
- name = item.a.attrs['title']
- # 获取这个div下的<a>标签下的<img>标签里面的src属性
- avatar = item.a.img.attrs['src']
有了BeautifulSoup以后,爬虫操作就变得特别简单了。脏活累活别人都帮忙做好了。
5. utils
除了开源的库以外,还有些开源项目的DataStruct.py helper.py utils.py文件,也值得看一看。里面很多好东西,都是可以直接拿过来用的。
- # -*- coding: utf-8 -*-
-
- """
- requests.structures
- ~~~~~~~~~~~~~~~~~~~
-
- Data structures that power Requests.
-
- """
-
-
- class CaseInsensitiveDict(dict):
- """Case-insensitive Dictionary
-
- For example, ``headers['content-encoding']`` will return the
- value of a ``'Content-Encoding'`` response header."""
- """
- 1. low_keys是一个字典,key是dict中key的消息形式,大写是dict中的key
- 2. 如果对字典进行了修改操作,则清空low_keys
- 3. 获取字典时,通过get --> __getitem__ --> __contains__ -->
- 通过low_keys字典获取到真实的key,通过真实的key获取dict中的value
- """
-
- @property
- def lower_keys(self):
- if not hasattr(self, '_lower_keys') or not self._lower_keys:
- self._lower_keys = dict((k.lower(), k) for k in self.iterkeys())
- return self._lower_keys
-
- def _clear_lower_keys(self):
- if hasattr(self, '_lower_keys'):
- self._lower_keys.clear()
-
- def __setitem__(self, key, value):
- dict.__setitem__(self, key, value)
- self._clear_lower_keys()
-
- def __delitem__(self, key):
- dict.__delitem__(self, key)
- self._lower_keys.clear()
-
- def __contains__(self, key):
- return key.lower() in self.lower_keys
-
- def __getitem__(self, key):
- # We allow fall-through here, so values default to None
- if key in self:
- return dict.__getitem__(self, self.lower_keys[key.lower()])
-
- def get(self, key, default=None):
- if key in self:
- return self[key]
- else:
- return default
-
- def main():
- d = CaseInsensitiveDict()
- d['Laimingxing'] = 'Laimingxing'
- d['LAimingxing'] = 'LAimingxing'
- print d
- print d['LAimingxing']
-
- if __name__ == '__main__':
- main()
- def dictreverse(mapping):
- """
- Returns a new dictionary with keys and values swapped.
-
- >>> dictreverse({1: 2, 3: 4})
- {2: 1, 4: 3}
- """
- return dict([(value, key) for (key, value) in iteritems(mapping)])
-
- def dictfind(dictionary, element):
- """
- Returns a key whose value in `dictionary` is `element`
- or, if none exists, None.
-
- >>> d = {1:2, 3:4}
- >>> dictfind(d, 4)
- 3
- >>> dictfind(d, 5)
- """
- for (key, value) in iteritems(dictionary):
- if element is value:
- return key
-
- class Storage(dict):
- """
- A Storage object is like a dictionary except `obj.foo` can be used
- in addition to `obj['foo']`.
-
- >>> o = storage(a=1)
- >>> o.a
- 1
- >>> o['a']
- 1
- >>> o.a = 2
- >>> o['a']
- 2
- >>> del o.a
- >>> o.a
- Traceback (most recent call last):
- ...
- AttributeError: 'a'
-
- """
- def __getattr__(self, key):
- try:
- return self[key]
- except KeyError as k:
- raise AttributeError(k)
-
- def __setattr__(self, key, value):
- self[key] = value
-
- def __delattr__(self, key):
- try:
- del self[key]
- except KeyError as k:
- raise AttributeError(k)
-
- def __repr__(self):
- return '<Storage ' + dict.__repr__(self) + '>'
ps:web.py的作者是亚伦·斯沃茨(Aaron Swartz),一位年少成名的计算机天才,著名社交网站Reddit联合创始人。致力于网络信息开放,却因涉嫌非法侵入麻省理工学院(MIT)和JSTOR(全称Journal Storage,存储学术期刊的在线系统)被指控,将受到最高35年监禁和100万美元罚款。该案正在认罪辩诉阶段,而亚伦·斯沃茨却于2013年1月11日在其纽约布鲁克林的寓所内,用一根皮带上吊自杀,尸体随后被女友发现,年仅26岁。
当然,我这还有很多乱七八糟的好东西,如果大家感兴趣的话,我再补充吧。要学Python看这里:乐岸教育Python公开课-在线播放-优酷网,视频高清在线观看
此外,大家反馈,这个回答也对大家很有帮助: 怎么样才算是精通 Python?除bug神器pyrasite-shell,“Give it a pid, get a shell”。给一个运行中的Python进程ID就能提供这个进程内的Python REPL,无需重启/修改代码。
通常的情景是:服务器不响应了->日志信息不够->找出服务器pid->用pyrasite-shell连上去->打印stack/打印变量/干掉卡住的线程->Profit!
(知道这个包后我再也不用Python处理敏感信息了233)调试和逆向工程
- Scapy, Scapy3k: 发送,嗅探,分析和伪造网络数据包。可用作交互式包处理程序或单独作为一个库。
- pypcap, Pcapy, pylibpcap: 几个不同 libpcap 捆绑的python库
- libdnet: 低级网络路由,包括端口查看和以太网帧的转发
- dpkt: 快速,轻量数据包创建和分析,面向基本的 TCP/IP 协议
- Impacket: 伪造和解码网络数据包,支持高级协议如 NMB 和 SMB
- pynids: libnids 封装提供网络嗅探,IP 包碎片重组,TCP 流重组和端口扫描侦查
- Dirtbags py-pcap: 无需 libpcap 库支持读取 pcap 文件
- flowgrep: 通过正则表达式查找数据包中的 Payloads
- Knock Subdomain Scan: 通过字典枚举目标子域名
- SubBrute: 快速的子域名枚举工具
- Mallory: 可扩展的 TCP/UDP 中间人代理工具,可以实时修改非标准协议
- Pytbull: 灵活的 IDS/IPS 测试框架(附带超过300个测试样例)
Fuzzing
- Paimei: 逆向工程框架,包含 PyDBG, PIDA,pGRAPH
- Immunity Debugger: 脚本 GUI 和命令行调试器
- mona.py: Immunity Debugger 中的扩展,用于代替 pvefindaddr
- IDAPython: IDA pro 中的插件,集成 Python 编程语言,允许脚本在 IDA Pro 中执行
- PyEMU: 全脚本实现的英特尔32位仿真器,用于恶意软件分析
- pefile: 读取并处理 PE 文件
- pydasm: Python 封装的 libdasm
- PyDbgEng: Python 封装的微软 Windows 调试引擎
- uhooker: 截获 DLL 或内存中任意地址可执行文件的 API 调用
- diStorm: AMD64 下的反汇编库
- python-ptrace: Python 写的使用 ptrace 的调试器
- vdb/vtrace: vtrace 是用 Python 实现的跨平台调试 API, vdb 是使用它的调试器
- Androguard: 安卓应用程序的逆向分析工具
- Capstone: 一个轻量级的多平台多架构支持的反汇编框架。支持包括ARM,ARM64,MIPS和x86/x64平台。
- PyBFD: GNU 二进制文件描述(BFD)库的 Python 接口
Web
- Sulley: 一个模糊器开发和模糊测试的框架,由多个可扩展的构件组成的
- Peach Fuzzing Platform: 可扩展的模糊测试框架(v2版本 是用 Python 语言编写的)
- antiparser: 模糊测试和故障注入的 API
- TAOF: (The Art of Fuzzing, 模糊的艺术)包含 ProxyFuzz, 一个中间人网络模糊测试工具
- untidy: 针对 XML 模糊测试工具
- Powerfuzzer: 高度自动化和可完全定制的 Web 模糊测试工具
- SMUDGE: 纯 Python 实现的网络协议模糊测试
- Mistress: 基于预设模式,侦测实时文件格式和侦测畸形数据中的协议
- Fuzzbox: 媒体多编码器的模糊测试
- Forensic Fuzzing Tools: 通过生成模糊测试用的文件,文件系统和包含模糊测试文件的文件系统,来测试取证工具的鲁棒性
- Windows IPC Fuzzing Tools: 使用 Windows 进程间通信机制进行模糊测试的工具
- WSBang: 基于 Web 服务自动化测试 SOAP 安全性
- Construct: 用于解析和构建数据格式(二进制或文本)的库
- fuzzer.py(feliam): 由 Felipe Andres Manzano 编写的简单模糊测试工具
- Fusil: 用于编写模糊测试程序的 Python 库
取证
- Requests: 优雅,简单,人性化的 HTTP 库
- HTTPie: 人性化的类似 cURL 命令行的 HTTP 客户端
- ProxMon: 处理代理日志和报告发现的问题
- WSMap: 寻找 Web 服务器和发现文件
- Twill: 从命令行界面浏览网页。支持自动化网络测试
- Ghost.py: Python 写的 WebKit Web 客户端
- Windmill: Web 测试工具帮助你轻松实现自动化调试 Web 应用
- FunkLoad: Web 功能和负载测试
- spynner: Python 写的 Web浏览模块支持 Javascript/AJAX
- python-spidermonkey: 是 Mozilla JS 引擎在 Python 上的移植,允许调用 Javascript 脚本和函数
- mitmproxy: 支持 SSL 的 HTTP 代理。可以在控制台接口实时检查和编辑网络流量
- pathod/pathoc: 变态的 HTTP/S 守护进程,用于测试和折磨 HTTP 客户端
- Volatility: 从 RAM 中提取数据
- Rekall: Google 开发的内存分析框架
- LibForensics: 数字取证应用程序库
- TrIDLib: Python 实现的从二进制签名中识别文件类型
- aft: 安卓取证工具集恶意软件分析
- pyew: 命令行十六进制编辑器和反汇编工具,主要用于分析恶意软件
- Exefilter: 过滤 E-mail,网页和文件中的特定文件格式。可以检测很多常见文件格式,也可以移除文档内容。
- pyClamAV: 增加你 Python 软件的病毒检测能力
- jsunpack-n: 通用 JavaScript 解释器,通过模仿浏览器功能来检测针对目标浏览器和浏览器插件的漏洞利用
- yara-python: 对恶意软件样本进行识别和分类
- phoneyc: 纯 Python 实现的蜜罐
- CapTipper: 分析,研究和重放 PCAP 文件中的 HTTP 恶意流量
其他有用的库和工具
- peepdf: Python 编写的PDF文件分析工具,可以帮助检测恶意的PDF文件
- Didier Stevens’ PDF tools: 分析,识别和创建 PDF 文件(包含PDFiD,pdf-parser,make-pdf 和 mPDF)
- Opaf: 开放 PDF 分析框架,可以将 PDF 转化为 XML 树从而进行分析和修改。
- Origapy: Ruby 工具 Origami 的 Python 接口,用于审查 PDF 文件
- pyPDF2: Python PDF 工具包包含:信息提取,拆分,合并,制作,加密和解密等等
- PDFMiner: 从 PDF 文件中提取文本
- python-poppler-qt4: Python 写的 Poppler PDF 库,支持 Qt4
- 杂项
- InlineEgg: 使用 Python 编写的具有一系列小功能的工具箱
- Exomind: 是一个利用社交网络进行钓鱼攻击的工具
- RevHosts: 枚举指定 IP 地址包含的虚拟主句
- simplejson: JSON 编码和解码器,例如使用 Google’s AJAX API
- PyMangle: 命令行工具和一个创建用于渗透测试使用字典的库
- Hachoir: 查看和编辑二进制流
- IPython: 增强的交互式 Python shell
- Beautiful Soup: HTML 解析器
- matplotlib: 制作二维图
- Mayavi: 三维科学数据的可视化与绘图
- RTGraph3D: 在三维空间中创建动态图
- Twisted: Python 语言编写的事件驱动的网络框架
- Suds: 一个轻量级的基于SOAP的python客户端
- M2Crypto: Python 语言对 OpenSSL 的封装
- NetworkX: 图库(边, 节点)
- Pandas: 基于 Numpy 构建的含有更高级数据结构和工具的数据分析包
- pyparsing: 通用解析模块
- lxml: 使用 Python 编写的库,可以迅速、灵活地处理 XML
- Whoosh: 纯python实现的全文搜索组件
- Pexpect: 控制和自动化程序
- Sikuli: 使用 Jython 脚本自动化基于截图进行视觉搜索
- PyQt 和PySide: Python 捆绑的 Qt 应用程序框架和 GUI 库
Tenacity。
Python重试从此无比简单。这是我博客上的一篇文章,毫不掩饰我对Tenacity这个第三方库的喜爱和赞美之情。
---
title: Tenacity——Exception Retry 从此无比简单
date: 2017-06-18 00:17:47
tags: ['Python', 'Exception', 'Tenacity']
category: ['Python']
comments: true
---
[Python 装饰器装饰类中的方法](https://kingname.info/2017/04/17/decorate-for-method/)这篇文章,使用了装饰器来捕获代码异常。这种方式可以让代码变得更加简洁和Pythonic。
在写代码的过程中,处理异常并重试是一个非常常见的需求。但是如何把捕获异常并重试写得简洁高效,这就是一个技术活了。
以爬虫开发为例,由于网页返回的源代码有各种不同的情况,因此捕获异常并重试是很常见的要求。下面这几段代码是我多年以前,在刚开始学习爬虫的时候,由于捕获异常并重试导致代码混乱化过程。
代码一开始的逻辑非常简单,获取网页后台API返回的JSON字符串,转化成字典,提取出里面`data`的数据,然后传递给`save()`函数:
```python
def extract(url):
info_json = requests.get(url).content.decode()
info_dict = json.loads(info_json)
data = info_dict['data']
save(data)
```
代码运行一段时间,发现有时候JSON会随机出现解析错误。于是添加捕获异常并重试的功能:
```python
def extract(url):
info_json = requests.get(url).text
try:
info_dict = json.loads(info_json)
except Exception:
print('网页返回的不是有效的JSON格式字符串,重试!')
extract(url)
return
data = info_dict['data']
save(data)
```
后来又发现,有部份的URL会导致递归深度超过最大值。这是因为有一些URL返回的是数据始终是错误的,而有些URL,重试几次又能返回正常的JSON数据,于是限制只重试3次:
```python
def extract(url):
info_json = requests.get(url).text
try:
info_dict = json.loads(info_json)
except Exception:
print('网页返回的不是有效的JSON格式字符串,重试!')
for i in range(3):
if extract(url):
break
data = info_dict['data']
save(data)
return True
```
后来又发现,不能立刻重试,重试要有时间间隔,并且时间间隔逐次增大......
从上面的例子中可以看到,对于异常的捕获和处理,一不小心就让整个代码变得很难看很难维护。为了解决这个问题,就需要通过装饰器来完成处理异常并重试的功能。
Python 有一个第三方库,叫做[Tenacity](http://tenacity.readthedocs.io/en/latest/),它实现了一种优雅的重试功能。
以上面爬虫最初的无限重试版本为例,如果想实现遇到异常就重试。只需要添加两行代码,爬虫的主体函数完全不需要做修改:
```python
from tenacity import retry
@retry
def extract(url):
info_json = requests.get(url).content.decode()
info_dict = json.loads(info_json)
data = info_dict['data']
save(data)
```
现在要限制重试次数为3次,代码总行数不需要新增一行就能实现:
```python
from tenacity import retry, stop_after_attempt
@retry(stop=stop_after_attempt(3))
def extract(url):
info_json = requests.get(url).content.decode()
info_dict = json.loads(info_json)
data = info_dict['data']
save(data)
```
现在想每5秒钟重试一次,代码行数也不需要增加:
```python
from tenacity import retry, wait_fixed
@retry(wait=wait_fixed(5))
def extract(url):
info_json = requests.get(url).content.decode()
info_dict = json.loads(info_json)
data = info_dict['data']
save(data)
```
甚至重试的时间间隔想指数级递增,代码行数也不需要增加:
```python
from tenacity import retry, wait_exponential
@retry(wait=wait_exponential(multiplier=1, max=10)) # 重试时间间隔满足:2^n * multiplier, n为重试次数,但最多间隔10秒
def extract(url):
info_json = requests.get(url).content.decode()
info_dict = json.loads(info_json)
data = info_dict['data']
save(data)
```
重试不仅可以限制次数和间隔时间,还可以针对特定的异常进行重试。在爬虫主体中,其实有三个地方可能出现异常:
* requests获取网页出错
* 解析JSON出错
* info_dict字典里面没有`data`这个key
如果只需要在JSON解析错误时重试,由于异常类型为`json.decoder.JSONDecodeError`,所以就可以通过参数来进行限制:
```python
from tenacity import retry, retry_if_exception_type
from json.decoder import JSONDecodeError
@retry(retry=retry_if_exception_type(JSONDecodeError))
def extract(url):
info_json = requests.get(url).content.decode()
info_dict = json.loads(info_json)
data = info_dict['data']
save(data)
```
当然,这些特性都可以进行组合,例如只对`JSONDecodeError` 进行重试,每次间隔5秒,重试三次,那就写成:
```python
from tenacity import retry, retry_if_exception_type, wait_fixed, stop_after_attempt
from json.decoder import JSONDecodeError
@retry(retry=retry_if_exception_type(JSONDecodeError), wait=wait_fixed(5), stop=stop_after_attempt(3))
def extract(url):
info_json = requests.get(url).content.decode()
info_dict = json.loads(info_json)
data = info_dict['data']
save(data)
```
自始至终,爬虫主体的代码完全不需要做任何修改。
Tenacity是我见过的,最 Pythonic ,最优雅的第三方库。
1. GitHub - darknessomi/musicbox: 网易云音乐命令行版本。 高品质网易云音乐命令行版本,简洁优雅,丝般顺滑,基于Python编写。
<img src="https://pic2.zhimg.com/3d886ac004ac5218107f0c036251d931_b.png" data-rawwidth="1330" data-rawheight="996" class="content_image" width="1330" data-original="https://pic2.zhimg.com/3d886ac004ac5218107f0c036251d931_r.png">2.
2. GitHub - wting/autojump: A cd command that learns。 一个文件系统跳转的快捷命令。同样的还有shell编写的 GitHub - rupa/z: z is the new j, yo,用了就知道有多提高效率。
3. GitHub - docopt/docopt: Pythonic command line arguments parser, that will make you smile。上面有人提到了,但是没有人说到精髓,它使用脚本的docstring作为命令行的解析文本,也就是你直接写注释就可以完成argparse复杂的添加选项、指定参数等功能,所见即所得。
4. GitHub - Runscope/httpbin: HTTP Request &amp; Response Service, written in Python + Flask.。我还曾经写过类似的一个应用,那时候还没有遇到它。读它的源码时候发现它其实好几个的地方实现的很优雅。
5. GitHub - Russell91/pythonpy: the swiss army knife of the command line。有时候我会做一些简单地计算和功能的验证,之前得输入ipython然后imort对应的库,再执行(或者用 python -c 'import aaa; print aaa.bbb(1)'的方式)。现在用pythonpy,在命令行一句就好了。
6. GitHub - p-e-w/maybe: :rabbit2: See what a program does before deciding whether you really want it to happen.。大家都听过那个著名一个空格引发的惨剧吧,我以前也发生过本来是要执行「rm -rf tmp/*」, 结果卡了一下,执行成了「rm -rf tmp/ *」的惨痛经历,如果你有用maybe的习惯,就不会发生悲剧啦。
7. GitHub - nvbn/thefuck: Magnificent app which corrects your previous console command. 简直神器,修正你之前的命令行指令。
<img src="https://pic3.zhimg.com/07ee85a3d241dbd9f7a55e37914fadf6_b.png" data-rawwidth="1376" data-rawheight="752" class="content_image" width="1376" data-original="https://pic3.zhimg.com/07ee85a3d241dbd9f7a55e37914fadf6_r.png">8.
8. GitHub - getsentry/sentry: Sentry is cross-platform crash reporting built with love。错误搜集系统,现在应该没有哪个公司(不只是Python语言)不用它了吧?
9. GitHub - faif/python-patterns: A collection of design patterns/idioms in Python,以前学习设计模式要从很多文章甚至其他语言的版本中去理解,特别苦,直到我发现了这个项目,整个人都不好了。
10. https://github.com/jkbrzt/httpie。一个命令行HTTP 客户端,cURL 的替代品,它是Python语言中被star数量最多的项目,可见它的受欢迎程度,我几乎每天都在用它, 甚至为了表达对它的喜欢,特地读它的代码,找机会「混」进了它的项目贡献者列表。
欢迎关注本人的微信公众号获取更多Python相关的内容(也可以直接搜索「Python之美」):
(1)hhatto/autopep8:自动格式化Python代码以符合PEP 8
1、一段测试代码如下:
2、使用命令:autopep8 --in-place --aggressive --aggressive test.py
3、转换之后的代码如下:
(2)python-for-android :把Python脚本打包成APK。
(3)python-visualization/folium : 用Python辅助实现地图的可视化或者有关于地图的操作,可以直接解析Json数据进行可视化。
(4)mzucker/noteshrink :把手写的笔记转成更加简单清晰漂亮的图片,因为平常记笔记比较多,所以比较有用。
1、一张我以前学习JavaScript时候写下的笔记照片(字丑请忽略)
2、执行命令:python noteshrink.py test.jpg
3、处理之后的结果
又到了年终盘点时间,Tryo Labs 和去年一样推出了2016 年十大 Python 库的榜单。对于这份榜单的筛选条件,Tryo Labs 写道:「我们避开了 Django、Flask 等已经成为今天的标准库的已经成功的项目。另外,这个榜单中有的库是 2016 年之前建立的,但它们在今年的受欢迎度出现了暴增或我们认为它们非常好所以可以进入这个榜单。」下面是榜单详情:
1. Zappa
链接:Serverless Python Web Services
自 AWS Lambda(以及后续的其它项目)发布以来,人们的关注点就全部转移到了无服务器架构上。这些架构让我们可以将微服务(microservice)部署到云端、部署到一个完全可管理的环境中;在这样的环境中,人们不用关心管任何服务器,而只需要分配无状态的、短暂的计算容器(computing container)即可——一个服务提供商即可完全管理。通过这一范式,事件(比如流量尖峰)可以触发更多这些容器的执行,因此有可能能够处理「无限的」水平扩展。
Zappa 是一个用于 Python 的无服务器框架,尽管(至少目前)它仅支持 AWS Lambda 和 AWS API Gateway。它使得开发这样架构的应用变得非常简单,能将你从使用 AWS Console 或 API 的繁琐配置工作中解放出来,而且它还有各种用于简化部署和管理不同环境的命令。
2. Sanic + uvloop
链接:
Sanic: channelcat/sanic
uvloop: uvloop: Blazing fast Python networking
谁说 Python 不能很快?Sanic 不仅有可能是有史以来最好的软件库名字,也可能是有史以来最快的 Python 网页框架,而且似乎也远远超过其它框架。它是一个专为速度而设计的类 Flask 的 Python 3.5+ 网页服务器。另一个库 uvloop 是一个用于 asyncio 的事件循环(event loop,其底层使用了 libuv)的超快速的插件替代。这两个加起来就是一个强大的组合!
根据 Sanic 的作者的基准测试,uvloop 可以驱动 Sanic 每秒处理超过 3.3 万条请求,这实在太强了!(比 node.js 还快)。你的代码可以受益于这种新的 async/await 语法——它们会看起来很整洁;此外我们也喜欢 Flask 风格的 API。你一定要试试 Sanic,而且如果你也在使用 asyncio,你也可以无需太多修改你的代码就能受益于 uvloop。
3. asyncpg
跟进 asyncio 框架的最新进展,来自 MagicStack 的人为我们带来了这个高效的异步(目前只支持 CPython 3.5)数据库接口库,其是专门为 PostgreSQL 设计的。它有零相关性,这意味不需要安装 libpq。相对而言,withpsycopg2(最流行的 Python 的 PostgreSQL 适配器)需要以文本格式与数据库服务器交换数据;而 asyncpg 则实现了 PostgreSQL 二进制 I/O 协议,这让其不仅支持通用类型,而且还有其它许多性能上的好处。
其基准是很清楚的:asyncpg 平均至少比 psycopg2(或 aiopg)快 3 倍,也比 node.js 和 Go 实现更快。
4. boto3
链接:boto/boto3
如果你的基础设施部署在 AWS 上或使用了它们的服务(比如 S3),那么你应该非常乐意看到 boto(用于 AWS API 的 Python 接口)被从头到尾完整重写了。而且你不用一次性就完全迁移你的应用:你可以同时使用 boto3 和 boto(2) ;比如仅在你应用中新的部分使用 boto3。
这个新的实现在不同的服务间会一致的多,而且因为其使用了数据驱动的方法来在运行时间(runtime)从 JSON 描述文件中生成类,所以其总是可以实现快速更新。再也不用滞后于新的 Amazon API 功能了,赶紧使用 bot3 吧!
5.TensorFlow
链接:https://www.tensorflow.org/
大名鼎鼎的 TensorFlow。自从谷歌在 2015 年 11 月发布以来,这个库已经获得了很多改进,它已成为时下最流行的 GitHub Python 库。简而言之,TensorFlow 是一个使用数据流图(data flow graphs)的数值计算库,可以在 GPU 或 CPU 上运行。
在过去一年里,我们目睹了 TensorFlow 在机器学习社区中掀起了一股新风潮(特别是在深度学习领域),它不仅出现在研究领域,而且在应用领域也非常常见。如果你正在做深度学习并想在高级别接口中使用它,你可以尝试以它为后端的 Keras 或新推出的 TensorFlow-Slim。
6.gym+universe
Gym:OpenAI Gym: A toolkit for developing and comparing reinforcement learning algorithms
Universe:Universe
如果你是人工智能圈内的人,肯定听说过非营利人工智能研究公司 OpenAI。他们的研究人员在今年开源了一些 Python 代码。Gym 是一个用于开发并比较强化学习算法的工具包。它包含一个开源库,这个库收集了一些可被用于测试强化学习算法的测试问题(环境)。它还包含一个站点与 API,能让你对比训练出的算法(代理,agent)的表现。因为它不在乎代理的实现方式,你可以选择使用自己的计算库建立代理:numpy、TensorFlow、Theano 等。
他们最近也发布了 Universe,这是一个用于研究通用人工智能在跨游戏、网页和其他应用上的表现的软件平台。Universe 能完美匹配 gym,因此它能让任何真实世界应用调整进 gym 环境中。研究人员希望这一无限的可能性能够加速对智能代理的研究,从而解决通用任务。
7.Bokeh
你可能熟知一些提供数据可视化的 Python 库,其中最流行的就是 matplotlib 和 seaborn。然而,Bokeh 被创造用来做交互可视化(interactive visualization),并且面向现代的网页浏览展示。这意味着 Bokeh 能创造出一个可以让你探索来自网页浏览器数据的情节(plot)。比较棒的是它紧密融合了 Juptyer Notebooks,所以你能使用它配合你的专业工具进行研究。它也有一个可选的服务器组件 bokeh-server,其带有许多强大的功能,比如在服务器端对大型数据集进行下采样、流传输数据、变换等。可点击网址 Gallery - Bokeh 0.12.3 documentation 查看案例,看起来很棒。
8.Blaze
链接:Ecosystem - Blaze 0.10.2rc1+5.g87dd886 documentation
有时候,当你对数据集运行分析时,却发现数据集过大,无法一次塞进计算机 RAM 中。如果你无法依赖 numpy 或 Pandas,你通常需要转而使用其他的工具,如 PostgreSQL、MongoDB、Hadoop、Spark 等等。这些工具都有其自身的优缺点,依照任务的特点,总有一种工具是适合你的。但决定转换工具是一项巨大的工程,因为你需要了解这些系统如何工作,以及如何以正确的形式插入数据。
Blaze 提供了一个统一的接口,让用户无需学习所有数据库技术。Blaze 库的核心是一种计算表达方式。Blaze 本身不会进行任何计算:它只是知道如何指定一个特定的后端,决定谁来执行任务。Blaze 还有其它很多功能(它形成了一个生态系统),它作为一个库被开发出来。例如,Dask 实现了一个可用于 NumPy 数组的插件,可以处理大于内存的内容和利用多核处理器,并且还具有动态任务调度能力。
9.Arrow
有一个流行的说法,在计算机科学领域只有两个大问题:无效缓存和命名。我认为这句话忽略了另一个大问题:管理数据时间(managing datetimes)。如果你曾经试图在 Python 中管理数据时间,你就会知道标准库里有巨量的模块和类型:datetime、date、 calendar、 tzinfo、 timedelta、 relativedelta、 pytz 等等。更糟糕的是,时区都自然设定为默认值。
Arrow 为开发者提供了「人类的时间(datetime for humans)」,提供了一种清晰的方法来创建、操作、格式化和转换日期、时间和时间戳。它可以用于替换 Python 2 和 3 的 datetime 类型,并提供了一个更友好的界面,同时加入新的功能(如 humanize)弥补了原系统的不足。即使你不需要 Arrow 提供的额外功能,使用它也可以大大减少代码中的引用。
10. Hug
链接:Embrace the APIs of the future
公开你的内部 API,这样可以大大简化 Python API 的开发过程。Hug 是一个仅限于 Python3 的库,提供在 Python 中创建 HTTP REST API 的最简单的方式。它不是一个 web 框架(虽然 Hug 提供这样的功能,而且表现很好),它的主要功能是公开正确的标准内部 Python API。这个想法非常简单:一次定义逻辑和结构,并且可以通过多种方式公开你的 API。目前,它支持公开 REST API 或命令行界面。
你可以使用类型注释(type annotations),让 Hug 不仅为你的 API 生成文件,同时提供验证和明确的错误消息,这可以让你的开发工作(和你的 API 用户的工作)变得轻松很多。Hug 构建在 Falcon 的高性能 HTTP 库之上,这意味着你可以使用任何 wsgi 兼容的服务器(例如 gunicorn)将其部署到生产环境中。
http://weixin.qq.com/r/sUqKkkTEQhk9rQDx9x_j (二维码自动识别)
- import itchat, time
-
- @itchat.msg_register(['Text', 'Map', 'Card', 'Note', 'Sharing'])
- def text_reply(msg):
- itchat.send('%s: %s'%(msg['Type'], msg['Text']), msg['FromUserName'])
-
- @itchat.msg_register(['Picture', 'Recording', 'Attachment', 'Video'])
- def download_files(msg):
- fileDir = '%s%s'%(msg['Type'], int(time.time()))
- msg['Text'](fileDir)
- itchat.send('%s received'%msg['Type'], msg['FromUserName'])
- itchat.send('@%s@%s'%('img' if msg['Type'] == 'Picture' else 'fil', fileDir), msg['FromUserName'])
-
- @itchat.msg_register('Friends')
- def add_friend(msg):
- itchat.add_friend(**msg['Text'])
- itchat.get_contract()
- itchat.send_msg(msg['RecommendInfo']['UserName'], 'Nice to meet you!')
-
- @itchat.msg_register('Text', isGroupChat = True)
- def text_reply(msg):
- itchat.send(u'@%s\u2005I received: %s'%(msg['ActualNickName'], msg['Content']), msg['FromUserName'])
-
-
- itchat.auto_login()
- itchat.run()
一些必须的:(越早发现越好)
Python内带的库就不提了。
1)基本工具:
virtualenv(虚拟环境)
pip、setuptools (e.g. easy_install,这些东西肯定要呢)
ipython(用了以后,就不再想用普通的python shell)
ipdb(ipython上的debugger,怎么能不用?难道要一直重新运行print某变量?)
ipython notebook(又名jupyter,在线写代码并debug,这东西用了以后就知道自己错过了啥)
记住%pylab ... 这命令,这样图片之类的直接显示在网页里
fabric(控制多个服务器、方便安装、更改设置、开关某service、等等)
nose、mock、coverage(testing类)
gevent、eventlet(千万别用python自带的多线程库)
gevent还有从外hijack thread这个debug功能
别忘了monkey.patch(),哈哈
multiprocessing(必要使用多个处理器、还蛮有必要)
pypy/psyco/cython/ctypes/cffi etc.(理解这些很有必要,有时候还真的需要跟C兼容或加速)
celery、luigi(同时进行多个process任务,任务之间需要沟通更方便管理)
logging
argparse(上面有人推荐docopt更好)
2)数据处理类:
numpy (千万别低估啊,谁缺少这个真的什么都干不好)
还有一些在numpy基础上的:
pillow/gd(图片数据类,还有不少图片处理功能)
matplotlib(把各种东西简单显示渲染出来)
pandas(处理复杂数据、转化或合并数据等等。用了以后就不会再import csv之类的)
scipy(统计类,也不少图片处理、优化等功能)
sklearn(机器学习,好方便)
(theano、tensorflow这些也很有名,只是还没用过,还有个有名的OCR库忘了名字)
nltk、pattern(更多语言处理工具)
pyopencl、pyopengl、pycuda(这些能让numpy做复杂任务更加强更快,利用GPU)
3)网络类:
requests(python内带的http/url等库很烦人)
django、flask、twisted(以及其他web framework,比如Zope、Button、Webapp就不说了)
(django、flask下面还有很多小库,比如messages和websocket。太多了,不说了)
pika皮卡丘(不同服务器不同程序之间的沟通大大简化)
pyzmq(也类似,更简单一些,功能比较有限,不过还能直接调用远程python函数-rpc)
sqlalchemy、pymongo、pycouch(还有好多较为方便的数据库累的)
各种google api
特别是appengine、compute engine api,还有maps/places/search api
还有谷歌的pipeline、mapreduce之类的、google docs那个编辑远程表格的也不错
爬虫方面也不少有用的库,比如beautifulsoup、scrapy。
还有mechanize这种自动控制多个浏览器做事的库,利用浏览器引擎等。
4)其他:
TK, WX, QT(做界面)
pyglet、pygame、等(更好处理多个界面,各令块渲染,渲染频率,这些)
geopy、shapely、gdal、geos、pyproj(地图处理,可能还有些,早就忘了)
但是数据库一定要选择PostGIS
arrow、pendulum(python内带的datetime处理太弱了)
py2exe类(把代码直接编译成executable,所有人能运行)
simplejson(更快)
pyyaml(相对json,更好写,呵呵)
joblib(比那个pickle好太多了,直接把某object存到硬盘等)
tqdm(在命令行显示progress进度,超简单)
发现居然没人提lxml
pip install lxml之后可以用lxml提供的xpath解析器来解析HTML。xpath是一套标准的HTML DOM查询语法,再不用Beaultiful Soup4那么罗嗦又不好维护的语法了。而且最棒的是你可以直接从Firefox或者Chrome的development tool里复制某个DOM元素的xpath路径。
其他不论,光lxml使用C实现的代码,效率上就比bs4高很多。用过之后再也不想去用bs4了最近真是新出现了不少增长迅猛的 Python 库啊,在这里推荐 5 个值得在 2018 年关注的库,各个领域精选了 1 个,看看有没有你没听过的?
这个库的名字和之前一个很火的梗有关,有人在 youtube 上画 Sonic 那个蓝色小人,结果一本正经的画出了下面这货,给它起名叫 Sanic,还配了一句话是 Gotta go faster.
这个库和 Flask 类似,但是比它快很多,速度能在测试中达到每秒 36000 次请求。在2017年的 Star 增长数几乎是翻了一倍。Gotta go faster!
这个库相当于是环境管理和包管理二合一,由 Kenneth Reitz (Requests 的作者 )编写,现在移交给 Python 官方来维护,提供比 pip 体验更好的开发包管理。它的 Slogon 是Python Development Workflow for Humans,用来解决各种环境不一致、安装包的问题。
现在反爬虫技术越来越厉害,常见的请求 + 解析爬虫随着频率变大和前端开发的复杂化变得并不是那么奏效。Requestium 的好处是,结合了 Chrome 59 以后的 headless 无头特性(代替了 phantomjs)。虽然效率稍微低一点,但是稳,前端渲染的网页也可以爬取解析。是 Requests, Selenium 和 Parsel 的结合体。
是一个深度学习的库,优势是它是由 Facebook 团队来维护的。可能深度学习方面大家听得最多的是 Tensorflow,但 Caffe2 学习起来更简单轻量,并且它的背景能支持它有一个健壮的发展。
这个库的开发者在 medium 上发了一篇文章,标题是:Regex was taking 5 days to run. So I built a tool that did it in 15 minutes. (正则要花5天时间才能完成,所以我做了个工具在15分钟内搞定)。这个库可以快速进行大规模语料库的文本搜索与替换。当关键词数量>500 的时候,FlashText 的搜索速度开始超过正则。
先写这么多,如果大家喜欢,之后再持续更新这篇精选集。
如果你看别的 Python 教程看不懂、学不会,那你可以试试 让小白学上瘾的编程入门课-麻瓜编程
大家都在贴 github 上的 awesome,一点个人感受和诚意都没有。
我就说两个:
1. requests:在没有用 requests 之前,用 urlib 发一个 post 请求无法理解,更不说提交一个文件了。$ you-get http://tv.sohu.com/20141115/n406064831.shtml
$ pip install you-get
这个列表包含与网页抓取和数据处理的Python库
网络用于解析和操作简单文本的库。
解析和处理特定文本格式的库。
处理人类语言问题的库。
异步网络编程库
电子邮件解析库
网址和网络地址操作解析/修改网址和网络地址库。
提取网页内容的库。
用于WebSocket的库。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。