-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathspider.go
More file actions
126 lines (119 loc) · 3.04 KB
/
Copy pathspider.go
File metadata and controls
126 lines (119 loc) · 3.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package main
import (
"flag"
"fmt"
"net/http"
"os"
"strings"
"time"
lib "github.com/nicle-lin/spider/examples/finder/inter"
"github.com/nicle-lin/spider/examples/finder/monitor"
"github.com/nicle-lin/spider/helper/log"
sched "github.com/nicle-lin/spider/scheduler"
)
// 命令参数。
var (
firstURL string
domains string
depth uint
dirPath string
)
// 日志记录器。
var logger = log.DLogger()
func init() {
flag.StringVar(&firstURL, "first", "http://zhihu.sogou.com/zhihu?query=golang+logo",
"The first URL which you want to access.")
flag.StringVar(&domains, "domains", "zhihu.com",
"The primary domains which you accepted. "+
"Please using comma-separated multiple domains.")
flag.UintVar(&depth, "depth", 3,
"The depth for crawling.")
flag.StringVar(&dirPath, "dir", "./pictures",
"The path which you want to save the image files.")
}
func Usage() {
fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
fmt.Fprintf(os.Stderr, "\tfinder [flags] \n")
fmt.Fprintf(os.Stderr, "Flags:\n")
flag.PrintDefaults()
}
func main() {
flag.Usage = Usage
flag.Parse()
// 创建调度器。
scheduler := sched.NewScheduler()
// 准备调度器的初始化参数。
domainParts := strings.Split(domains, ",")
acceptedDomains := []string{}
for _, domain := range domainParts {
domain = strings.TrimSpace(domain)
if domain != "" {
acceptedDomains =
append(acceptedDomains, domain)
}
}
requestArgs := sched.RequestArgs{
AcceptedDomains: acceptedDomains,
MaxDepth: uint32(depth),
}
dataArgs := sched.DataArgs{
ReqBufferCap: 50,
ReqMaxBufferNumber: 1000,
RespBufferCap: 50,
RespMaxBufferNumber: 10,
ItemBufferCap: 50,
ItemMaxBufferNumber: 100,
ErrorBufferCap: 50,
ErrorMaxBufferNumber: 1,
}
downloaders, err := lib.GetDownloaders(1)
if err != nil {
logger.Fatalf("An error occurs when creating downloaders: %s", err)
}
analyzers, err := lib.GetAnalyzers(1)
if err != nil {
logger.Fatalf("An error occurs when creating analyzers: %s", err)
}
pipelines, err := lib.GetPipelines(1, dirPath)
if err != nil {
logger.Fatalf("An error occurs when creating pipelines: %s", err)
}
moduleArgs := sched.ModuleArgs{
Downloaders: downloaders,
Analyzers: analyzers,
Pipelines: pipelines,
}
// 初始化调度器。
err = scheduler.Init(
requestArgs,
dataArgs,
moduleArgs)
if err != nil {
logger.Fatalf("An error occurs when initializing scheduler: %s", err)
}
// 准备监控参数。
checkInterval := time.Second
summarizeInterval := 100 * time.Millisecond
maxIdleCount := uint(5)
// 开始监控。
checkCountChan := monitor.Monitor(
scheduler,
checkInterval,
summarizeInterval,
maxIdleCount,
true,
lib.Record)
// 准备调度器的启动参数。
firstHTTPReq, err := http.NewRequest("GET", firstURL, nil)
if err != nil {
logger.Fatalln(err)
return
}
// 开启调度器
err = scheduler.Start(firstHTTPReq)
if err != nil {
logger.Fatalf("An error occurs when starting scheduler: %s", err)
}
// 等待监控结束。
<-checkCountChan
}