該文章為 weibo-crawler 的官方文件,為了方便國內的同學閱讀而轉載。
原文地址:https://github.com/dataabc/weibo-crawler
原始碼我也下載了一份,讀者可以在我的公眾號上回復“分享資料”來獲取,路徑如下:
以下是正文:
功能
連續爬取一個或多個新浪微博使用者(如迪麗熱巴、郭碧婷)的資料,並將結果資訊寫入檔案。寫入資訊幾乎包括了使用者微博的所有資料,主要有使用者資訊和微博資訊兩大類,前者包含使用者暱稱、關注數、粉絲數、微博數等等;後者包含微博正文、釋出時間、釋出工具、評論數等等,因為內容太多,這裡不再贅述,詳細內容見輸出部分。具體的寫入檔案型別如下:
- 寫入 csv 檔案(預設)
- 寫入 json 檔案(可選)
- 寫入 MySQL 資料庫(可選)
- 寫入 MongoDB 資料庫(可選)
- 寫入 SQLite 資料庫(可選)
- 下載使用者原創微博中的原始圖片(可選)
- 下載使用者轉發微博中的原始圖片(可選)
- 下載使用者原創微博中的影片(可選)
- 下載使用者轉發微博中的影片(可選)
- 下載使用者原創微博 Live Photo 中的影片(可選)
- 下載使用者轉發微博 Live Photo 中的影片(可選)
- 下載使用者原創和轉發微博下的一級評論(可選)
- 下載使用者原創和轉發微博下的轉發(可選)
如果你只對使用者資訊感興趣,而不需要爬使用者的微博,也可以透過設定實現只爬取微博使用者資訊的功能。程式也可以實現爬取結果自動更新,即:現在爬取了目標使用者的微博,幾天之後,目標使用者可能又發新微博了。透過設定,可以實現每隔幾天增量爬取使用者這幾天發的新微博。具體方法見定期自動爬取微博。
輸出
使用者資訊
- 使用者 id:微博使用者 id,如"1669879400"
- 使用者暱稱:微博使用者暱稱,如"Dear-迪麗熱巴"
- 性別:微博使用者性別
- 生日:使用者出生日期
- 所在地:使用者所在地
- 教育經歷:使用者上學時學校的名字
- 公司:使用者所屬公司名字
- 陽光信用:使用者的陽光信用
- 微博註冊時間:使用者微博註冊日期
- 微博數:使用者的全部微博數(轉發微博 + 原創微博)
- 粉絲數:使用者的粉絲數
- 關注數:使用者關注的微博數量
- 簡介:使用者簡介
- 主頁地址:微博移動版主頁 url,如 https://m.weibo.cn/u/1669879400?uid=1669879400&luicode=10000011&lfid=1005051669879400
- 頭像 url:使用者頭像 url
- 高畫質頭像 url:使用者高畫質頭像 url
- 微博等級:使用者微博等級
- 會員等級:微博會員使用者等級,普通使用者該等級為 0
- 是否認證:使用者是否認證,為布林型別
- 認證型別:使用者認證型別,如個人認證、企業認證、政府認證等
- 認證資訊:為認證使用者特有,使用者資訊欄顯示的認證資訊
微博資訊
- 微博 id:微博的 id,為一串數字形式
- 微博 bid:微博的 bid,與 cookie 版中的微博 id 是同一個值
- 微博內容:微博正文
- 頭條文章 url:微博中頭條文章的 url,如果微博中存在頭條文章,就獲取該頭條文章的 url,否則該值為''
- 原始圖片 url:原創微博圖片和轉發微博轉發理由中圖片的 url,若某條微博存在多張圖片,則每個 url 以英文逗號分隔,若沒有圖片則值為''
- 影片 url: 微博中的影片 url 和 Live Photo 中的影片 url,若某條微博存在多個影片,則每個 url 以英文分號分隔,若沒有影片則值為''
- 微博釋出位置:位置微博中的釋出位置
- 微博釋出時間:微博釋出時的時間,精確到天
- 點贊數:微博被讚的數量
- 轉發數:微博被轉發的數量
- 評論數:微博被評論的數量
- 微博釋出工具:微博的釋出工具,如 iPhone 客戶端、HUAWEI Mate 20 Pro 等,若沒有則值為''
- 話題:微博話題,即兩個#中的內容,若存在多個話題,每個 url 以英文逗號分隔,若沒有則值為''
- @ 使用者:微博 @ 的使用者,若存在多個 @ 使用者,每個 url 以英文逗號分隔,若沒有則值為''
- 原始微博:為轉發微博所特有,是轉發微博中那條被轉發的微博,儲存為字典形式,包含了上述微博資訊中的所有內容,如微博 id、微博內容等等
- 結果檔案:儲存在當前目錄 weibo 資料夾下以使用者暱稱為名的資料夾裡,名字為"user_id.csv"形式
- 微博圖片:微博中的圖片,儲存在以使用者暱稱為名的資料夾下的 img 資料夾裡
- 微博影片:微博中的影片,儲存在以使用者暱稱為名的資料夾下的 video 資料夾裡
例項
以爬取迪麗熱巴的微博為例,我們需要修改 config.json 檔案,檔案內容如下:
{
"user_id_list": ["1669879400"],
"only_crawl_original": 1,
"since_date": "1900-01-01",
"query_list": [],
"write_mode": ["csv"],
"original_pic_download": 1,
"retweet_pic_download": 0,
"original_video_download": 1,
"retweet_video_download": 0,
"cookie": "your cookie"
}
對於上述引數的含義以及取值範圍,這裡僅作簡單介紹,詳細資訊見程式設定。
user_id_list 代表我們要爬取的微博使用者的 user_id,可以是一個或多個,也可以是檔案路徑,微博使用者 Dear-迪麗熱巴的 user_id 為 1669879400,具體如何獲取 user_id 見如何獲取 user_id;
only_crawl_original 的值為 1 代表爬取全部原創微博,值為 0 代表爬取全部微博(原創 + 轉發);
since_date 代表我們要爬取 since_date 日期之後釋出的微博,因為我要爬迪麗熱巴的全部原創微博,所以 since_date 設定了一個非常早的值; query_list 代表要爬取的微博關鍵詞,為空([])則爬取全部;
write_mode 代表結果檔案的儲存型別,我想要把結果寫入 csv 檔案和 json 檔案,所以它的值為["csv", "json"],如果你想寫入資料庫,具體設定見設定資料庫;
original_pic_download 值為 1 代表下載原創微博中的圖片,值為 0 代表不下載;
retweet_pic_download 值為 1 代表下載轉發微博中的圖片,值為 0 代表不下載;
original_video_download 值為 1 代表下載原創微博中的影片,值為 0 代表不下載;
retweet_video_download 值為 1 代表下載轉發微博中的影片,值為 0 代表不下載;
cookie 是可選引數,可填可不填,具體區別見新增 cookie 與不新增 cookie 的區別。
配置完成後執行程式:
python weibo.py
程式會自動生成一個 weibo 資料夾,我們以後爬取的所有微博都被儲存在 weibo 資料夾裡。然後程式在該資料夾下生成一個名為"Dear-迪麗熱巴"的資料夾,迪麗熱巴的所有微博爬取結果都在這裡。"Dear-迪麗熱巴"資料夾裡包含一個 csv 檔案、一個 img 資料夾和一個 video 資料夾,img 資料夾用來儲存下載到的圖片,video 資料夾用來儲存下載到的影片。如果你設定了儲存資料庫功能,這些資訊也會儲存在資料庫裡,資料庫設定見設定資料庫部分。
csv 檔案結果如下所示:
本 csv 檔案是爬取“全部微博”(原創微博 + 轉發微博)的結果檔案。因為迪麗熱巴很多微博本身都沒有圖片、釋出工具、位置、話題和 @ 使用者等資訊,所以當這些內容沒有時對應位置為空。"是否原創"列用來標記是否為原創微博, 當為轉發微博時,檔案中還包含轉發微博的資訊。為了簡便起見,姑且將轉發微博中被轉發的原始微博稱為源微博,它的使用者 id、暱稱、微博 id 等都在名稱前加上源字,以便與目標使用者自己發的微博區分。對於轉發微博,程式除了獲取使用者原創部分的資訊,還會獲取源使用者 id、源使用者暱稱、源微博 id、源微博正文、源微博原始圖片 url、源微博位置、源微博日期、源微博工具、源微博點贊數、源微博評論數、源微博轉發數、源微博話題、源微博 @ 使用者等資訊。原創微博因為沒有這些轉發資訊,所以對應位置為空。若爬取的是"全部原創微博",則 csv 檔案中不會包含"是否原創"及其之後的轉發屬性列;
為了說明 json 結果檔案格式,這裡以迪麗熱巴 2019 年 12 月 27 日到 2019 年 12 月 28 日發的 2 條微博為例。
json 結果檔案格式如下:
{
"user": {
"id": "1669879400",
"screen_name": "Dear-迪麗熱巴",
"gender": "f",
"birthday": "雙子座",
"location": "上海",
"education": "上海戲劇學院",
"company": "嘉行傳媒",
"registration_time": "2010-07-02",
"sunshine": "信用極好",
"statuses_count": 1121,
"followers_count": 66395881,
"follow_count": 250,
"description": "一隻喜歡默默表演的小透明。工作聯絡jaywalk@jaywalk.com.cn 🍒",
"profile_url": "https://m.weibo.cn/u/1669879400?uid=1669879400&luicode=10000011&lfid=1005051669879400",
"profile_image_url": "https://tvax2.sinaimg.cn/crop.0.0.1080.1080.180/63885668ly8gb5sqc19mqj20u00u0mz5.jpg?KID=imgbed,tva&Expires=1584108150&ssig=Zay1N7KhK1",
"avatar_hd": "https://wx2.sinaimg.cn/orj480/63885668ly8gb5sqc19mqj20u00u0mz5.jpg",
"urank": 44,
"mbrank": 7,
"verified": true,
"verified_type": 0,
"verified_reason": "嘉行傳媒簽約演員 "
},
"weibo": [
{
"user_id": 1669879400,
"screen_name": "Dear-迪麗熱巴",
"id": 4454572602912349,
"bid": "ImTGkcdDn",
"text": "今天的#星光大賞# ",
"pics": "https://wx3.sinaimg.cn/large/63885668ly1gacppdn1nmj21yi2qp7wk.jpg,https://wx4.sinaimg.cn/large/63885668ly1gacpphkj5gj22ik3t0b2d.jpg,https://wx4.sinaimg.cn/large/63885668ly1gacppb4atej22yo4g04qr.jpg,https://wx2.sinaimg.cn/large/63885668ly1gacpn0eeyij22yo4g04qr.jpg",
"video_url": "",
"location": "",
"created_at": "2019-12-28",
"source": "",
"attitudes_count": 551894,
"comments_count": 182010,
"reposts_count": 1000000,
"topics": "星光大賞",
"at_users": ""
},
{
"user_id": 1669879400,
"screen_name": "Dear-迪麗熱巴",
"id": 4454081098040623,
"bid": "ImGTzxJJt",
"text": "我最愛用的嬌韻詩雙萃精華穿上限量“金”裝啦,希望阿絲兒們跟我一起在新的一年更美更年輕,喜笑顏開沒有細紋困擾!限定新春禮盒還有祝福悄悄話,大家瞭解一下~",
"pics": "",
"video_url": "",
"location": "",
"created_at": "2019-12-27",
"source": "",
"attitudes_count": 190840,
"comments_count": 43523,
"reposts_count": 1000000,
"topics": "",
"at_users": "",
"retweet": {
"user_id": 1684832145,
"screen_name": "法國嬌韻詩",
"id": 4454028484570123,
"bid": "ImFwIjaTF",
"text": "#點萃成金 年輕煥新# 將源自天然的植物力量,轉化為滴滴珍貴如金的雙萃精華。這份點萃成金的獨到匠心,只為守護嬌粉們的美麗而來。點選影片,與@Dear-迪麗熱巴 一同邂逅新年限量版黃金雙萃,以閃耀開運金,送上新春寵肌臻禮。 跟著迪迪選年貨,還有雙重新春驚喜,愛麗絲們看這裡! 第一重參與微淘活動邀請好友關注嬌韻詩天貓旗艦店,就有機會贏取限量款熱巴新年禮盒,開啟就能聆聽仙女迪親口送出的新春祝福哦!點選網頁連結下單曬熱巴同款黃金雙萃,並且@法國嬌韻詩,更有機會獲得熱巴親筆簽名的禮盒哦! 第二重轉評說出新年希望嬌韻詩為你解決的肌膚願望,截止至1/10,小嬌將從鐵粉中抽取1位嬌粉送出限量版熱巴定製禮盒,抽取3位嬌粉送出熱巴明信片1張~ #迪麗熱巴代言嬌韻詩#養成同款御齡美肌,就從現在開始。法國嬌韻詩的微博影片",
"pics": "",
"video_url": "http://f.video.weibocdn.com/003vQjnRlx07zFkxIMjS010412003bNx0E010.mp4?label=mp4_hd&template=852x480.25.0&trans_finger=62b30a3f061b162e421008955c73f536&Expires=1578322522&ssig=P3ozrNA3mv&KID=unistore,video",
"location": "",
"created_at": "2019-12-27",
"source": "微博 weibo.com",
"attitudes_count": 18389,
"comments_count": 3201,
"reposts_count": 1000000,
"topics": "點萃成金 年輕煥新,迪麗熱巴代言嬌韻詩",
"at_users": "Dear-迪麗熱巴,法國嬌韻詩"
}
}
]
}
下載的圖片如下所示:
本次下載了 788 張圖片,大小一共 1.21GB,包括她原創微博中的所有圖片。圖片名為 yyyymmdd+ 微博 id 的形式,若某條微博存在多張圖片,則圖片名中還會包括它在微博圖片中的序號。若某圖片下載失敗,程式則會以“weibo_id:pic_url”的形式將出錯微博 id 和圖片 url 寫入同資料夾下的 not_downloaded.txt 裡;若圖片全部下載成功則不會生成 not_downloaded.txt;
下載的影片如下所示:
本次下載了 66 個影片,是她原創微博中的影片和原創微博 Live Photo 中的影片,影片名為 yyyymmdd+ 微博 id 的形式。有三個影片因為網路原因下載失敗,程式將它們的微博 id 和影片 url 分別以“weibo_id:video_url”的形式寫到了同資料夾下的 not_downloaded.txt 裡。
因為我本地沒有安裝 MySQL 資料庫和 MongoDB 資料庫,所以暫時設定成不寫入資料庫。如果你想要將爬取結果寫入資料庫,只需要先安裝資料庫(MySQL 或 MongoDB),再安裝對應包(pymysql 或 pymongo),然後將 mysql_write 或 mongodb_write 值設定為 1 即可。寫入 MySQL 需要使用者名稱、密碼等配置資訊,這些配置如何設定見設定資料庫部分。
執行環境
- 開發語言:python2/python3
- 系統: Windows/Linux/macOS
使用說明
1.下載指令碼
git clone https://github.com/dataabc/weibo-crawler.git
執行上述命令,將本專案下載到當前目錄,如果下載成功當前目錄會出現一個名為"weibo-crawler"的資料夾;
2.安裝依賴
pip install -r requirements.txt
3.程式設定
開啟 config.json 檔案,你會看到如下內容:
{
"user_id_list": ["1669879400"],
"only_crawl_original": 1,
"remove_html_tag": 1,
"since_date": "2018-01-01",
"write_mode": ["csv"],
"original_pic_download": 1,
"retweet_pic_download": 0,
"original_video_download": 1,
"retweet_video_download": 0,
"download_comment":1,
"comment_max_download_count":1000,
"download_repost": 1,
"repost_max_download_count": 1000,
"user_id_as_folder_name": 0,
"cookie": "your cookie",
"mysql_config": {
"host": "localhost",
"port": 3306,
"user": "root",
"password": "123456",
"charset": "utf8mb4"
},
"mongodb_URI": "mongodb://[username:password@]host[:port][/[defaultauthdb][?options]]",
"post_config": {
"api_url": "https://api.example.com",
"api_token": ""
}
}
下面講解每個引數的含義與設定方法。
設定 user_id_list
user_id_list 是我們要爬取的微博的 id,可以是一個,也可以是多個,例如:
"user_id_list": ["1223178222", "1669879400", "1729370543"],
上述程式碼代表我們要連續爬取 user_id 分別為“1223178222”、 “1669879400”、 “1729370543”的三個使用者的微博,具體如何獲取 user_id 見如何獲取 user_id。
user_id_list 的值也可以是檔案路徑,我們可以把要爬的所有微博使用者的 user_id 都寫到 txt 檔案裡,然後把檔案的位置路徑賦值給 user_id_list。
在 txt 檔案中,每個 user_id 佔一行,也可以在 user_id 後面加註釋(可選),如使用者暱稱等資訊,user_id 和註釋之間必需要有空格,檔名任意,型別為 txt,位置位於本程式的同目錄下,檔案內容示例如下:
1223178222 胡歌
1669879400 迪麗熱巴
1729370543 郭碧婷
假如檔案叫 user_id_list.txt,則 user_id_list 設定程式碼為:
"user_id_list": "user_id_list.txt",
設定 only_crawl_original
only_crawl_original 控制爬取範圍,值為 1 代表爬取全部原創微博,值為 0 代表爬取全部微博(原創 + 轉發)。例如,如果要爬全部原創微博,請使用如下程式碼:
"only_crawl_original": 1,
設定 since_date
since_date 值可以是日期,也可以是整數。如果是日期,代表爬取該日期之後的微博,格式應為“yyyy-mm-dd”,如:
"since_date": "2018-01-01",
代表爬取從 2018 年 1 月 1 日到現在的微博。
如果是整數,代表爬取最近 n 天的微博,如:
"since_date": 10,
代表爬取最近 10 天的微博,這個說法不是特別準確,準確說是爬取釋出時間從 10 天前到本程式開始執行時之間的微博。
since_date 是所有 user 的爬取起始時間,非常不靈活。如果你要爬多個使用者,並且想單獨為每個使用者設定一個 since_date,可以使用定期自動爬取微博方法二中的方法,該方法可以為多個使用者設定不同的 since_date,非常靈活。
設定 query_list(可選)
query_list 是一個關鍵詞字串列表或以 ,
分隔關鍵詞的字串,用於指定關鍵詞搜尋爬取,若為空 []
或 ""
則爬取全部微博。例如要爬取使用者包含“夢想”和“希望”的微博,則設定如下:
"query_list": ["夢想","希望"],
"query_list": "夢想,希望",
請注意,關鍵詞搜尋必須設定 cookie
資訊。query_list 是所有 user 的爬取關鍵詞,非常不靈活。如果你要爬多個使用者,並且想單獨為每個使用者設定一個 query_list,可以使用定期自動爬取微博方法二中的方法,該方法可以為多個使用者設定不同的 query_list,非常靈活。
設定 remove_html_tag
remove_html_tag 控制是否移除抓取到的 weibo 正文和評論中的 html tag,值為 1 代表移除,值為 0 代表不移除,如
"remove_html_tag": 1,
代表移除 html tag。
例如 專屬新意,色彩啟程~<a href='/n/路易威登'>@路易威登</a> CAPUCINES 手袋正合我意,開啟靈感包袋的搭配新方式!
會被處理成 專屬新意,色彩啟程~@路易威登 CAPUCINES 手袋正合我意,開啟靈感包袋的搭配新方式!
。
設定 write_mode
write_mode 控制結果檔案格式,取值範圍是 csv、json、post、mongo、mysql 和 sqlite,分別代表將結果寫入 csv、json 檔案,透過 POST 發出,MongoDB、MySQL 和 SQLite 資料庫。write_mode 可以同時包含這些取值中的一個或幾個,如:
"write_mode": ["csv", "json"],
代表將結果資訊寫入 csv 檔案和 json 檔案。特別注意,如果你想寫入資料庫,除了在 write_mode 新增對應資料庫的名字外,還應該安裝相關資料庫和對應 python 模組,具體操作見設定資料庫部分。
設定 original_pic_download
original_pic_download 控制是否下載原創微博中的圖片,值為 1 代表下載,值為 0 代表不下載,如
"original_pic_download": 1,
代表下載原創微博中的圖片。
設定 retweet_pic_download
retweet_pic_download 控制是否下載轉發微博中的圖片,值為 1 代表下載,值為 0 代表不下載,如
"retweet_pic_download": 0,
代表不下載轉發微博中的圖片。特別注意,本設定只有在爬全部微博(原創 + 轉發),即 only_crawl_original 值為 0 時生效,否則程式會跳過轉發微博的圖片下載。
設定 original_video_download
original_video_download 控制是否下載原創微博中的影片和原創微博 Live Photo 中的影片,值為 1 代表下載,值為 0 代表不下載,如
"original_video_download": 1,
代表下載原創微博中的影片和原創微博 Live Photo 中的影片。
設定 retweet_video_download
retweet_video_download 控制是否下載轉發微博中的影片和轉發微博 Live Photo 中的影片,值為 1 代表下載,值為 0 代表不下載,如
"retweet_video_download": 0,
代表不下載轉發微博中的影片和轉發微博 Live Photo 中的影片。特別注意,本設定只有在爬全部微博(原創 + 轉發),即 only_crawl_original 值為 0 時生效,否則程式會跳過轉發微博的影片下載。
設定 user_id_as_folder_name
user_id_as_folder_name 控制結果檔案的目錄名,可取值為 0 和 1,預設為 0:
"user_id_as_folder_name": 0,
值為 0,表示將結果檔案儲存在以使用者暱稱為名的資料夾裡,這樣結果更清晰;值為 1 表示將結果檔案儲存在以使用者 id 為名的資料夾裡,這樣能保證多次爬取的一致性,因為使用者暱稱可變,使用者 id 不可變。
設定 download_comment
download_comment 控制是否下載每條微博下的一級評論(不包括對評論的評論),僅當 write_mode 中有 sqlite 時有效,可取值為 0 和 1,預設為 1:
"download_comment": 1,
值為 1,表示下載微博評論;值為 0,表示不下載微博評論。
設定 comment_max_download_count
comment_max_download_count 控制下載評論的最大數量,僅當 write_mode 中有 sqlite 時有效,預設為 1000:
"comment_max_download_count": 1000,
設定 download_repost
download_repost 控制是否下載每條微博下的轉發,僅當 write_mode 中有 sqlite 時有效,可取值為 0 和 1,預設為 1:
"download_repost": 1,
值為 1,表示下載微博轉發;值為 0,表示不下載微博轉發。
設定 repost_max_download_count
repost_max_download_count 控制下載轉發的最大數量,僅當 write_mode 中有 sqlite 時有效,預設為 1000:
"repost_max_download_count": 1000,
值為 1000,表示最多下載每條微博下的 1000 條轉發。
設定 cookie(可選)
cookie 為可選引數,即可填可不填,具體區別見新增 cookie 與不新增 cookie 的區別。cookie 預設配置如下:
"cookie": "your cookie",
如果想要設定 cookie,可以按照如何獲取 cookie 中的方法,獲取 cookie,並將上面的"your cookie"替換成真實的 cookie 即可。
設定 mysql_config(可選)
mysql_config 控制 mysql 引數配置。如果你不需要將結果資訊寫入 mysql,這個引數可以忽略,即刪除或保留都無所謂;如果你需要寫入 mysql 且 config.json 檔案中 mysql_config 的配置與你的 mysql 配置不一樣,請將該值改成你自己 mysql 中的引數配置。
設定 mongodb_URI(可選)
mongodb_URI 是 mongodb 的連線字串。如果你不需要將結果資訊寫入 mongodb,這個引數可以忽略,即刪除或保留都無所謂;如果你需要寫入 mongodb,則需要配置為完整的 mongodb URI。
設定 start_page(可選)
start_page 為爬取微博的初始頁數,預設引數為 1,即從所爬取使用者的當前第一頁微博內容開始爬取。 若在大批次爬取微博時出現中途被限制中斷的情況,可透過檢視 csv 檔案內目前已爬取到的微博數除以 10,向下取整後的值即為中斷頁數,手動設定 start_page 引數為中斷頁數,重新執行即可從被中斷的節點繼續爬取剩餘微博內容。
4.設定資料庫(可選)
本部分是可選部分,如果不需要將爬取資訊寫入資料庫,可跳過這一步。本程式目前支援 MySQL 資料庫和 MongoDB 資料庫,如果你需要寫入其它資料庫,可以參考這兩個資料庫的寫法自己編寫。
MySQL 資料庫寫入
要想將爬取資訊寫入 MySQL,請根據自己的系統環境安裝 MySQL,然後命令列執行:
pip install pymysql
MongoDB 資料庫寫入
要想將爬取資訊寫入 MongoDB,請根據自己的系統環境安裝 MongoDB,然後命令列執行:
pip install pymongo
MySQL 和 MongDB 資料庫的寫入內容一樣。程式首先會建立一個名為"weibo"的資料庫,然後再建立"user"表和"weibo"表,包含爬取的所有內容。爬取到的微博使用者資訊或插入或更新,都會儲存到 user 表裡;爬取到的微博資訊或插入或更新,都會儲存到 weibo 表裡,兩個表透過 user_id 關聯。如果想了解兩個表的具體欄位,請點選"詳情"。
詳情
user 表
id:微博使用者 id,如"1669879400";
screen_name:微博使用者暱稱,如"Dear-迪麗熱巴";
gender:微博使用者性別,取值為 f 或 m,分別代表女和男;
birthday:生日;
location:所在地;
education:教育經歷;
company:公司;
sunshine:陽光信用;
registration_time:註冊時間;
statuses_count:微博數;
followers_count:粉絲數;
follow_count:關注數;
description:微博簡介;
profile_url:微博主頁,如 https://m.weibo.cn/u/1669879400?uid=1669879400&luicode=10000011&lfid=1005051669879400;
profile_image_url:微博頭像 url;
avatar_hd:微博高畫質頭像 url;
urank:微博等級;
mbrank:微博會員等級,普通使用者會員等級為 0;
verified:微博是否認證,取值為 true 和 false;
verified_type:微博認證型別,沒有認證值為-1,個人認證值為 0,企業認證值為 2,政府認證值為 3,這些型別僅是個人猜測,應該不全,大家可以根據實際情況判斷;
verified_reason:微博認證資訊,只有認證使用者擁有此屬性。
weibo 表
user_id:儲存微博使用者 id,如"1669879400";
screen_name:儲存微博暱稱,如"Dear-迪麗熱巴";
id:儲存微博 id;
text:儲存微博正文;
article_url:儲存微博中頭條文章的 url,如果微博中存在頭條文章,就獲取該頭條文章的 url,否則該值為'';
pics:儲存原創微博的原始圖片 url。若某條微博有多張圖片,則儲存多個 url,以英文逗號分割;若該微博沒有圖片,則值為'';
video_url:儲存原創微博的影片 url 和 Live Photo 中的影片 url。若某條微博有多個影片,則儲存多個 url,以英文分號分割;若該微博沒有影片,則值為'';
location:儲存微博的釋出位置。若某條微博沒有位置資訊,則值為'';
created_at:儲存微博的釋出時間;
source:儲存微博的釋出工具;
attitudes_count:儲存微博獲得的點贊數;
comments_count:儲存微博獲得的評論數;
reposts_count:儲存微博獲得的轉發數;
topics:儲存微博話題,即兩個#中的內容。若某條微博沒有話題資訊,則值為'';
at_users:儲存微博 @ 的使用者。若某條微博沒有 @ 的使用者,則值為'';
retweet_id:儲存轉發微博中原始微博的微博 id。若某條微博為原創微博,則值為''。
SQLite 資料庫寫入指令碼會自動建立並配置資料庫檔案 weibodata.db
。
5.執行指令碼
大家可以根據自己的執行環境選擇執行方式,Linux 可以透過
python weibo.py
執行;
6.按需求修改指令碼(可選)
本部分為可選部分,如果你不需要自己修改程式碼或新增新功能,可以忽略此部分。
本程式所有程式碼都位於 weibo.py 檔案,程式主體是一個 Weibo 類,上述所有功能都是透過在 main 函式呼叫 Weibo 類實現的,預設的呼叫程式碼如下:
if not os.path.isfile('./config.json'):
sys.exit(u'當前路徑:%s 不存在配置檔案config.json' %
(os.path.split(os.path.realpath(__file__))[0] + os.sep))
with open('./config.json') as f:
config = json.loads(f.read())
wb = Weibo(config)
wb.start() # 爬取微博資訊
使用者可以按照自己的需求呼叫或修改 Weibo 類。
透過執行本程式,我們可以得到很多資訊:
wb.user:儲存目標微博使用者資訊;
wb.user 包含爬取到的微博使用者資訊,如使用者 id、使用者暱稱、性別、生日、所在地、教育經歷、公司、陽光信用、微博註冊時間、微博數、粉絲數、關注數、簡介、主頁地址、頭像 url、高畫質頭像 url、微博等級、會員等級、是否認證、認證型別、認證資訊等,大家可以點選"詳情"檢視具體用法。
詳情
id:微博使用者 id,取值方式為 wb.user['id'],由一串數字組成;
screen_name:微博使用者暱稱,取值方式為 wb.user['screen_name'];
gender:微博使用者性別,取值方式為 wb.user['gender'],取值為 f 或 m,分別代表女和男;
birthday:微博使用者生日,取值方式為 wb.user['birthday'],若使用者沒有填寫該資訊,則值為'';
location:微博使用者所在地,取值方式為 wb.user['location'],若使用者沒有填寫該資訊,則值為'';
education:微博使用者上學時的學校,取值方式為 wb.user['education'],若使用者沒有填寫該資訊,則值為'';
company:微博使用者所屬的公司,取值方式為 wb.user['company'],若使用者沒有填寫該資訊,則值為'';
sunshine:微博使用者的陽光信用,取值方式為 wb.user['sunshine'];
registration_time:微博使用者的註冊時間,取值方式為 wb.user['registration_time'];
statuses_count:微博數,取值方式為 wb.user['statuses_count'];
followers_count:微博粉絲數,取值方式為 wb.user['followers_count'];
follow_count:微博關注數,取值方式為 wb.user['follow_count'];
description:微博簡介,取值方式為 wb.user['description'];
profile_url:微博主頁,取值方式為 wb.user['profile_url'];
profile_image_url:微博頭像 url,取值方式為 wb.user['profile_image_url'];
avatar_hd:微博高畫質頭像 url,取值方式為 wb.user['avatar_hd'];
urank:微博等級,取值方式為 wb.user['urank'];
mbrank:微博會員等級,取值方式為 wb.user['mbrank'],普通使用者會員等級為 0;
verified:微博是否認證,取值方式為 wb.user['verified'],取值為 true 和 false;
verified_type:微博認證型別,取值方式為 wb.user['verified_type'],沒有認證值為-1,個人認證值為 0,企業認證值為 2,政府認證值為 3,這些型別僅是個人猜測,應該不全,大家可以根據實際情況判斷;
verified_reason:微博認證資訊,取值方式為 wb.user['verified_reason'],只有認證使用者擁有此屬性。
wb.weibo:儲存爬取到的所有微博資訊;
wb.weibo 包含爬取到的所有微博資訊,如微博 id、正文、原始圖片 url、影片 url、位置、日期、釋出工具、點贊數、轉發數、評論數、話題、 @ 使用者等。如果爬的是全部微博(原創 + 轉發),除上述資訊之外,還包含原始使用者 id、原始使用者暱稱、原始微博 id、原始微博正文、原始微博原始圖片 url、原始微博位置、原始微博日期、原始微博工具、原始微博點贊數、原始微博評論數、原始微博轉發數、原始微博話題、原始微博 @ 使用者等資訊。wb.weibo 是一個列表,包含了爬取的所有微博資訊。wb.weibo[0]為爬取的第一條微博,wb.weibo[1]為爬取的第二條微博,以此類推。當 only_crawl_original=1 時,wb.weibo[0]為爬取的第一條原創微博,以此類推。wb.weibo[0]['id']為第一條微博的 id,wb.weibo[0]['text']為第一條微博的正文,wb.weibo[0]['created_at']為第一條微博的釋出時間,還有其它很多資訊不在贅述,大家可以點選下面的"詳情"檢視具體用法。
詳情
user_id:儲存微博使用者 id。如 wb.weibo[0]['user_id']為最新一條微博的使用者 id;
screen_name:儲存微博暱稱。如 wb.weibo[0]['screen_name']為最新一條微博的暱稱;
id:儲存微博 id。如 wb.weibo[0]['id']為最新一條微博的 id;
text:儲存微博正文。如 wb.weibo[0]['text']為最新一條微博的正文;
article_url:儲存微博中頭條文章的 url。如 wb.weibo[0]['article_url']為最新一條微博的頭條文章 url,若微博中不存在頭條文章,則該值為'';
pics:儲存原創微博的原始圖片 url。如 wb.weibo[0]['pics']為最新一條微博的原始圖片 url,若該條微博有多張圖片,則儲存多個 url,以英文逗號分割;若該微博沒有圖片,則值為'';
video_url:儲存原創微博的影片 url 和原創微博 Live Photo 中的影片 url。如 wb.weibo[0]['video_url']為最新一條微博的影片 url,若該條微博有多個影片,則儲存多個 url,以英文分號分割;若該微博沒有影片,則值為'';
location:儲存微博的釋出位置。如 wb.weibo[0]['location']為最新一條微博的釋出位置,若該條微博沒有位置資訊,則值為'';
created_at:儲存微博的釋出時間。如 wb.weibo[0]['created_at']為最新一條微博的釋出時間;
source:儲存微博的釋出工具。如 wb.weibo[0]['source']為最新一條微博的釋出工具;
attitudes_count:儲存微博獲得的點贊數。如 wb.weibo[0]['attitudes_count']為最新一條微博獲得的點贊數;
comments_count:儲存微博獲得的評論數。如 wb.weibo[0]['comments_count']為最新一條微博獲得的評論數;
reposts_count:儲存微博獲得的轉發數。如 wb.weibo[0]['reposts_count']為最新一條微博獲得的轉發數;
topics:儲存微博話題,即兩個#中的內容。如 wb.weibo[0]['topics']為最新一條微博的話題,若該條微博沒有話題資訊,則值為'';
at_users:儲存微博 @ 的使用者。如 wb.weibo[0]['at_users']為最新一條微博 @ 的使用者,若該條微博沒有 @ 的使用者,則值為'';
retweet:儲存轉發微博中原始微博的全部資訊。假如 wb.weibo[0]為轉發微博,則 wb.weibo[0]['retweet']為該轉發微博的原始微博,它儲存的屬性與 wb.weibo[0]一樣,只是沒有 retweet 屬性;若該條微博為原創微博,則 wb[0]沒有"retweet"屬性,大家可以點選"詳情"檢視具體用法。
詳情
假設爬取到的第 i 條微博為轉發微博,則它存在以下資訊:
user_id:儲存原始微博使用者 id。wb.weibo[i-1]['retweet']['user_id']為該原始微博的使用者 id;
screen_name:儲存原始微博暱稱。wb.weibo[i-1]['retweet']['screen_name']為該原始微博的暱稱;
id:儲存原始微博 id。wb.weibo[i-1]['retweet']['id']為該原始微博的 id;
text:儲存原始微博正文。wb.weibo[i-1]['retweet']['text']為該原始微博的正文;
article_url:儲存原始微博中頭條文章的 url。如 wb.weibo[i-1]['retweet']['article_url']為該原始微博的頭條文章 url,若原始微博中不存在頭條文章,則該值為'';
pics:儲存原始微博的原始圖片 url。wb.weibo[i-1]['retweet']['pics']為該原始微博的原始圖片 url,若該原始微博有多張圖片,則儲存多個 url,以英文逗號分割;若該原始微博沒有圖片,則值為'';
video_url:儲存原始微博的影片 url 和原始微博 Live Photo 中的影片 url。如 wb.weibo[i-1]['retweet']['video_url']為該原始微博的影片 url,若該原始微博有多個影片,則儲存多個 url,以英文分號分割;若該微博沒有影片,則值為'';
location:儲存原始微博的釋出位置。wb.weibo[i-1]['retweet']['location']為該原始微博的釋出位置,若該原始微博沒有位置資訊,則值為'';
created_at:儲存原始微博的釋出時間。wb.weibo[i-1]['retweet']['created_at']為該原始微博的釋出時間;
source:儲存原始微博的釋出工具。wb.weibo[i-1]['retweet']['source']為該原始微博的釋出工具;
attitudes_count:儲存原始微博獲得的點贊數。wb.weibo[i-1]['retweet']['attitudes_count']為該原始微博獲得的點贊數;
comments_count:儲存原始微博獲得的評論數。wb.weibo[i-1]['retweet']['comments_count']為該原始微博獲得的評論數;
reposts_count:儲存原始微博獲得的轉發數。wb.weibo[i-1]['retweet']['reposts_count']為該原始微博獲得的轉發數;
topics:儲存原始微博話題,即兩個#中的內容。wb.weibo[i-1]['retweet']['topics']為該原始微博的話題,若該原始微博沒有話題資訊,則值為'';
at_users:儲存原始微博 @ 的使用者。wb.weibo[i-1]['retweet']['at_users']為該原始微博 @ 的使用者,若該原始微博沒有 @ 的使用者,則值為''。
7.定期自動爬取微博(可選)
我們爬取了微博以後,很多微博賬號又可能發了一些新微博,定期自動爬取微博就是每隔一段時間自動執行程式,自動爬取這段時間產生的新微博(忽略以前爬過的舊微博)。本部分為可選部分,如果不需要可以忽略。
思路是利用第三方軟體,如 crontab,讓程式每隔一段時間執行一次。因為是要跳過以前爬過的舊微博,只爬新微博。所以需要設定一個動態的 since_date。很多時候我們使用的 since_date 是固定的,比如 since_date="2018-01-01",程式就會按照這個設定從最新的微博一直爬到釋出時間為 2018-01-01 的微博(包括這個時間)。因為我們想追加新微博,跳過舊微博。第二次爬取時 since_date 值就應該是當前時間到上次爬取的時間。 如果我們使用最原始的方式實現追加爬取,應該是這樣:
假如程式第一次執行時間是2019-06-06,since_date假如為2018-01-01,那這一次就是爬取從2018-01-01到2019-06-06這段時間使用者所發的微博;
第二次爬取,我們想要接著上次的爬,需要手動將since_date值設定為上次程式執行的日期,即2019-06-06
上面的方法太麻煩,因為每次都要手動設定 since_date。因此我們需要動態設定 since_date,即程式根據實際情況,自動生成 since_date。 有兩種方法實現動態更新 since_date:
方法一:將 since_date 設定成整數
將 config.json 檔案中的 since_date 設定成整數,如:
"since_date": 10,
這個配置告訴程式爬取最近 10 天的微博,更準確說是爬取釋出時間從 10 天前到本程式開始執行時之間的微博。這樣 since_date 就是一個動態的變數,每次程式執行時,它的值就是當前日期減 10。配合 crontab 每 9 天或 10 天執行一次,就實現了定期追加爬取。
方法二:將上次執行程式的時間寫入檔案(推薦)
這個方法很簡單,就是使用者把要爬的使用者 id 寫入 txt 檔案,然後再把檔案路徑賦值給 config.json 中的 user_id_list 引數。
txt 檔名格式可以參考程式設定中的設定 user_id_list 部分,這樣設定就全部結束了。
說下這個方法的原理和好處,假如你的 txt 檔案內容為:
1669879400
1223178222 胡歌
1729370543 郭碧婷 2019-01-01
第一次執行時,因為第一行和第二行都沒有寫時間,程式會按照 config.json 檔案中 since_date 的值爬取,第三行有時間“2019-01-01”,程式就會把這個時間當作 since_date。每個使用者爬取結束程式都會自動更新 txt 檔案,每一行第一部分是 user_id,第二部分是使用者暱稱,第三部分是程式準備爬取該使用者第一條微博(最新微博)時的日期。爬完三個使用者後,txt 檔案的內容自動更新為:
1669879400 Dear-迪麗熱巴 2020-01-18
1223178222 胡歌 2020-01-18
1729370543 郭碧婷 2020-01-18
下次再爬取微博的時候,程式會把每行的時間資料作為 since_date。這樣的好處一是不用修改 since_date,程式自動更新;二是每一個使用者都可以單獨擁有隻屬於自己的 since_date,每個使用者的 since_date 相互獨立,互不干擾,格式為 yyyy-mm-dd
或整數。比如,現在又新增了一個新使用者,以楊紫的微博為例,你想獲取她 2018-01-23 到現在的全部微博,可以這樣修改 txt 檔案:
1669879400 迪麗熱巴 2020-01-18
1223178222 胡歌 2020-01-18
1729370543 郭碧婷 2020-01-18
1227368500 楊紫 3 夢想,希望
注意每一行的使用者配置引數以空格分隔,如果第一個引數全部由數字組成,程式就認為此行為一個使用者的配置,否則程式會認為該行只是註釋,跳過該行;第二個引數可以為任意格式,建議寫使用者暱稱;第三個如果是日期格式(yyyy-mm-dd),程式就將該日期設定為使用者自己的 since_date,否則使用 config.json 中的 since_date 爬取該使用者的微博,第二個引數和第三個引數也可以不填。 也可以設定第四個引數,將被讀取為 query_list。
方法三:將 const.py
檔案中的執行模式改為 append
以追加模式執行程式,每次執行,每個 id 只獲取最新的微博,而不是全部,避免頻繁備份微博導致過多的請求次數。
注意:
- 該模式會跳過置頂微博。
- 若採集資訊後使用者又編輯微博,則不會記錄編輯內容。
8.使用 docker
docker run
docker build -t weibo-crawler .
docker run -it -d \
-v path/to/config.json:/app/config.json \
-v path/to/weibo:/app/weibo \
-e schedule_interval=1 \ # 可選:迴圈間隔(分鐘)
weibo-crawler
docker compose
version: '3'
services:
weibo-crawler:
build:
context: .
dockerfile: Dockerfile
volumes:
- path/to/config.json:/app/config.json
- path/to/weibo:/app/weibo
environment:
- schedule_interval=1 # 可選:迴圈間隔(分鐘)
如何獲取 user_id
1.開啟網址 https://weibo.cn,搜尋我們要找的人,如"迪麗熱巴",進入她的主頁;
2.按照上圖箭頭所指,點選"資料"連結,跳轉到使用者資料頁面;
如上圖所示,迪麗熱巴微博資料頁的地址為" https://weibo.cn/1669879400/info",其中的"1669879400"即為此微博的 user_id。
事實上,此微博的 user_id 也包含在使用者主頁 (https://weibo.cn/u/1669879400?f=search_0)中,之所以我們還要點選主頁中的"資料"來獲取 user_id,是因為很多使用者的主頁不是"https://weibo.cn/user_id?f=search_0"的形式,
而是" https://weibo.cn/個性域名?f=search_0 " 或 " https://weibo.cn/微號?f=search_0"的形式。其中"微號"和 user_id 都是一串數字,如果僅僅透過主頁地址提取 user_id,很容易將"微號"誤認為 user_id。
新增 cookie 與不新增 cookie 的區別(可選)
對於微博數 2000 條及以下的微博使用者,不新增 cookie 可以獲取其使用者資訊和大部分微博;對於微博數 2000 條以上的微博使用者,不新增 cookie 可以獲取其使用者資訊和最近 2000 條微博中的大部分,新增 cookie 可以獲取其全部微博。
以 2020 年 1 月 2 日迪麗熱巴的微博為例,此時她共有 1085 條微博,在不新增 cookie 的情況下,可以獲取到 1026 條微博,大約佔全部微博的 94.56%,而在新增 cookie 後,可以獲取全部微博。
其他使用者類似,大部分都可以在不新增 cookie 的情況下獲取到 90% 以上的微博,在新增 cookie 後可以獲取全部微博。具體原因是,大部分微博內容都可以在移動版匿名獲取,少量微博需要使用者登入才可以獲取,所以這部分微博在不新增 cookie 時是無法獲取的。
有少部分微博使用者,不新增 cookie 可以獲取其微博,無法獲取其使用者資訊。對於這種情況,要想獲取其使用者資訊,是需要 cookie 的。
如需抓取微博轉發,請新增 cookie。
如何獲取 cookie(可選)
1.用 Chrome 開啟 https://passport.weibo.cn/signin/login;
2.輸入微博的使用者名稱、密碼,登入,如圖所示:登入成功後會跳轉到 https://m.weibo.cn;
3.按 F12 鍵開啟 Chrome 開發者工具,在位址列輸入並跳轉到 https://weibo.cn,跳轉後會顯示如下類似介面:
4.依此點選 Chrome 開發者工具中的 Network->Name 中的 weibo.cn->Headers->Request Headers,"Cookie:"後的值即為我們要找的 cookie 值,複製即可,如圖所示:
如何檢測 cookie 是否有效(可選)
本程式 cookie 檢查的邏輯是:使用 cookie 來源賬號釋出限定範圍的微博,若 cookie 可用,則可以讀取到該微博,否則讀取不到。操作方法:
-
使用 cookie 的來源賬號釋出一條微博,該賬號和微博需要滿足以下條件:
- 該微博必須是非公開可見的,後續需要根據可見性判斷 cookie 是否有效;
- 該微博需要是最近 5 條微博,不能在釋出測試用微博內容後又發很多新微博;
- 在
config.json
配置中的 since_date 之後,該賬號必須有大於 9 條微博。
-
將
const.py
檔案中'CHECK': False
中的False
改為True
,'HIDDEN_WEIBO': '微博內容'
中的微博內容
改為你發的限定範圍的微博。 -
將提供 cookie 的微博 id 放置在
config.json
檔案中"user_id_list"
設定項陣列中的第一個。例如提供 cookie 的微博 id 為123456
,則"user_id_list"
設定為"user_id_list":["123456", "<其餘id...>"]
。
注:本方法也將會抓取提供 cookie 賬號的微博內容。
在間歇執行程式時,cookie 無效會導致程式不能按照預設目標執行,因此可以開啟 cookie 通知功能。本專案使用開源專案 pushdeer 進行通知,在使用前使用者需要申請 push_key,具體可檢視官網瞭解。開啟方法為:
- 在
const.py
檔案中,將'NOTIFY': False
中的False
設為True
; - 將
'PUSH_KEY': ''
的''
替換為'<你的push_key>'