如何获取全网可访问的所有网站网址和网站信息呢

今天由于有一个小程序项目,是专门给织梦dedecms网站、WordPress网站做小程序制作免费小程序的。但是手上织梦网站和WordPress网站用户数量都不是很多,很好的项目却没有触及到用户,没有能给网站带来好处,于是就想,能不能收集现在网上所有的织梦网站和WordPress网站,并且获取他们的邮箱、QQ、微信、电话等有用信息呢?

带着疑问百度了一番,没有发现现成的可用数据,可是小程序项目还得往前推呢,等着用户来使用呢?既然网上没有现成的,要不就自己写一个吧。于是就有了这个cobweb全网网址采集器。

全网网址采集器是什么?

这是一个由golang编写的全网网址采集器,可用自动爬取可触及的所有网站信息。该网址采集器会自动采集并分析网站的标题、站点描述、微信、QQ、联系电话、网站所用的运行环境、ip信息等,甚至是网站所用的框架。

为什么会有这个全网网址采集器

  • 因为我想收集现在全网的网址,并分析网站数据。

全网网址采集器能采集哪些内容

本采集器可以采集到的的内容有:文章标题、文章关键词、文章描述、文章详情内容、文章作者、文章发布时间、文章浏览量。

##全网网址采集器可用在哪里运行
本采集器可用运行在 Windows系统、Mac 系统、Linux系统(Centos、Ubuntu等),可用下载编译好的程序直接执行,也可以下载源码自己编译。

如何安装使用

  • 下载可执行文件
    请从Releases 中根据你的操作系统下载最新版的可执行文件,解压后,重命名config.dist.json为config.json,打开config.json,修改mysql部分的配置,填写为你的mysql地址、用户名、密码、数据库信息,新建cobweb数据库,导入mysql.sql到填写的数据库中,然后双击运行可执行文件即可开始采集之旅。
  • 自助编译
    先clone代码到本地,本地安装go运行环境,在cobweb目录下打开cmd/Terminal命令行窗口,执行命。如果你没配置代理的话,还需要新设置go的代理
go env -w GOPROXY=https://goproxy.cn,direct

最后执行下面命令

go mod tidy
go mod vendor
go build

编译结束后,配置config。重命名config.dist.json为config.json,打开config.json,修改mysql部分的配置,填写为你的mysql地址、用户名、密码、数据库信息,新建cobweb数据库,导入mysql.sql到填写的数据库中,然后双击运行可执行文件即可开始采集之旅。

config.json配置说明

