目标: 获取并打印所有城市第一页用户的详细信息
下载用于处理字符集的官方包,把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