对搜索引擎开源项目的代码分析——文档抓取

搜索引擎的文档抓取部分代码分析:
首先

var (    access_token = flag.String("access_token", "", "用户的访问令牌")
    weibo        = gobo.Weibo{}
    users_file   = flag.String("users_file", "users.txt", "从该文件读入要下载的微博用户名,每个名字一行")
    output_file  = flag.String("output_file", "weibo_data.txt", "将抓取的微博写入下面的文件")
    num_weibos   = flag.Int("num_weibos", 2000, "从每个微博账号中抓取多少条微博")
)

 
代码部分运用”flag”包选项用于各种命令行参数的解析;第一行对应access_token的解析规则,-access_token选项对应的值是字符串类型字符串,默认值是””;以下皆是此运用!
在main函数开始部分,flag.Parse()函数进行解析;



func main() {    flag.Parse()

    // 读取用户名
    content, err := ioutil.ReadFile(*users_file)
    if err != nil {
        log.Fatal("无法读取-users_file")
    }
    users := strings.Split(string(content), "\n")

    outputFile, _ := os.Create(*output_file)
    defer outputFile.Close()
    .......
    
其中ioutil.ReadFile和strings.Split函数获取包含微博用户名的部分;个人认为标注红线部分可以进行如下的更改,以使得程序能够顺利运行;
outputFile, error  :=  os.Create(*output_file)
                 if  err != nil {
    panic (err)
}
利用for循环进行获取非空的大量用户的微博,其中下面的代码部分设置了抓取用户微博条数时的时间限制,以此来判定是否抓取顺利;

for _, user := range users {        
        if user == "" {
            continue
        }
        log.Printf("抓取 @%s 的微博", user)
        statuses, err := contrib.GetStatuses(
            &weibo, *access_token, user, 0, *num_weibos, 5000) // 超时5秒
        if err != nil {
            log.Print(err)
            continue
        }

        for _, status := range statuses {
            t, _ := time.Parse("Mon Jan 2 15:04:05 -0700 2006", status.Created_At)
            outputFile.WriteString(fmt.Sprintf(
                "%d||||%d||||%d||||%s||||%d||||%d||||%d||||%s||||%s||||%s\n",
                status.Id, uint32(t.Unix()), status.User.Id, status.User.Screen_Name,
                status.Reposts_Count, status.Comments_Count, status.Attitudes_Count,
                status.Thumbnail_Pic, status.Original_Pic, status.Text))
        }
    }
}


下面的代码再次利用for循环获取一个用户的相关的内容并按照一定的格式写入相关的文件内:

for _, status := range statuses {            t, _ := time.Parse("Mon Jan 2 15:04:05 -0700 2006", status.Created_At)
            outputFile.WriteString(fmt.Sprintf(
                "%d||||%d||||%d||||%s||||%d||||%d||||%d||||%s||||%s||||%s\n",
                status.Id, uint32(t.Unix()), status.User.Id, status.User.Screen_Name,
                status.Reposts_Count, status.Comments_Count, status.Attitudes_Count,
                status.Thumbnail_Pic, status.Original_Pic, status.Text))
 }
        
文件中文件中每行存储了一篇微博,格式如下
 <微博id>||||<时间>||||<用户id>||||<用户名>||||<转贴数>||||<评论数>||||<喜欢数>||||<缩略图>||||<原始图>||||<正文>

你可能感兴趣的:(搜索引擎,go语言)