2,190
社区成员
发帖
与我相关
我的任务
分享
func InsertInfo(info map[string]string, session *mgo.Session) {
db := session.DB("test") //数据库名称
collection := db.C("a") //如果该集合已经存在的话,则直接返回
//t := struct{ Url string }{}
//collection.Find(bson.M{}).One(&t)
//fmt.Println(t)
count,_ := collection.Find(nil).Count()
pagecount := count/100
t := struct{ Url string }{}
for i:=0;i<=pagecount;i++ {
query := collection.Find(bson.M{}).Skip(i*100).Limit(100).Batch(2).Iter()
for query.Next(&t) {
go InsertMongo(collection,t.Url)
}
}
}
func InsertMongo(collection *mgo.Collection,url string) {
res1,err :=GetInfo("http://www.cndzys.com"+url)
if err == nil {
collection.Insert(bson.M{"title":res1["title"],"desc":res1["desc"]})
}
}
func InsertInfo(info map[string]string, session *mgo.Session) {
db := session.DB("test") //数据库名称
collection := db.C("a") //如果该集合已经存在的话,则直接返回
//t := struct{ Url string }{}
//collection.Find(bson.M{}).One(&t)
//fmt.Println(t)
count,_ := collection.Find(nil).Count()
pagecount := count/100
t := struct{ Url string }{}
for i:=0;i<=pagecount;i++ {
query := collection.Find(bson.M{}).Skip(i*100).Limit(100).Batch(2).Iter()
for query.Next(&t) {
res1,err :=GetInfo("http://www.cndzys.com"+t.Url)
if err == nil {
db.C("b").Insert(bson.M{"title":res1["title"],"desc":res1["desc"]})
}
}
}
}
func GetInfo(url string) (map[string]string,error) {
res,err := http.Get(url)
info := make(map[string]string)
if err !=nil {
fmt.Println("获取远程内容为空")
return info , errors.New("get url error")
}
body,err := ioutil.ReadAll(res.Body)
if err !=nil {
fmt.Println("解析错误")
return info , errors.New("get body error")
}
html := string(body)
regex1,err := regexp.Compile("<h1>(.*?)</h1>")
regex2,err := regexp.Compile("(?is)<div class=\"content_text\">(.*?)</div>")
des := regex2.FindAllStringSubmatch(html,-1)
titles := regex1.FindStringSubmatch(html)
if (len(titles) < 1) {
return info,errors.New("titles error get")
}
if (len(des) < 1) {
return info,errors.New("desc error get")
}
info["title"] = titles[1]
info["desc"] = des[0][0]
res.Body.Close()
return info,nil
}
limit <- struct{}{}
这行代码就会阻塞,直到其他goroutine执行完GetInfo的这行语句:
<-limit
var limit = make(chan struct{}, 64)
func GetInfo(url string) (map[string]string,error) {
limit <- struct{}{}
defer func() {
<-limit
}()
...
}
func InsertInfo(info map[string]string, session *mgo.Session) {
db := session.DB("test") //数据库名称
collection := db.C("a") //如果该集合已经存在的话,则直接返回
//t := struct{ Url string }{}
//collection.Find(bson.M{}).One(&t)
//fmt.Println(t)
count, _ := collection.Find(nil).Count()
pagecount := count / 100
t := struct{ Url string }{}
var wg sync.WaitGroup
for i := 0; i <= pagecount; i++ {
query := collection.Find(bson.M{}).Skip(i * 100).Limit(100).Batch(2).Iter()
for query.Next(&t) {
wg.Add(1)
go func(uri string) {
InsertMongo(collection, uri)
wg.Done()
}(t.Url)
}
}
wg.Wait()
}