golang 开荒 - 3 - 用原生GO写一个分布式爬虫-单任务版

目标: 获取并打印所有城市第一页用户的详细信息

下载用于处理字符集的官方包,把GBK国民转为UTF-8
go get -g -v golang.org/x/text

这样在 $gopath/src/text/ 下面就会有对应的编码, 在代码中用如下语法可以把GBK等其他编码转为UTF-8等

找到有用的信息

总体逻辑

城市列表解析器 》 单个城市解析器 》 单个用户解析器

css 选择器

golang 有第三方库支持css选择器

$("#cityList>dd>a')
xpath
正则 - 解析器
//  [^>] : 非 > 的字符
re := regexp.MustCompile(`<a href="(http://www.zhenai.com/zhenghun/[0-9a-zA-Z]+)"[^>]*>([^<]+)</a>`)

// -1 表示找到所有的匹配regexp 的字串
matches := re.FindAllSubmatch(contents,-1)




/**
城市列表解析器
 */
func printCity(contents []byte) {
	//  [^>] : 非 > 的字符
	re := regexp.MustCompile(`<a href="(http://www.zhenai.com/zhenghun/[0-9a-zA-Z]+)"[^>]*>([^<]+)</a>`)

	// -1 表示找到所有的匹配regexp 的字串
	matches := re.FindAllSubmatch(contents, -1)


	//for _, m := range matches {
	//	for _, submatch := range m{
	//		// 这里 %s 后面只用空格, 不用换行
	//		//fmt.Printf("%s ", submatch)
	//		fmt.Printf("%s \n", submatch)
	//
	//	}
	//	fmt.Println()
	//}

	// 显示 : City: 淄博, URL: http://www.zhenai.com/zhenghun/zibo
	for _, m := range matches{
		fmt.Printf("City: %s, URL: %s \n",m[2],m[1])
	}

	fmt.Printf("matches total num:  %d \n", len(matches))

}

单任务版爬虫架构

在这里插入图片描述

request : 数据交互的桥梁的通道, 本项目就是没爬过的 url
fetcher : 从网络上获取html内容的模板(对应utf-8),
engine : 从队列里面取任务, 然后用fetcher 去拿html 数据, 拿到数据后把文本给解析器,解析器返回解析后的数据和新的任务(如发现页面里还有其他页面的链接),再加入 任务队列
paser : 解析器,接收 fetcher 取到的 html 代码,开始爬,同时拿到关联的 url, 再加到任务队列里面

Engine
package engine

import (
	"log"
	"mods/pachong/fetcher"
)

// ...Request 表示接受多个 Request
func Run(seeds ...Request){

	// 把seeds中的每一个request 传到 requests中
	var requests []Request
	for _, r := range seeds{
		requests = append(requests, r)
	}

	// 遍历requests
	for 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值