{"mysql": { //数据库配置"Database": "spider","User": "root","Password": "root","Charset": "utf8mb4","Host": "127.0.0.1","TablePrefix": "","Port": 3306,"MaxIdleConnections": 1000,"MaxOpenConnections": 100000}
}

全网网址采集器运行原理分析

多线程(多协程)同时执行

全网网址采集器利用了golang得天独厚的并行任务优势,同时开启多个协程,可以做到比常规轻易得手的php采集代码快10倍~100倍,甚至更快。当然更快的采集速度还需要依靠你本地的网速,你家开的是500M带宽的话,开1000个协程都是可以的。

相关代码部分

var MaxChan = 100
var waitGroup sync.WaitGroup
var ch = make(chan string, MaxChan)func SingleSpider(){var websites []Websitevar counter intDB.Model(&Website{}).Where("`status` = 0").Limit(MaxChan*10).Count(&counter).Find(&websites)if counter > 0 {for _, v := range websites {ch <- v.DomainwaitGroup.Add(1)go SingleData2(v)}} else {log.Println("等待数据中,10秒后重试")time.Sleep(10 * time.Second)}SingleSpider()
}

采集数据锁,最大限度保证数据不被多次执行

为了防止数据被多次执行,采集过程中还采用了数据锁,让下一次采集的时候,不会读到相同的数据。

相关代码

//锁定当前数据DB.Model(&website).Where("`id` = ?", website.ID).Update("status", 2)log.Println(fmt.Sprintf("开始采集:%s://%s", website.Scheme, website.Domain))err := website.GetWebsite()if err == nil {website.Status = 1} else {website.Status = 3}log.Println(fmt.Sprintf("入库2:%d:%s",website.ID, website.Domain))DB.Save(&website)

快速入库,直接执行原生sql语句

本来代码中采用的是gorm的orm形式插入数据,结果发现使用orm的话,插入一条网址需要执行3条sql 语句,这在并行执行中,每多执行一条sql都是浪费,因此,采用了原生sql来插入数据,每次只需要执行一条数据即可。

相关源码

DB.Exec("insert into website(`domain`, `scheme`,`title`) select ?,?,? from dual where not exists(select id from website where `domain` = ?)", v.Domain, v.Scheme, v.Title, v.Domain)

网站编码自动识别并转换为utf-8

由于是采集全网的网址,并且要从网站内容里面分析有用的数据,并且golang只支持utf-8,什么乱七八糟的编码格式网站内容,都需要转换为utf-8,因此编码转换这一步必不可少,全网网址采集器内置了功能强大的编码转换器,不用担心编码转换问题,同时兼容多种编码格式。

相关代码

    contentType := strings.ToLower(resp.Header.Get("Content-Type"))log.Println(contentType)var htmlEncode stringif contentType == "" {//先尝试读取charsetreg := regexp.MustCompile(`(?is)charset=["']?\s*([a-z0-9\-]+)`)match := reg.FindStringSubmatch(body)if len(match) > 1 {htmlEncode = strings.ToLower(match[1])if htmlEncode != "utf-8" && htmlEncode != "utf8" {body = ConvertToString(body, "gbk", "utf-8")}} else {reg = regexp.MustCompile(`(?is)<title[^>]*>(.*?)<\/title>`)match = reg.FindStringSubmatch(body)if len(match) > 1 {aa := match[1]_, htmlEncode, _ = charset.DetermineEncoding([]byte(aa), "")if htmlEncode != "utf-8" {body = ConvertToString(body, "gbk", "utf-8")}}}} else if !strings.Contains(contentType, "utf-8") {body = ConvertToString(body, "gbk", "utf-8")}

网站内容自动提取

网站信息抓取回来了,还是html状态,需要从中提取出有用的信息,才达到我们想要的最终目的,内置了qq采集、微信采集、电话采集等功能。

相关代码

    //尝试获取微信reg := regexp.MustCompile(`(?i)(微信|微信客服|微信号|微信咨询|微信服务)\s*(:|:|\s)\s*([a-z0-9\-_]{4,30})`)match := reg.FindStringSubmatch(contentText)if len(match) > 1 {website.WeChat = match[3]}//尝试获取QQreg = regexp.MustCompile(`(?i)(QQ|QQ客服|QQ号|QQ号码|QQ咨询|QQ联系|QQ交谈)\s*(:|:|\s)\s*([0-9]{5,12})`)match = reg.FindStringSubmatch(contentText)if len(match) > 1 {website.QQ = match[3]}//尝试获取电话reg = regexp.MustCompile(`([0148][1-9][0-9][0-9\-]{4,15})`)match = reg.FindStringSubmatch(contentText)if len(match) > 1 {website.Cellphone = match[1]}

使用了哪些开源项目

全网网址采集器采用了两个非常有名的开源项目,一个是用于网站内容抓取的项目gorequest,另一个是用于网站内容分析的项目goquery。两个项目共同组成了采集器的核心功能。

如果你对采集器的原理有更大的兴趣,可以直接拜读存放在GitHub上的源码:https://github.com/fesiong/cobweb

Windows用户可以直接下载已经编译好的可执行文件Windows版网址采集器下载

手把手教你如何获取全网可访问的所有网站网址和网站信息相关推荐

  1. 【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程

    声明:本文章转载自crifan的技术人生 [教程]手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程 重要提示: 1.此贴,以后不再更新: 2.想要看更新的内容,请移 ...

  2. 【手把手教你】获取股票数据并进行量化回测——基于ADX和MACD趋势策略

    01 引言 不少喜欢量化的读者向我反馈,虽然已经掌握了Python的编程基础,但仍不知道如何切入到股票量化分析上,一是对如何获取股票数据还不太熟悉:二是拿到股票数据后不知道怎么做量化回测.实际上公众号 ...

  3. 搜狗微信下线了怎么获取公众号文章?手把手教你最新获取方式

    关于微信公众号<云爬虫技术研究笔记>可以看到更多哦! 背景 最近发现搜狗微信在2019.10.29号的时候悄然下线了一个功能,也就是不能在搜狗搜索中指定公众号的名称,如下图   很多媒体以 ...

  4. 手把手教你Nodejs获取微信小程序二维码

    [小程序二维码和普通二维码] 下图左为小程序码,右为普通二维码, 普通二维码的生成比较简单,只用jquery就可以生成,详见:https://blog.csdn.net/uikoo9/article/ ...

  5. 手把手教你如何获取微信公众号用户的个人信息(包括OpenId)

    最近,对微信公众号有点兴趣,就自己研究了研究里面的一些内容,发现还挺有意思的,而且通过微信公众号可以调用一些比较有意思的接口,就比如百度开发服务平台 点击进入 里面的很有接口,就比较常见的翻译,语音识 ...

  6. 手把手教你搭建外网可访问的应用~

    1..注册appfog 2.注册之后,新建一个java spring mysql应用. 3.选择第一个亚洲服务器(据说最快) 4.写上应用名. 5.进入应用默认界面 6.点击update source ...

  7. 手把手教你Python获取全部金融数据

    恒有数(UDATA)金融数据社区,由恒生电子出品.社区推出了Python金融量化资源合集(持续更新),建议收藏.

  8. 阿里云的oss看这一篇就够,手把手教你,上传下载速度再也不用愁了,个人网站速度太慢,一定要看!

    OSS对象存储是什么? 举个栗子,我的个人学生分享资源网站,用的是阿里的ESC服务器,给的宽带是1M,在这里普及一下宽带和下载的速度比是8:1,也就是最多只有100左右KB ,而且如果我把所有的资源文 ...

  9. mysql sql注入怎么获取数据_手把手教你通过SQL注入盗取数据库信息

    目录数据库结构 注入示例判断共有多少字段 判断字段的显示位置 显示登录用户和数据库名 获取所有数据库名 获取对应数据库的表 获取对应表的字段 获取所有的用户密码 我们都是善良的银!一生戎码只为行侠仗义 ...

最新文章

  1. 读博无门,就业碰壁,孤独当了7个月“民科”后,他的论文中了顶会
  2. Swift Web 开发之 Vapor - 路由(二)
  3. selenium 定位不到元素总结
  4. bzoj 2962 序列操作
  5. 第一章:linux管理文件和目录
  6. 【杂谈】深度学习必备,各路免费爬虫一举拿下
  7. js中的数组对象排序(方法sort()详细介绍)
  8. 即将毕业的你,做好当一个社会人的准备了吗?
  9. linux下查看进度命令,在Linux系统中使用Coreutils Viewer显示命令运行进度
  10. script filename php,PHP $_SERVER['SCRIPT_FILENAME'] 与 __FILE__ 的区别
  11. 【Flink】Flink UI 查看 subtask在相应的机器上的调度时间
  12. 数据:DeFi总锁定价值突破170亿美元
  13. pooling 与 步长大于1的卷积
  14. Linux软件安装到哪个目录
  15. Ubuntu20设置蓝牙
  16. 104规约使用总结(一)——格式介绍
  17. 线性回归中常见的一些统计学术语(RSE RSS TSS ESS MSE RMSE R2 Pearson's r)
  18. STC 纯硬件自动下载电路 - 三极管负脉冲电路
  19. 2018年算法工程师秋招经验贴(微软、华为、网易游戏、阿里offer)
  20. 章节一:print()函数与变量

热门文章

  1. 1.NoSQL之Redis配置与基础命令
  2. 云创平台+播放器SDK,腾讯云音视频新工具助力视频生产、终端能力全面升级
  3. Html 3D旋转相册制作
  4. vscode python 调试闪退
  5. 设计模式之职责链模式(图解+例题+java源码)
  6. 15个好用到哭的python库,真不错!
  7. 第五届蓝桥杯【省赛试题4】史丰收速算
  8. python批量修改图片的exif信息,增加GPS信息。
  9. js和jsp文件后缀还在傻傻分不清?一文教你搞懂来龙去脉
  10. 【OpenCV4】使用 magnitude() 函数计算幅值(c++)