配置运行参数
入口文件:根据项目提供的编译命令找到入口文件 crawlergo_cmd.go
。
入口函数:找到65行的 func main()
函数,在主函数的代码中下断点。
配置:添加程序实参
(chrome程序路径必须加引号,否则会报错:navigate timeout http://127.0.0.1/upload-labs-master/)
(取消了参数-o json,这样就不会在命令行/控制台、打印比较混乱的Json结果数据)
-c "C:\Program Files\Google\Chrome\Application\chrome.exe" --output-json debug.json http://127.0.0.1/upload-labs-master/
验证配置是否正确:运行程序,发现程序退出。经过验证,在配置中为Chrome路径添加引号,成功执行程序。
生成编译程序 go_build_crawlergo_cmd_go.exe
、以及爬虫结果文件 debug.json
。
main函数重要代码:cli结构
介绍和简单使用
参考:Go 每日一库之 cli
介绍:cli是一个用于构建命令行程序的库,所有的初始化操作就是创建一个cli.App
结构的对象。通过为对象的字段赋值来添加相应的功能。
示例:理论上创建一个 cli.App
结构的对象,然后调用其 Run()
方法,传入命令行的参数即可。空白的cli程序如下:
func main(){
(&cli.App{}).Run(os.Args)
}
说明文档:https://github.com/urfave/cli/。官方一个完整示例,分析过程见代码注释部分。
func main(){
// 定义 cli.App{} 作为应用
app := &cli.App{
Name: "", // 工具名称,会显示在帮助中
Usage: "", // 工具参数,会显示在帮助中
// 接收命令行参数,开始执行定义的动作
Action: func(c *cli.Context) error {},
}
// 调用 cli.App{}.Run() 执行动作,动作接收命令行参数作为形参
// 动作执行结果赋值给err变量,用于判断执行是否出错
err := app.Run(os.Args)
// 如果出错则打印错误信息
if err != nil {
log.Fatal(err)
}
}
cli库小结 | 应用 | 说明 |
---|---|---|
内置字典对象1 cli.App{} | cli库的信息对象 | 定义横幅、主要执行方法 |
内置键.Run(os.Args) | 接收命令行参数,执行Action键值中的方法 | |
自定义键 | help打印信息 | |
内置键字典 Flags | Flags字段是[]cli.Flag类型,用于添加选项 | |
选项 | cli为常见类型都实现了对应的XxxFlag | 共用字段有:Name/Value/Usage |
选项 | 选项是通过c.Type(name)来获取的 | 例如 if c.String(“lang”) == “english” |
存入变量 | 将选项存到某个预先定义好的变量中 | 只需要设置Destination字段为变量的地址 |
选项的必要性声明 | Required: true, | |
- | - | - |
内置对象2 cli.Context() | 可以获取传给命令行的参数信息 | - |
- | NArg()返回参数个数 | - |
- | Args()返回cli.Args对象 | 调用其Get(i)获取位置i上的参数 |
结合源码分析
cli 库的定义:75-258行(大体完成阅读)
func main() {
// cli 代码的漏网之鱼:72-74行
// 定义 cli.App{}:75-252行
app := &cli.App{
声明帮助文本
声明选项1 Chrome.exe 路径 {
Aliases: []string{"c"}, // 命令行输入参数的别名,例如-c chromePath
Destination: &taskConfig.ChromiumPath // 可以事先存入变量
声明选项2 User-Agent 字段
声明选项3 Post 数据 {
Aliases: []string{"d"}, // 输入参数的别名, -d a=1&b=2
Destination: &taskConfig.MaxCrawlCount, // 也可以事先存入
声明选项4 过滤器模式 {
Aliases: []string{"f"},
Usage: "filtering `Mode` used for collected requests. Allowed mode:\"simple\", \"smart\" or \"strict\".",
声明选项5 输出数据位置
声明选项6 输出文件格式
声明选项7 以隐匿形式启动浏览器
声明选项8 最大线程
Name: "max-tab-count",
Aliases: []string{"t"},
Value: 8,
Usage: "maximum `Number` of tabs allowed.",
声明选项9 使用一般路径对目标进行Fuzz测试
声明选项10 路径Fuzz字典
Name: "fuzz-path-dict",
Usage: "`Path` of fuzz dict. Such as \"/home/test/fuzz_path.txt\"",
声明选项11 是否从 robots.txt 寻找路径
声明选项12 请求代理
声明选项13 是否对url进行编码
声明选项14 单线程的超时时间
……
Action: run
err := app.Run(os.Args)
if err != nil {
logger.Logger.Fatal(err)
}
}
}