上篇使用php获取了776个两位纯字母/数字.com域名,程序为顺序执行,用时较长,在此考虑使用golang,借助其协程等特性,并发执行;

代码如下:

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

package main

import (
"net/http"
"net"

"time"
"fmt"
"unicode"
"io/ioutil"
"os"
"strings"
)

func main() {

sli := []string{}
for i := 'a'; i <= 'z'; i++ {

for j := 'a'; j <= 'z'; j++ {
sli = append(sli, string(i)+string(j)+".com")
}
}

f, err := os.Create("letter.txt")
defer f.Close()

if err != nil {
panic(err)
}

t := time.Now()

ch := make(chan string)
for _, v := range sli {
go curl(v, ch)
}

for i := 0; i < len(sli); i++ {
str := <-ch

s := strings.Split(str, "||||||")
for _, r := range s[1] {
if unicode.Is(unicode.Scripts["Han"], r) {

_, err = f.Write([]byte("域名" + s[0] + "为中文网站\n"))

fmt.Println("域名" + s[0] + "为中文网站")
if err != nil {
panic(err)
}

break
}
}
}

elapsed := time.Since(t)

fmt.Println("消耗时间:", elapsed)
}

/**
会自动重定向,可参考
https://my.oschina.net/fdhay/blog/690798

部分网站检测到区域为中文,会跳转到对应的中文网站,但如果在header里设置为英文后,部分原属中国的网站也可能会转为英文;在此不加设置
*/
func curl(domain string, ch chan string) string {

c := http.Client{
Transport: &http.Transport{
Dial: func(network, addr string) (net.Conn, error) {
deadline := time.Now().Add(60 * time.Second)
c, err := net.DialTimeout(network, addr, time.Second*50)
if err != nil {
return nil, err
}
c.SetDeadline(deadline)
return c, nil

},
},
}

res, err := c.Get("http://" + domain)

if err != nil {
fmt.Println("出现错误:", err)
}

if res != nil {
body, _ := ioutil.ReadAll(res.Body)
str := domain + "||||||" + string(body) //可考虑使用map优化
ch <- str
return str
defer res.Body.Close()
}

//如果61.com无返回,尝试请求www.61.com
if res == nil {

res2, _ := c.Get("http://www." + domain)

if res2 != nil {
body, _ := ioutil.ReadAll(res2.Body)
str := domain + "||||||" + string(body)
ch <- str
return str
defer res2.Body.Close()
}

}

ch <- domain + "||||||" + ""
return ""
}