PyxYuYu / MyBlog

记录和分享学习的旅程!

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Python学习记录(八):命令行参数&网络爬虫

PyxYuYu opened this issue · comments

No pressure, no diamonds.

0x01 Wooyun

  • 弱口令
    • weblogic/weblogic
    • tomcat/tomcat
0x02 爬虫实战一

  • 命令行参数
  • sys 模块--系统相关的参数和函数
    • sys.argv 传递给python脚本的命令行参数列表
      • argv[0]是脚本的名称(是否是完整的路径名取决于操作系统),如果执行命令时解释器使用了-c命令行选项,argv[0]设置为字符串-c,如果无脚本名称传递给python解释器,argv[0]是空字符串
    • argument 命令行上的字符串,在python中参数是sys.argV[1:],arg[0]是执行程序的名字
    • option 选项
    • option argument 选项的值,跟在选项后面,格式如 -f foo/-ffoo, -file foo/--file=foo
    • posititon argument 位置参数,选项被处理后剩下的参数
  • argparse模块--命令行解析(类似的模块有getopt
    • argparse模块使得编写用户友好的命令行接口飞车容易,程序只需定义好它要求的参数,然后argparse将负责如何从sys.argv中解析出这些参数,argparse模块还会自动生成帮助和使用信息并且当用户赋给程序非法的参数时产生的错误信息
    • 创建一个解析器 argparse.ArgumentParser()
      • ArgumentParser对象会保存把命令行解析成Python数据类型所需要的所有信息
    • 添加参数 add_argument()方法向ArgumentParser添加程序的参数信息,这些信息告诉ArgumentParser如何接受命令行上的字符串并将他们转换成对象,这些信息被保存下来并在调用parse_args()时用到
    • 解析参数 通过parse_args()方法解析,它将检查命令行,把每个参数转换成恰当的类型并采取恰当的动作,在大部分情况下,这意味着将从命令行解析出来的属性建立一个简单的Namespace对象
      • 在脚本中,parse_args()调用一般不带参数,ArgumentParser将根据sys.argv自动确定命令行参数
    • ArgumentParser 对象

class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True)

  • ArgumentParser 对象,所有的参数应该以关键字参数传递
  • prog 程序的名字(默认:sys.argv[0]
  • usage 描述程序用户的字符串(默认:从解析器的参数生成)
  • description 参数帮助信息之前的文本(默认:空)
  • epilog 参数帮助信息之后的文本 (默认:空)
  • parents ArgumentParser对象的一个列表,这些对象的参数应该包括进去
  • formatter_class 定制化帮助信息的类
  • prefix_chars 可选参数的前缀字符集(默认:'-')
  • fromfile_prefix_chars 额外的参数应该读取的文件的前缀字符集(默认:None)
  • argument_default 参数的全局默认值(默认:None)
  • conflict_handler 解决冲突的可选参数的策略(通常没有必要)
  • add_help 给解析器添加-h/-help 选项(默认:True)

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

  • name or flags 选项字符串的名字或列表,例如 -foo或者-f--foo
  • action 在命令行遇到该参数时采取的基本动作类型,参数出发的动作
    • store 保存参数,默认
    • store_const 保存一个被定义为参数规格一部分的值(常量),而不是一个来自参数解析而来的值
    • store_ture/store_false 保存相应的布尔值
    • append 将值保存在一个列表中
    • append_const 将一个定义在参数规格中的值(常量)保存在一个列表中
    • count 参数出现的次数
    • version 打印程序版本信息
  • nargs 应该读取的命令行参数数目
  • const 某些actionnargs选项要求的常数值
  • default 如果命令行中没有出现该参数时的默认值,参数的默认值
  • type命令行参数应该被转换成的类型,把命令行输入的结果转换成设置的类型
  • choices 参数可允许的值是一个容器
  • required 该命令行选项是可以省略(只针对可选参数)
  • help 参数的简短描述
  • metavar 参数在帮助信息的名字
  • destparse_args()返回的对象要添加的属性名称
    • 如果 dest=a,那么可以通过args.a访问该参数

ArgumentParser.parse_args(args=None, namespace=None)

  • 将参数字符串转换成对象并设置成命名空间的属性,返回构成的命名空间
  • 之前对add_argument()的调用完全决定了创建什么对象以及如何设置
  • 默认情况下,参数字符串取自于sys.argv,并创建一个空的Namespace对象用于保存属性
from argparse import ArgumentParser

# 创建解析对象
# description: 参数帮助信息之前的描述程序
# add_help: 默认是True,False就是禁用-h/-help
parser = ArgumentParser(usage="This is Pyx.", description="This is a example program.")
# 指定程序需要接受的命令参数
# 定位参数,执行程序时必选,否则会报错
parser.add_argument('echo', help='echo the string')
# 可选参数,可选
parser.add_argument('--verbosity', help='increase output verbosity')
parser.add_argument('--one', default=1, type=int, help="the first argument")
parser.add_argument('--two', dest='aa', type=int, help="the second argument")
parser.add_argument('--docs-dir', default="./", help="document directory")

# 将可以识别和不可以识别的的命令参数放入
# args, remaining = parser.parser_known_args(args=None, namespace=None)
args = parser.parse_args()
print args
print args.one
# 如果已经添加了`dest`的话,那么就用后面带aa的作为对象属性
print args.aa
print args.echo
运行返回python argparse.py pyx --verbosity s --one 5
Namespace(aa=None, doce_dir='./', echo='pyx', one=5, verbosity='s')
5
None
pyx
  • 如果上面的函数遇到了没有识别的命令行参数,会报错,那么只提取有用的参数,忽略不认识的参数不需要报错,需要添加 args, remaining = parser.parse_known_args(sys.argv)
    • ArgumentParser.parse_known_args(args=None, namespace=None) 返回一个两个元素的元组,包含构造的namespace和剩余的不认识的参数字符串的列表
    • 上面的2个变量刚刚好一个放namespace,一个放不认识的参数列表
0x03 一天总结

  • 命令行参数有多个模块可以使用,常用的是argparse模块
    • argparse.ArgumentParser() 创建命令解析对象
    • ArgumentParser.add_argument() 添加命令参数
    • ArgumentParser.parse_known_args() 忽略输入错误的参数,一般情况不用,让它报错提示
  • 爬虫实战一 到这里也告一段落了基本实现了多线程,带命令行
    • 不过命令行还不是很完整,还可以添加判断,完善命令行命令
    • 由于今天(2016年3月9日 21:34:14)BeeBeeto的网址也导向了Seebug,估计以后都不会有了(幸好所有公开POC已经全部爬完),所以爬虫实战一到今天就全部结束
    • 明天开始挑战知道创宇的Python招聘题目