热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golangcolly爬取第一ppt完整源码和程序(已编译好放在github)

仅供参考和学习,请适度轻爬爬取第一PPT导航栏中的除了后三个的所有ppt并分类文件夹保存如下图windows64二进制程序mac二进制程序如想自己尝试(步骤如下支持

仅供参考和学习,请适度轻爬

在这里插入图片描述


爬取第一PPT导航栏中的除了后三个的所有ppt并分类文件夹保存如下图

在这里插入图片描述
windows64二进制程序
mac二进制程序


如想自己尝试(步骤如下支持go1.13及其以及上)

git clone https://github.com/xhaoxiong/fetch_ppt
go build
./FetchPPT FetchPPT.exe


/*** @Author xiaoxiao* @Description CREATE FILE collector* @Date 2020/10/10 10:29 上午**/
package collectorimport ("FetchPPT/util""bytes""fmt""github.com/gocolly/colly/v2""io""log""os""path""strconv""strings""sync"
)const (originUrl = "http://www.di1ppt.com"downloadOriginUrl = "http://www.di1ppt.com/e/DownSys"
)type SeedConfig struct {DownloadFile DownloadFileGetNavCollector func(file DownloadFile)
}type DownloadFile struct {Filename stringUrl stringDirectory stringOriginDirectory string
}type CrawCollector struct {DownloadFile DownloadFileWg *sync.WaitGroup
}var filterMap = map[string]bool{"/office/": true,"/ziti/": true,"http://www.10103.com": true,
}var page_list = make(map[string]bool)func Run() {SeedConfig := SeedConfig{DownloadFile: DownloadFile{Filename: "",Url: "",Directory: "",},GetNavCollector: GetNavCollector,}SeedConfig.Run()
}func (s *SeedConfig) Run() {s.GetNavCollector(s.DownloadFile)
}var Wg = &sync.WaitGroup{}//获取导航页面
func GetNavCollector(downloadFile DownloadFile) {c := colly.NewCollector()c.OnHTML("#navMenu li", func(element *colly.HTMLElement) {cc := &CrawCollector{DownloadFile: downloadFile,}seedUrl := element.ChildAttr("a", "href")if !filterMap[seedUrl] {directory := element.ChildText("a>span")dir := path.Join(downloadFile.OriginDirectory, directory)if !util.Exists(dir) {os.MkdirAll(dir, 0777)}cc.DownloadFile.Directory = dirWg.Add(1)cc.GetDetailCollector(seedUrl)}})c.OnScraped(func(response *colly.Response) {fmt.Println("完成全部抓取")})c.Visit(originUrl)Wg.Wait()
}//获取导航对应首页N页列表
func (cc *CrawCollector) GetDetailCollector(seedUrl string) {c := colly.NewCollector()c.OnHTML(".dlbox .clearfix .pages", func(element *colly.HTMLElement) {lis := element.DOM.Find("li")pageUrl, _ := lis.Last().Find("a").Attr("href")split := strings.Split(pageUrl, "_")ii, _ := strconv.Atoi(strings.Split(split[1], ".")[0])for i := 1; i }//获取每页对应的详情页
func (cc *CrawCollector) GetPageDetailCollector(seedUrl2 string) {c := colly.NewCollector()c.OnHTML(".dlbox .tplist li>a", func(element *colly.HTMLElement) {detailUrl := element.Attr("href")Wg.Add(1)go cc.GetDownloadUrlCollector(detailUrl)})c.Visit(originUrl + seedUrl2)
}//获取下载页面
func (cc *CrawCollector) GetDownloadUrlCollector(detailUrl string) {c := colly.NewCollector()c.OnHTML(".downurllist li>a", func(element *colly.HTMLElement) {if element.Index == 0 {downloadlUrl := element.Attr("href")cc.GetDownloadUrlDetailCollector(downloadlUrl)}})c.Visit(originUrl + detailUrl)
}//获取验证码下载页面
func (cc *CrawCollector) GetDownloadUrlDetailCollector(downLoadDetailUrl string) {c := colly.NewCollector()c.OnHTML("tbody td>a", func(element *colly.HTMLElement) {downloadUrl := element.Attr("href")downloadUrl = strings.Replace(downloadUrl, "..", "", -1)cc.DownloadFile.Url = downloadOriginUrl + downloadUrlWg.Add(1)go cc.FetchPPT(downloadOriginUrl + downloadUrl)})c.Visit(originUrl + downLoadDetailUrl)
}//获取ppt详情下载页面
func (cc *CrawCollector) FetchPPT(dowloadUrl string) {c := colly.NewCollector()defer Wg.Done()c.OnResponse(func(response *colly.Response) {filename := response.FileName()filepath := path.Join(cc.DownloadFile.Directory, filename)if _, err := os.Stat(filepath); err == nil {log.Println("文件已存在:", filename)return}output, err := os.Create(filepath)defer output.Close()if err != nil {log.Println("创建失败: ", err)}_, err = io.Copy(output, bytes.NewReader(response.Body))if err != nil {log.Println("写入失败 ", err)}log.Printf("下载文件 %s/%s", cc.DownloadFile.Directory, filename)})c.Visit(dowloadUrl)
}

推荐阅读
  • 本文探讨了在UC浏览器中调用分享面板后,图片无法正常显示的问题,并提供了详细的解决方法和代码示例。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • Webpack中实现环境与代码的有效分离
    本文探讨了如何在Webpack中有效地区分开发与生产环境,并实现代码的合理分离,以提高项目的可维护性和加载性能。 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 本文详细介绍如何使用 Python 集成微信支付的三种主要方式:Native 支付、APP 支付和 JSAPI 支付。每种方式适用于不同的应用场景,如 PC 网站、移动端应用和公众号内支付等。 ... [详细]
  • 本文探讨了在Python中利用sqlite3库创建或重定义SQLite函数的方法,包括自定义函数和修改现有函数的行为。 ... [详细]
  • 不确定性|放入_华为机试题 HJ9提取不重复的整数
    不确定性|放入_华为机试题 HJ9提取不重复的整数 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • 本文介绍了一个用于 Android 开发的 Logcat 日志管理工具类,该类提供了默认和自定义标签的日志记录方法。通过这种方式,开发者可以更方便地管理和调试应用程序中的日志输出。 ... [详细]
  • 在尝试从数据库获取设置的过程中,遇到了一个致命错误:Fatal error: Call to a member function bind_param() on boolean。本文将详细分析该错误的原因,并提供解决方案。 ... [详细]
  • 本文详细介绍了MySQL中的存储过程,包括其定义、优势与劣势,并提供了创建、调用及删除存储过程的具体示例,旨在帮助开发者更好地利用这一数据库特性。 ... [详细]
  • 本文详细介绍了如何使用Python中的xlwt库将数据库中的数据导出至Excel文件,适合初学者和中级开发者参考。 ... [详细]
  • 当面临数据库清理任务时,若无删除或重建数据库的权限,可以通过编写SQL脚本来实现批量删除用户自定义的数据表和存储过程。本文将详细介绍如何构造这样的SQL脚本。 ... [详细]
  • Elasticsearch集群构建指南:本地环境搭建与管理
    本文详细介绍了如何在本地环境中搭建Elasticsearch集群,包括节点配置、主节点选举机制、以及如何通过单播和广播方式增加节点。同时,文章还探讨了集群的高可用性和扩展性,以及如何通过配置防止脑裂现象的发生。 ... [详细]
author-avatar
找唐娃娃_622
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有