准備爬取內涵段子的幾則笑話,先查看網址:http://www.budejie.com/text/
簡單分析后發現每頁的url呈加1趨勢
第一頁: http://www.budejie.com/text/1
第二頁:http://www.budejie.com/text/2
...
每頁的段子:
<a href="/detail-28278217.html"> 內容</a>
<a href="/detail-28270675.html"> 內容</a>
....
所以正則表達式的解釋規則是<a href="/detail-\d{8}.html">(?s:(.*?))</a>,第一個分組的內容就是需要的文字。
代碼如下:
package main import ( "fmt" "regexp" "strconv" "net/http" "log" "os" "strings" ) func onespider(n int, ch chan int) { url := "http://www.budejie.com/text/" + strconv.Itoa(n) resp, err := http.Get(url) if err != nil { log.Fatal("get error") } defer resp.Body.Close() reg, err1 := regexp.Compile(`<a href="/detail-\d{8}.html">(?s:(.*?))</a>`) if err1 != nil { log.Fatal("compile error") } var respstring string buf := make([]byte, 1024) for { n, _ := resp.Body.Read(buf) if n == 0 { break } respstring += string(buf[:n]) } cont := reg.FindAllStringSubmatch(respstring, -1) file, _ := os.OpenFile("./爬蟲/"+"第"+strconv.Itoa(n)+"頁爬蟲.txt", os.O_RDWR|os.O_TRUNC|os.O_CREATE, 0666) defer file.CLose() var i int for _, value := range cont { if len(value[1]) < 100 { continue } value[1] = strings.Replace(value[1], "<br />", "\n", -1) index := strconv.Itoa(i+1) file.Write([]byte("第"+index+"則段:\n"+value[1]+"\n\n\n")) i++ } ch <- n } func Spider(s, e int) { ch := make(chan int) for i := s; i <= e; i++ { go onespider(i, ch) } for i := s; i <= e; i++ { n := <- ch fmt.Printf("第%d頁爬取完畢\n", n) } } func main(){ var start, end int fmt.Println("輸入起始頁") fmt.Scan(&start) fmt.Println("輸入終止頁") fmt.Scan(&end) Spider(start, end) }
運行截圖:
效果截圖:
最后我發現第2頁之后的段子都是重復的。。。