go 实现的分布式爬虫

自学golang期间,编写gorouting,chan相关代码,实现分布式爬去某主站的每个页面的链接,

暂未想到有什么好办法,在抓取完网页上的链接后,自动退出程序。

抓取性能:内存(8G)占用97%,抓取链接数量:923571个。

最后抓取的链接如下:

923550 https://jobs.51job.com/xian/97026549.html?t=2&s=01
923551 https://jobs.51job.com/xian-ytq/100531159.html?t=2&s=01
923552 https://jobs.51job.com/xian-ytq/co4962830.html
923553 https://jobs.51job.com/xian/102536289.html?t=2&s=01
923554 https://jobs.51job.com/xian/co4541067.html
923555 https://jobs.51job.com/xian-ytq/103266474.html?t=2&s=01
923556 https://jobs.51job.com/xian-ytq/co4427712.html
923557 https://jobs.51job.com/xian/100993960.html?t=2&s=01
923558 https://jobs.51job.com/xian-jjjs/101527308.html?t=2&s=01
923559 https://jobs.51job.com/xian-jjjs/co4429285.html
923560 https://jobs.51job.com/xian/98443048.html?t=2&s=01
923561 https://jobs.51job.com/xian/co4204829.html
923562 https://jobs.51job.com/xian-ytq/101144457.html?t=2&s=01
923563 https://jobs.51job.com/xian-ytq/co4979864.html
923564 https://jobs.51job.com/xian-ytq/91962903.html?t=2&s=01
923565 https://jobs.51job.com/xian-ytq/co4411060.html
923566 https://jobs.51job.com/xian/98252112.html?t=2&s=01
923567 https://jobs.51job.com/xian/co4868985.html
923568 https://jobs.51job.com/xian-lhq/95451726.html?t=2&s=01
923569 https://jobs.51job.com/xian-lhq/co4054606.html
923570 https://jobs.51job.com/xian/103780877.html?t=2&s=01
923571 https://jobs.51job.com/xian/co4301859.html

具体代码如下:

package main

import (
	"fmt"
	"net/http"
	"strings"

	"golang.org/x/net/html"
)

func analyseNode(node *html.Node, link string, f func(string)) {

	if node.Type == html.ElementNode && node.Data == "a" {
		for _, b := range node.Attr {
			if b.Key == "href" && b.Val != "javascript:" {

				v := b.Val

				if strings.HasPrefix(v, "#") {
					continue
				}

				f(v)
			}
		}
	}
	for n := node.FirstChild; n != nil; n = n.NextSibling {
		analyseNode(n, link, f)
	}

}

func requestPage(link string, f func(string)) {
	resp, err := http.Get(link)
	if err == nil {
		doc, err := html.Parse(resp.Body)
		resp.Body.Close()

		if err == nil {
			analyseNode(doc, link, f)
		}
	}
}

func main() {

	var i uint64 = 0

	seen := make(map[string]bool)
	worklist := make(chan string)
	found := make(chan string)

	fmt.Println("main runing")

	go func() {
		str := "https://www.51job.com"
		seen[str] = true
		worklist <- str
	}()

	for i := 0; i < 20; i++ {
		go func() {

			for url := range worklist {
				link := url
				requestPage(link, func(s string) {

					if strings.HasPrefix(s, "//") {
						protocol := link[0:strings.Index(link, "//")]
						s = protocol + s
					} else if strings.HasPrefix(s, "/") {
						s = link + s
					}

					found <- s
				})
			}
		}()
	}

	for url := range found {
		if !seen[url] {
			seen[url] = true
			i += 1
			fmt.Println(i, url)
			go func(url string) {
				worklist <- url
			}(url)
		}

	}

}

有待进一步优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
分布式缓存是一种将数据缓存在多台服务器中,以提供高性能和可伸缩性的技术。其原理是在应用服务器和数据库之间添加一个缓存层,存储经常被访问的数据,以减少对数据库的访问频率。通过将缓存数据存储在多台服务器上,可以实现数据的共享和负载均衡,从而提高系统的性能和可用性。 分布式缓存的架构主要由以下组件构成: 1. 客户端应用:请求数据的应用程序。 2. 缓存层:存储数据的服务器集群,接收并缓存客户端的请求。 3. 数据源:提供原始数据的数据库或其他数据存储系统。 4. 分布式缓存协议:用于客户端和缓存层之间进行通信的协议,如Memcached协议或Redis协议。 在实现分布式缓存中,可以使用Go语言来开发缓存层服务器。Go语言具有高效的并发性和网络编程能力,适合构建分布式系统。 使用Go语言实现分布式缓存的步骤如下: 1. 设计缓存数据结构:确定缓存存储的数据结构和数据访问方法。 2. 实现缓存服务器:使用Go语言编写缓存服务器代码,包括处理客户端请求、缓存数据的读写等功能。 3. 集群管理:实现监控和管理分布式缓存服务器,包括节点的添加和删除、负载均衡等功能。 4. 客户端接口:为客户端应用提供访问分布式缓存的接口,使其能够通过缓存层访问数据。 使用Go语言实现分布式缓存可以借助一些开源框架和库,如memcached、GoCache等,它们提供了丰富的功能和工具,简化了分布式缓存的开发和管理。 总之,分布式缓存通过在多台服务器上缓存数据,提供了高性能和可伸缩性,其原理是将缓存层插入应用服务器和数据源之间,通过共享和负载均衡来提高系统的性能。Go语言作为一种高效的编程语言,对于实现分布式缓存来说,具有很大的优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值