GitHub 上這款新浪微博爬蟲專案,‌讓你輕鬆掌握微博資料!‌

peterjxl發表於2024-08-31

該文章為 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。

對於微博數 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 可用,則可以讀取到該微博,否則讀取不到。操作方法:

  1. 使用 cookie 的來源賬號釋出一條微博,該賬號和微博需要滿足以下條件:

    • 該微博必須是非公開可見的,後續需要根據可見性判斷 cookie 是否有效;
    • 該微博需要是最近 5 條微博,不能在釋出測試用微博內容後又發很多新微博;
    • config.json ​配置中的 since_date 之後,該賬號必須有大於 9 條微博。
  2. const.py ​檔案中 'CHECK': False ​中的 False ​改為 True​,'HIDDEN_WEIBO': '微博內容' ​中的 微博內容 ​改為你發的限定範圍的微博。

  3. 將提供 cookie 的微博 id 放置在 config.json ​檔案中 "user_id_list" ​設定項陣列中的第一個。例如提供 cookie 的微博 id 為 123456​,則 "user_id_list" ​設定為 "user_id_list":["123456", "<其餘id...>"]​。

注:本方法也將會抓取提供 cookie 賬號的微博內容。

在間歇執行程式時,cookie 無效會導致程式不能按照預設目標執行,因此可以開啟 cookie 通知功能。本專案使用開源專案 pushdeer 進行通知,在使用前使用者需要申請 push_key,具體可檢視官網瞭解。開啟方法為:

  1. const.py ​檔案中,將 'NOTIFY': False ​中的 False ​設為 True​;
  2. 'PUSH_KEY': '' ​的 '' ​替換為 '<你的push_key>'

相關文章