此文档主要涉及到页面解析,goquery的使用方法,我觉得可以专门写篇文档。package pholcus_lib
// 基础包
import (
    "github.com/henrylee2cn/pholcus/common/goquery"                          //DOM解析
    "github.com/henrylee2cn/pholcus/app/downloader/request" //必需
    . "github.com/henrylee2cn/pholcus/app/spider"           //必需
    // . "github.com/henrylee2cn/pholcus/app/spider/common" //选用
    // "github.com/henrylee2cn/pholcus/logs"
    // net包
     "net/http" //设置http.Header
    // "net/url"
    // 编码包
    // "encoding/xml"
    //"encoding/json"
    // 字符串处理包
    //"regexp"
    // "strconv"
        "strings"
    // 其他包
     "fmt"
    // "math"
    // "time"
)
func init() {
    FileTest1.Register()
}
var FileTest1 = &Spider{
    Name:        "meizitu图片下载",//url:http://www.meizitu.com/
    Description: "meizitu图片下载",
    // Pausetime: 300,
    // Keyin:   KEYIN,
    // Limit:        LIMIT,
    EnableCookie: false,
    RuleTree: &RuleTree{
        Root: func(ctx *Context) {
            ctx.AddQueue(&request.Request{
                Url:          "http://www.meizitu.com/",
                Rule:         "meizitu",
                ConnTimeout:  -1,
                DownloaderID: 0, //图片等多媒体文件必须使用0(surfer surf go原生下载器)
            })
            
        },
        Trunk: map[string]*Rule{
            "meizitu":{
                ParseFunc: func(ctx *Context) {
                    query := ctx.GetDom()
                    query.Find("#picture p a").Each(func(i int, s *goquery.Selection) { //其中picture是id,
                    //p是tagname a也是tagname,这里就找到了a,而且是好多个,所以用了each进行循环
                        //s.Find('p>a').
                        fmt.Println("打印一下")
                        fmt.Println(s.Html())//s对象的内部HTML代码
                        fmt.Println("-----------")
                        url1,_:=s.Attr("href")//s的href属性值
                        fmt.Println(url1)
                        fmt.Println("??????????????")
                        //t:=s.Find('a').Eq(0)
                        //fmt.Println("A的html",t.Html())
                        if href, ok := s.Attr("href"); ok {
                                ctx.AddQueue(&request.Request{
                                    Url:    href,
                                    Header: http.Header{"Content-Type": []string{"text/html; charset=gbk"}},
                                    Rule:   "图片URL",
                                })
                            }
                        })
                },
            },
            "图片URL": {
                ParseFunc: func(ctx *Context) {
                    query := ctx.GetDom()
                    query.Find("#picture p img").Each(func(i int, s *goquery.Selection) {//同上
                        //s.Find('p>a').
                        fmt.Println("二级页面开始!打印一下????????????????????????????????????")
                        fmt.Println(s.Html())
                        fmt.Println("-----------")
                        url1,_:=s.Attr("src")
                        fmt.Println(url1)
                        fmt.Println("??????????????")
                        fmt.Println("二级页面结束!")
                        //t:=s.Find('a').Eq(0)
                        //fmt.Println("A的html",t.Html())
                        if href, ok := s.Attr("src"); ok {
                                ctx.AddQueue(&request.Request{
                                    Url:    href,
                                    Header: http.Header{"Content-Type": []string{"text/html; charset=gbk"}},
                                    Rule:   "图片下载",
                                })
                            }
                        
                        })
                },
            },
            "图片下载": {
                ParseFunc: func(ctx *Context) {
                    fmt.Println("图片链接URL:",ctx.GetUrl())
                    picurl:=ctx.GetUrl()//获取链接值,用于为图片命名,这里可能还会涉及新建文件夹,所以后面还需要想想怎么传参数?????
                    picname:=strings.Replace(picurl,"http://mm.howkuai.com/wp-content/uploads/","",-1)//替换值
                    picname=strings.Replace(picname,"/","-",-1)//替换值
                    ctx.FileOutput(picname) // 等价于ctx.AddFile("baidu")
                },
            },
            
        },
    },
}

转载于:https://www.cnblogs.com/SSSR/p/6344816.html

