本文实例讲述了去语言实现的web爬虫方法。分享给大家供大家参考。具体分析如下:
这里使用走的并发特性来并行执行网络爬虫。
修改爬函数来并行的抓取url,并且保证不重复。
代码如下:主要包
导入(
,,“fmt”
)
取物的类型接口{
,,,,,,//获取返回URL的身体内容,并且将在这个页面上找到的URL放到一个切片中。
,,Fetch (url字符串)(身体字符串,字符串url[],犯错错误)
}
//爬行使用访问者从某个URL开始递归的爬取页面,直到达到最大深度。
func爬(url字符串,深度int,取物取物){
,,,,,,//TODO:并行的抓取URL。
,,,,,,//TODO:不重复抓取页面。
,,,,,,//下面并没有实现上面两种情况:
,,如果深度& lt;=0 {
,,,,,,返回
,,}
,,身体,url,犯错:=fetcher.Fetch (url)
,,如果犯错!=nil {
,,,,,,fmt.Println (err)
,,,,,,返回
,,}
,,fmt。Printf("发现:% s % q \ n ", url,身体)
,,_,u:=范围url {
,,,,,,爬(u(访问者)
,,}
,,返回
}
函数main () {
,,爬(" http://golang.org/" 4取物)
}
//fakeFetcher是返回若干结果的访问者。
类型fakeFetcher map [string] * fakeResult
fakeResult struct类型{
,,身体字符串
,,urls ,,,[]字符串
}
func (f * fakeFetcher)获取(url字符串)(字符串、[]字符串错误){
,,如果res,好的:=f (*) [url];好{
,,,,,,返回res.body res.urls, nil
,,}
,,返回",nil, fmt。Errorf(“未找到:% s”, url)
}
//取物是填充后的fakeFetcher。
var访问者=,fakeFetcher {
,,“http://golang.org/?和fakeResult {
,,,,,,“去编程语言”,
,,,,,,[]字符串{
,,,,,,,,,,“http://golang.org/pkg/?
,,,,,,,,,,“http://golang.org/cmd/?
,,,,,,},
,,},
,,“http://golang.org/pkg/?和fakeResult {
,,,,,,“包”,
,,,,,,[]字符串{
,,,,,,,,,,“http://golang.org/?
,,,,,,,,,,“http://golang.org/cmd/?
,,,,,,,,,,“http://golang.org/pkg/fmt/?
,,,,,,,,,,“http://golang.org/pkg/os/?
,,,,,,},
,,},
,,“http://golang.org/pkg/fmt/?和fakeResult {
,,,,,,“包fmt”,
,,,,,,[]字符串{
,,,,,,,,,,“http://golang.org/?
,,,,,,,,,,“http://golang.org/pkg/?
,,,,,,},
,,},
,,“http://golang.org/pkg/os/?和fakeResult {
,,,,,,“包操作系统”,
,,,,,,[]字符串{
,,,,,,,,,,“http://golang.org/?
,,,,,,,,,,“http://golang.org/pkg/?
,,,,,,},
,,},
}
希望本文所述对大家的去语言程序设计有所帮助。