网页地址分析: 首页: http://www.zhenai.com/zhenghun/zhengzhou 第二页: http://www.zhenai.com/zhenghun/zhengzhou/2 第三页: http://www.zhenai.com/zhenghun/zhengzhou/3 第四页: http://www.zhenai.com/zhenghun/zhengzhou/4 规律:url := “http://www.zhenai.com/zhenghun/zhengzhou/” + strconv.Itoa(i)
package main import ( "fmt" "regexp" "strconv" "net/http" "io" "os" ) //提取一个网页所有信息 func HttpGetDB(url string) (result string, err error) { resp, err1 := http.Get(url) if err1 != nil { fmt.Println("HttpGet err=", err) err = err1 return } defer resp.Body.Close() buf := make([]byte, 4096) for { //爬取整个网页 n, err2 := resp.Body.Read(buf) if n ==0 { break } if err2 != nil && err2 != io.EOF { fmt.Println("Read err=", err2) err = err2 return } result += string(buf[:n]) } return } func SpiderPageDB(i int, page chan int) { //获取url //郑州征婚网_郑州征婚信息 url := "http://www.zhenai.com/zhenghun/zhengzhou/" + strconv.Itoa(i) //封装爬取函数 result, err := HttpGetDB(url) if err != nil { return } // 解析、编译正则表达式 //目标年龄 ret := regexp.MustCompile(`objectAge":"(?s:(.*?))"`) //提取所需信息 objectAge := ret.FindAllStringSubmatch(result, -1) // 解析、编译正则表达式 //目标身高 ret2 := regexp.MustCompile(`objectHight":"(?s:(.*?))"`) //提取所需信息 objectHight := ret2.FindAllStringSubmatch(result, -1) // 解析、编译正则表达式 //目标薪水 ret3 := regexp.MustCompile(`objectSalary":"(?s:(.*?))"`) //提取所需信息 objectSalary := ret3.FindAllStringSubmatch(result, -1) //将提取的有用信息存入文件 Save2file(i, objectHight, objectAge, objectSalary) page <- i //与主线程完成同步 } //写入文件中 保存下来 func Save2file(i int, objectHight, objectAge, objectSalary [][]string) { //储存目录 path := "C:/GOSDK/goproject/src/GoWeb/myselef_1/.idea/02-珍爱网提取/"+"第 " + strconv.Itoa(i) + " 页.txt" f, err := os.Create(path) if err != nil { fmt.Println("os.Create(path) err=", err) return } defer f.Close() n := len(objectAge) //条目数 //先打印 表头 f.WriteString("对方身高\t\t对方年龄\t\t对方薪水\n") for i := 1; i < n; i++ { //一行一行写 f.WriteString(objectHight[i][1] + "\t\t"+ objectAge[i][1] + "\t\t" + objectSalary[i][1] + "\n") } } func toWork(start, end int) { fmt.Printf("正在爬取 %d 到 %d 页..\n", start, end) page := make(chan int) for i := start; i <= end; i++ { go SpiderPageDB(i, page) } for i := start; i <= end; i++ { //管道 确保协程运行完毕 fmt.Printf("第%d个网页抓取完成!\n", <-page) } } func main() { //指定爬取起始、终止页面 var start, end int fmt.Println("请输入爬虫起始页:(i>=2)") fmt.Scan(&start) fmt.Println("请输入爬虫终止页:") fmt.Scan(&end) toWork(start, end) }