對搜索引擎開源項目的代碼分析——文檔抓取

搜索引擎的文檔抓取部分代碼分析:
首先

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>||||<用戶名>||||<轉貼數>||||<評論數>||||<喜歡數>||||<縮略圖>||||<原始圖>||||<正文>
相關文章
相關標籤/搜索