热门标签 | 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)
}

推荐阅读
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • 字节码开发笔记:深入解析与应用技巧 ... [详细]
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • Go 项目中数据库配置文件的优化与应用 ... [详细]
  • 在VS2013中编译FFMPEG时遇到的问题及解决方案
    在使用VS2013编译旧版本FFMPEG库时遇到了一些问题,因为官方并未提供预编译的LIB和DLL文件。由于对Linux环境不熟悉,只能在Windows环境下进行配置和编译。具体步骤如下:首先,下载FFMPEG的源代码;然后,安装必要的编译工具和依赖项;接着,配置Visual Studio 2013的项目设置;最后,解决编译过程中出现的各种错误和警告。通过这些步骤,最终成功编译出所需的FFMPEG库文件。 ... [详细]
  • 基于Dubbo与Zipkin的微服务调用链路监控解决方案
    本文提出了一种基于Dubbo与Zipkin的微服务调用链路监控解决方案。通过抽象配置层,支持HTTP和Kafka两种数据上报方式,实现了灵活且高效的调用链路追踪。该方案不仅提升了系统的可维护性和扩展性,还为故障排查提供了强大的支持。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • Vue应用预渲染技术详解与实践 ... [详细]
  • 在腾讯云服务器上部署Nginx的详细指南中,首先需要确保安装必要的依赖包。如果这些依赖包已安装,可直接跳过此步骤。具体命令包括 `yum -y install gcc gcc-c++ wget net-tools pcre-devel zlib-devel`。接下来,本文将详细介绍如何下载、编译和配置Nginx,以确保其在腾讯云服务器上顺利运行。此外,还将提供一些优化建议,帮助用户提升Nginx的性能和安全性。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
  • 在尝试为 Unity 编译一个简单的 Java 库时,运行 `ant jar` 命令后遇到了 Java I/O 异常。具体错误信息为“无法启动程序 ${aAPT},错误代码 2”,这通常表示指定的文件或目录不存在。此问题可能是由于环境配置不正确或路径设置有误导致的。建议检查相关路径和环境变量,确保所有依赖项都已正确安装和配置。 ... [详细]
  • 本文提供了在 Windows 环境下编译 Google Test 框架的详细步骤。首先,从 GitHub 下载最新版本的 Google Test 源代码。由于最新版本未包含 MSVC 配置文件,需要使用 CMake 工具进行配置。具体操作包括下载并安装 CMake,然后通过修改 CMake 文件来生成适用于 MSVC 的项目文件。此外,还需要进入 Google Mock 目录,确保所有依赖项正确配置。本文将详细介绍每个步骤,帮助开发者顺利完成编译过程。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
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社区 版权所有