爬虫第一炮-福利网站:妹子图
pip install Requests
pip install beautifulsoup4
pip install LXML
准备工作完了 ヽ(●-`Д´-)ノ ,我们马上开搞码代码了。
一个简单爬虫的诞生大慨需要下面几个步骤(图很简陋、将就着看看)。
好啦!现在来开始看看网站找一个爬虫入口(开始爬取的页面):http://www.mzitu.com/all/
本教程简明地介绍了Python标准库推荐使用的命令行参数解析模块 —— Argparse的使用。这里Argparse的编写环境为Python 3,一些细节有别于2.x版本,特别是一些异常消息,在3.x版本中有所改进。
注意: 有其他两个模块,也完成同样的任务。即 getopt (一个等价于C语言的getopt()) 和 弃用的 optparse。另外,Argparse 是基于 optparse,因此在使用方面非常相似。
在本入门教程中,让我们通过使用ls命令来展示Argparse的功能:
$ ls
cpython devguide prog.py pypy rm-unused-function.patch
$ ls pypy
ctypes_configure demo dotviewer include lib_pypy lib-python ...
$ ls -l
total 20
drwxr-xr-x 19 wena wena 4096 Feb 18 18:51 cpython
drwxr-xr-x 4 wena wena 4096 Feb 8 12:04 devguide
-rwxr-xr-x 1 wena wena 535 Feb 19 00:05 prog.py
drwxr-xr-x 14 wena wena 4096 Feb 7 00:59 pypy
-rw-r--r-- 1 wena wena 741 Feb 18 01:01 rm-unused-function.patch
$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
...
从以上的四个命令中,我们能够了解以下几个基本概念:
让我们先从一个非常简单的例子开始(它什么也不做):
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()
运行结果:
$ python prog.py
$ python prog.py --help
usage: prog.py [-h]
optional arguments:
-h, --help show this help message and exit
$ python prog.py --verbose
usage: prog.py [-h]
prog.py: error: unrecognized arguments: --verbose
$ python prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo
结果分析:
一个示例:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print args.echo
运行结果:
$ python prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
$ python prog.py --help
usage: prog.py [-h] echo
positional arguments:
echo
optional arguments:
-h, --help show this help message and exit
$ python prog.py foo
foo
结果分析:
注意:尽管自动产生的帮助看起来显示不错,目前不是那么有用。例如我们看到 echo 作为一个位置参数,但是我们仍然无法知道它是做什么用的。所以,我们增加了一些东西,使得它变得更加有用:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="echo the string you use here")
args = parser.parse_args()
print args.echo
运行结果:
$ python prog.py -h
usage: prog.py [-h] echo
positional arguments:
echo echo the string you use here
optional arguments:
-h, --help show this help message and exit
现在,做一些更有用的事情:(计算输入参数 square 的平方)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number")
args = parser.parse_args()
print args.square**2
运行结果:
$ python prog.py 4
Traceback (most recent call last):
File "prog.py", line 5, in <module>
print args.square**2
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
这个程序不能正确运行,因为 Argparse 会将输入参数当作字符串处理,所以我们需要设置它的类型:(type=int)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number", type=int)
args = parser.parse_args()
print args.square**2
运行结果:
$ python prog.py 4
16
$ python prog.py four
usage: prog.py [-h] square
prog.py: error: argument square: invalid int value: 'four'
进行得很顺利。这个程序现在甚至可以在非法输入时报错退出。
迄今为止,我们一直在玩位置参数。让我们看看如何添加可选参数:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
if args.verbosity:
print "verbosity turned on"
运行结果:
$ python prog.py --verbosity 1
verbosity turned on
$ python prog.py
$ python prog.py --help
usage: prog.py [-h] [--verbosity VERBOSITY]
optional arguments:
-h, --help show this help message and exit
--verbosity VERBOSITY
increase output verbosity
$ python prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py: error: argument --verbosity: expected one argument
结果分析:
上述示例接受 –verbosity 参数的任意值,但对于当前程序,实际上只需要两个值: True 或 False 。 我们相应地修改代码:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity", action="store_true")
args = parser.parse_args()
if args.verbose:
print "verbosity turned on"
运行结果:
$ python prog.py --verbose
verbosity turned on
$ python prog.py --verbose 1
usage: prog.py [-h][--verbose]
prog.py: error: unrecognized arguments: 1
$ python prog.py --help
usage: prog.py [-h][--verbose]
optional arguments:
-h, --help show this help message and exit
--verbose increase output verbosity
结果分析:
如果您熟悉命令行的使用,您会注意到我尚未提及到参数的简短版本的话题。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity", action="store_true")
args = parser.parse_args()
if args.verbose:
print "verbosity turned on"
运行结果:
$ python prog.py -v
verbosity turned on
$ python prog.py --help
usage: prog.py [-h] [-v]
optional arguments:
-h, --help show this help message and exit
-v, --verbose increase output verbosity
注意:新功能也反映在帮助文本中。
我们不断增加程序的复杂度:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int, help="display a square of a given number")
parser.add_argument("-v", "--verbose", action="store_true", help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbose:
print "the square of {} equals {}".format(args.square, answer)
else:
print answer
运行结果:
$ python prog.py
usage: prog.py [-h] [-v] square
prog.py: error: the following arguments are required: square
$ python prog.py 4
16
$ python prog.py 4 --verbose
the square of 4 equals 16
$ python prog.py --verbose 4
the square of 4 equals 16
我们如何给我们这个程序提供多种详细输出(Multiple Verbosity)的格式,请看代码:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int, help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
print "the square of {} equals {}".format(args.square, answer)
elif args.verbosity == 1:
print "{}^2 == {}".format(args.square, answer)
else:
print answer
运行结果:
$ python prog.py 4
16
$ python prog.py 4 -v
usage: prog.py [-h] [-v VERBOSITY] square
prog.py: error: argument -v/--verbosity: expected one argument
$ python prog.py 4 -v 1
4^2 == 16
$ python prog.py 4 -v 2
the square of 4 equals 16
$ python prog.py 4 -v 3
16
除了最后一个外,这些都看起来很好,这在我们的程序中暴露了一个错误。 我们通过限制 –verbosity 参数可以接受的值来解决它:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int, help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2], help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
print "the square of {} equals {}".format(args.square, answer)
elif args.verbosity == 1:
print "{}^2 == {}".format(args.square, answer)
else:
print answer
运行结果:
$ python prog.py 4 -v 3
usage: prog.py [-h] [-v {0,1,2}] square
prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)
$ python prog.py 4 -h
usage: prog.py [-h] [-v {0,1,2}] square
positional arguments:
square display a square of a given number
optional arguments:
-h, --help show this help message and exit
-v {0,1,2}, --verbosity {0,1,2}
increase output verbosity
注意:修改代码也会同时反映出错误消息以及帮助文本。
现在,让我们使用一个不同的方法玩 –verbosity ,这是很常见的。它也匹配 CPython 可执行文件处理其自己的verbose参数的方式(检查 python –help 的输出):
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int, help="display the square of a given number")
parser.add_argument("-v", "--verbosity", action="count", help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
print "the square of {} equals {}".format(args.square, answer)
elif args.verbosity == 1:
print "{}^2 == {}".format(args.square, answer)
else:
print answer
我们引入了另一个动作 “count” 来计算特定可选参数的出现次数:
$ python prog.py 4
16
$ python prog.py 4 -v
4^2 == 16
$ python prog.py 4 -vv
the square of 4 equals 16
$ python prog.py 4 --verbosity --verbosity
the square of 4 equals 16
$ python prog.py 4 -v 1
usage: prog.py [-h] [-v] square
prog.py: error: unrecognized arguments: 1
$ python prog.py 4 -h
usage: prog.py [-h] [-v] square
positional arguments:
square display a square of a given number
optional arguments:
-h, --help show this help message and exit
-v, --verbosity increase output verbosity
$ python prog.py 4 -vvv
16
让我们FIX它:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int, help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count", help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
# bugfix: replace == with >=
if args.verbosity >= 2:
print "the square of {} equals {}".format(args.square, answer)
elif args.verbosity >= 1:
print "{}^2 == {}".format(args.square, answer)
else:
print answer
运行结果:
$ python prog.py 4 -vvv
the square of 4 equals 16
$ python prog.py 4 -vvvv
the square of 4 equals 16
$ python prog.py 4
Traceback (most recent call last):
File "prog.py", line 11, in <module>
if args.verbosity >= 2:
TypeError: unorderable types: NoneType() >= int()
让我们FIX这个BUG:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int, help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count", default=0, help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity >= 2:
print "the square of {} equals {}".format(args.square, answer)
elif args.verbosity >= 1:
print "{}^2 == {}".format(args.square, answer)
else:
print answer
我们刚刚推出了另一个关键字-default。我们将其设置为0,以使其与其他int值相当。请记住,默认情况下,如果未指定可选参数,将赋值None,并且不能与int值进行比较(因此报出TypeError异常)。
再次运行:
$ python prog.py 4
16
到目前为止,我们已经学到了很多东西,但我们仍只是触及了 Argparse 的表面。模块功能非常强大,在我们结束本教程之前,我们将进一步探讨一下。
如果我们想扩展我们的小程序来执行其他权力,而不仅仅是求平方:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
parser.add_argument("-v", "--verbosity", action="count", default=0)
args = parser.parse_args()
answer = args.x**args.y
if args.verbosity >= 2:
print "{} to the power {} equals {}".format(args.x, args.y, answer)
elif args.verbosity >= 1:
print "{}^{} == {}".format(args.x, args.y, answer)
else:
print answer
运行结果:
$ python prog.py
usage: prog.py [-h] [-v] x y
prog.py: error: the following arguments are required: x, y
$ python prog.py -h
usage: prog.py [-h] [-v] x y
positional arguments:
x the base
y the exponent
optional arguments:
-h, --help show this help message and exit
-v, --verbosity
$ python prog.py 4 2 -v
4^2 == 16
注意:到目前为止,我们一直在使用详细程度级别(Verbosity Level)来更改显示的文本。以下示例代替使用详细程度级别来显示更多文本:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
parser.add_argument("-v", "--verbosity", action="count", default=0)
args = parser.parse_args()
answer = args.x**args.y
if args.verbosity >= 2:
print "Running '{}'".format(__file__)
if args.verbosity >= 1:
print "{}^{} ==".format(args.x, args.y),
print answer
运行结果:
$ python prog.py 4 2
16
$ python prog.py 4 2 -v
4^2 == 16
$ python prog.py 4 2 -vv
Running 'prog.py'
4^2 == 16
到目前为止,我们已经使用了两个 argparse.ArgumentParser 实例的方法。 我们来介绍第三个, add_mutually_exclusive_group()。它允许我们指定彼此冲突的参数。我们还要改变程序的其余部分,使新功能更有意义:我们将介绍 –quiet 选项,这将与 –verbose 相反:
import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y
if args.quiet:
print answer
elif args.verbose:
print "{} to the power {} equals {}".format(args.x, args.y, answer)
else:
print "{}^{} == {}".format(args.x, args.y, answer)
我们的程序现在更简单,为了演示,我们已经去掉了一些功能。无论如何,程序运行输出如下:
$ python prog.py 4 2
4^2 == 16
$ python prog.py 4 2 -q
16
$ python prog.py 4 2 -v
4 to the power 2 equals 16
$ python prog.py 4 2 -vq
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
$ python prog.py 4 2 -v --quiet
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
这种方式应该很容易遵循。最后一个命令,你可以看到程序获得的灵活性,即混合长形式参数与短格式参数结合的情况。
在我们总结之前,您可能想要告诉用户您的程序的主要目的,以防他们不知道:
import argparse
parser = argparse.ArgumentParser(description="calculate X to the power of Y")
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y
if args.quiet:
print answer
elif args.verbose:
print "{} to the power {} equals {}".format(args.x, args.y, answer)
else:
print "{}^{} == {}".format(args.x, args.y, answer)
注意:使用说明略有不同。 注意 [-v | -q] ,它告诉我们,我们可以使用 -v 或 -q ,但不能同时使用两者:
$ python prog.py --help
usage: prog.py [-h] [-v | -q] x y
calculate X to the power of Y
positional arguments:
x the base
y the exponent
optional arguments:
-h, --help show this help message and exit
-v, --verbose
-q, --quiet
Argparse 模块提供了很多比这里介绍的更多的功能。它的功能文档是非常详细和完全的,有充分的例子。通过本教程,您应该很容易地消化它们,而不会感到不知所措。
原(Ying)文地址:Argparse Tutorial
Material Design(此链接需要翻墙打开)是一个强大又灵活的设计系统,你还在为你的项目设计苦思冥想(抠脚)找灵感的时候,不妨试试material design。不但让你的项目充满设计感,更可以给你的用户带来流畅的用户体验。
Material Design 是由 Google 推出的全新的设计语言,谷歌表示,这种设计语言旨在为手机、平板电脑、台式机和“其他平台”提供更一致、更广泛的“外观和感觉”。
近一年没有碰python了,感觉宝刀已老,遂写了写自动化发布本地博客的脚本。期间感谢 小长伟 指导。
脚本实现功能:
脚本源码下载:传送门
完整的PKI系统 必须具有权威认证机构(CA)、数字证书库、密钥备份及恢复系统、证书作废系统、应用接口(API)等基本构成部分,构建PKI也将围绕着这五大系统来着手构建。
PKI的基础技术包括加密、数字签名、数据完整性机制、数字信封、双重数字签名等。一个典型、完整、有效的PKI应用系统至少应具有以下部分:
· 公钥密码证书管理。
· 黑名单的发布和管理。
· 密钥的备份和恢复。
· 自动更新密钥。
· 自动管理历史密钥。
· 支持交叉认证。
经济学第一集,从John Green去哪里这个问题开始,运用大量的实例讲解了什么是机会成本,整个经济学的2个假设, 政策在经济领域的运用 ,以及 宏观经济和微观经济的区别 等。
大家请关注这个系列:《十分钟速成课》
今天跟工具组的兄弟们讲,现阶段只要完成四件事,即可解散:
现在,工具线的兄弟们可能还没有自主意识去推进业务,已经存在部分成员魂不附体情况,Too dangerous。说解散只是给大家一个明确的针对大家能力可跃进的工作内容。其实还有很多可以做,只是在会上没讲出来而已。
我有屠龙之术,
欲翻流云起舞;
我有苍茫之志,
欲煎七海成田;
我怀绝世之锋,
欲解抵天之柱;
我是藏玉之璞,
欲觅神匠成材。
吾曾笑云梦乡里文皇帝,
长生何须吞白玉;
吾曾笑长锋空折武皇帝,
挥军难渡雪河西。
吾不惧青天之高,黄地之厚;
独恨不逢琢玉手,
晚生不见凤凰来。
噫嘘兮,
山之既高,神女空候;
水之既深,龙死荒滩。
江南 《屠龙之主·弑君》
近期评论