在工作之余学习golang。
菜鸟。
无职转生实在更新太慢,于是想去看一下小说,小说的网站在手机上不太方便。于是简单的用go写了爬虫爬取该小说。没有用到goroutine,所以爬取其实不太快。
goquery是go写的一个类似于jquery的库。还挺好用。
代码如下:
package main
import (
"fmt"
"github.com/PuerkitoBio/goquery"
"io/ioutil"
"log"
"net/http"
"os"
"regexp"
"strconv"
"strings"
)
func main(){
url := "http://www.bbzayy.com/ldks/9181/"
resp,err := http.Get(url)
if err != nil {
panic(err)
}
defer resp.Body.Close()
bytes,err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
str := string(bytes)
doc, err := goquery.NewDocumentFromReader(strings.NewReader(str))
if err != nil {
log.Fatal(err)
}
//定义一个map
storyHref := make(map[int]string)
doc.Find("body > div.container > div.row.row-section > div > div:nth-child(4) > ul > li > a").Each(func(i int, s *goquery.Selection) {
content,_ := s.Attr("href")
storyHref[i] = content
fmt.Printf("%d: %s\n", i, content)
})
f, err := os.Create("小说" + ".txt")
for i:=0;i<313;i++{
dUrl := "http://www.bbzayy.com"+storyHref[i]
for j := 1;j<=2; j++{
dUrls := dUrl[0 : len(dUrl)-5]+"_"+strconv.Itoa(j)+".html"
fmt.Println(dUrls)
res,err := http.Get(dUrls)
if err != nil {
panic(err)
}
defer res.Body.Close()
bytet,err := ioutil.ReadAll(res.Body)
if err != nil {
panic(err)
}
content := string(bytet)
content = TrimHtml(content)
doct, err := goquery.NewDocumentFromReader(strings.NewReader(content))
if err != nil {
log.Fatal(err)
}
//定义一个map
contents := doct.Find("#content").Text()
buf := []byte(contents)
f.Write(buf)
}
}
f.Close()
}
func TrimHtml(src string) string {
re, _ := regexp.Compile("\\s{2,}")
src = re.ReplaceAllString(src, "\n")
//去除所有的
re, _ = regexp.Compile(" ")
src = re.ReplaceAllString(src, "")
return strings.TrimSpace(src)
}
如果要加上goroutine,因为可能会导致顺序混乱,可以将爬取到的内容 i-content key-value的形式来存储后排序再写入文件即可。