幽灵蛛(pholcus)规则(二)相关推荐

  1. java模拟微信抢红包金额算法规则二倍均值法模拟(满满的注释)

    二倍均值法模拟微信抢红包金额算法规则 ```java /*** 二倍均值法* @param amount 总金额* @param min 最小金额* @param num 个数* 本帖只提供思路,实际 ...

  2. 陆琪《潜伏在办公室》:职场潜规则二十三条

    职场潜规则第一条:理想很重要,但比理想更重要的是利益. 职场潜规则第二条:表面是公义,心里是生意,这才是职场的本质. 职场潜规则第三条:待人以诚,但诚是有目标和尺度的. 职场潜规则第四条:工作不会害你 ...

  3. 深入理解成员函数的重载、隐藏、覆盖规则(二)

    本文作者:islwj 本文出处:http://blog.csdn.net/islwj 声明: 本文可以不经作者同意, 任意复制, 转载, 但任何对本文的引用都请保留文章开始前三行的作者, 出处以及声明 ...

  4. 色彩的数学规则(二)(转)

    http://zhan.renren.com/mathart?gid=3602888498046783626&from=PubNewFeed&ref=hotnewsfeed&s ...

  5. 前端学习(1307):模块查找规则二

  6. 二、Python第二课——变量命名规则及字符串变量相关函数

    目录 一.变量命名规则 二.字符串变量及相关函数 1.字符串变量 2.相关函数 最后琐碎杂物: 1.字符串之间的拼接 2.字符串格式控制(制表符和换行) 一.变量命名规则 正如其他编程语言一样,程序离 ...

  7. 二、SonarQube自定义规则

    一.介绍   不可避免的,在实际的开发中sonar提供的官方的代码检测经常不满足我们的要求,比如如下代码: /*** 以下代码sonar会认证name和age是从来没有使用过的,它不认识lombok的 ...

  8. 变量的命名规则十二条

    一般规则 规则一 直观可以拼读,望文得知意,便于记忆,采用英文单词或组合,不建议使用拼音,英文单词也不要太复杂,建议使用简写 规则二 变量长度符合"min_length && ...

  9. abbex 区块链学院如何交易之 第六章 当日交易:规则成就短线高手

    第六章 当日交易:规则成就短线高手 Abbex 规则一强体防身,规则二断铁熔金.鏖战当日交易,成就短线高手,惟有将规则融会贯通. 阿瑟:这一章的标题使我好像看到一位艺术家正在描绘的这样一幅图画:所有的 ...

  10. abbex 区块链学院如何交易之 第十二章 反败为胜:重创之后重拾信心

    第十二章 反败为胜:重创之后重拾信心 Abbex 交易是失败者的游戏,大师和我们同样面对失败的概率.他用什么手法重新开始,信心 倍增? 阿瑟:你是不是把最顶级的智慧留在了最后?(注:在写这一章的时候, ...

最新文章

  1. Dlib库中实现正脸人脸检测的测试代码
  2. 谈谈自己对java的学习看法
  3. 《精解Windows8》——2.6 Windows应用商店
  4. lisp 河道水面线计算_水面漂浮泡沫生活垃圾隔离拦载浮筒使用方法
  5. linux下编译为知笔记,为知笔记 Linux 版安装
  6. 201521123004《软件工程》个人阅读作业1
  7. woff字体MIME类型配置
  8. 如何解决ado.net entity framework的使用,再别的调用项目中依然正常
  9. 吴恩达《机器学习》第十八章:图片文字识别OCR
  10. python中类的定义_python中类的概念
  11. 拓端tecdat|R语言生存分析可视化分析
  12. 跳板机+谷歌验证码 ssh 自动登录
  13. SATI 国产文献题录信息统计分析工具:简介
  14. ksu7对讲机调频软件_对讲机写频教程通用版:写频软件的正确操作流程
  15. [转载]北京的六条经典徒步线路
  16. 电子通讯录(文件保存版)
  17. 升级到Chipmunk(2021.2.1)版本 遇到Run按钮不可用
  18. 「读书笔记」余生,请多指教
  19. 基于Ubuntu9.10 雨林木风Linux Y1.5发布
  20. Linux下的gedit复制粘贴问题

热门文章

  1. VSCode无法跳转到外部函数定义
  2. Java中的其他常用类(Math类,Scanner类、正则表达式)
  3. 连接公司办公 快速连接公司协同办公的20款必备软件
  4. matlab两个力的合成与分解,[转帖]小波图像分解与合成(例子) - Matlab讨论区 - 振动论坛 动力学,噪声 -......
  5. 使用Python根据视频链接下载MP4视频
  6. lol选英雄显示服务器,lol卡在选人界面怎么回事 lol卡在选英雄界面怎么办
  7. 写在25岁的人生边上
  8. qq游戏大厅中解析不安装apk的研究
  9. groupby分组聚合和运算2
  10. 无法启动此程序因为计算机中丢失msvcp140d,msvcp140.dll文件丢失修复工具