抓取單博主的所有微博及其評論

這是個簡單又複雜的爬蟲。抓取邏輯很簡單,但任務實現會略微繁瑣。但只要思路清楚,還是很簡單的。

對象-路易威登微博

網址:http://m.weibo.cn/u/1836003984紅色部分是微博賬號的id

爬取思路

1、我們先寫一個微博的所有評論,看網址規律是什麼樣子,有沒有一些奇怪的參數,這些參數要到哪裡獲取?

2、依次類推,發現爬所有微博評論的微博評論的規律,看看有沒有奇怪的參數,這些參數要到哪裡才能獲取?

說的優點雲里霧裡的,這裡附上三個url模板。

https://m.weibo.cn/api/comments/show?id={id}&page={page}https://m.weibo.cn/api/container/getIndex?containerid={oid}&type=uid&value={uid}&page={page}https://m.weibo.cn/api/container/getIndex?type=uid&value={usr_id}

第一個url模板代表的是某條微博的id,打開這個url會返回該微博某頁的評論。

第二個url模板代表的是微博用戶所發微博的列表,打開該url,返回的是某頁的微博列表。

第三個url模板代表的其實是微博用戶主頁。

訪問第一個url需要id,但要訪問了第二個url才能獲得id

訪問第二個url需要oid、uid,但是oid、uid需要訪問了第三個url才能獲得。

思路很簡單,那我們就此展開。

一、微博評論

抓包是一種美德,翻看路易威登一個微博評論,打開開發者工具,進行抓包準備。

好了,抓包分析,找到我們屏幕中看到的數據了。那麼方框中圈中的網址就是評論數據對應的網址。

http://m.weibo.cn/api/comments/show?id=4103033291539613&page=4

網址關鍵參數,微博id和頁碼

上面紅框中圈中的是第四頁評論的數據。

data:第四頁的數據

最大的方框,是微博中某條評論的相關數據,如創建時間,評論的id,喜歡數(點贊數)、發布微博的網站(是手機端還是網頁端)、評論文本、發評論的用戶相關信息(用戶id、昵稱等)

max:最大頁數

total_num:微博評論數

好了,直接附上爬取某微博評論這部分的爬蟲腳本截圖

def get_comments(wb_id): Data = [] url = "https://m.weibo.cn/api/comments/show?id={id}".format(id=wb_id) page_url = "https://m.weibo.cn/api/comments/show?id={id}&page={page}" Resp = requests.get(url, headers=headers, cookies=Cookies) page_max_num = Resp.json()["max"] for i in range(1, page_max_num, 1): p_url = page_url.format(id=wb_id, page=i) resp = requests.get(p_url, cookies=Cookies, headers=headers) resp_data = resp.json() data = resp_data.get("data") for d in data: review_id = d["id"] like_counts = d["like_counts"] source = d["source"] username = d["user"]["screen_name"] image = d["user"]["profile_image_url"] verified = d["user"]["verified"] verified_type = d["user"]["verified_type"] profile_url = d["user"]["profile_url"] comment = d["text"] time.sleep(1)

我們想自動爬取路易威登發布的所有微博,必須批量獲取微博id,才能高效爬取路易威登所有數據。

所以現在,問題來了,怎麼批量獲得微博id??

二、批量獲取微博id

回到主頁

按F12,準備抓包,點擊最下方的「查看他的全部微博」。我們不停的向下方滾動,相當於向網站請求了六次,抓包如圖。這是我打開的第四頁的所有微博對應的網址。

打開第四頁的網址對應的數據

我們得到了上圖,這都是我們想要的數據。

page:當前頁碼

total:微博列表的頁面數

cards:當前微博列表對應的數據(含有多個微博數據)

紅色方框中的藍色方框:眾多微博id的一個。

現在我們可以寫一個關於獲取微博id的爬蟲,直接附上代碼

def mblog_list(uid, oid): Mblog_list = [] base_url = "https://m.weibo.cn/api/container/getIndex?containerid={oid}&type=uid&value={uid}" page_url = "https://m.weibo.cn/api/container/getIndex?containerid={oid}&type=uid&value={uid}&page={page}" url = base_url.format(oid=oid, uid=uid) resp = requests.get(url, headers=headers, cookies=Cookies) resp.encoding = "gbk" response = resp.json() total = response["cardlistInfo"]["total"] page_num = int(int(total) / 10) + 1 for i in range(1, page_num + 1, 1): p_url = page_url.format(oid=oid, uid=uid, page=i) page_resp = requests.get(p_url, headers=headers, cookies=Cookies) page_data = page_resp.json() cards = page_data["cards"] for card in cards: mblog = card["mblog"] created_at = mblog["created_at"] id = mblog["id"] text = mblog["text"] reposts_count = mblog["reposts_count"] comments_count = mblog["comments_count"] attitudes_count = mblog["attitudes_count"] mblog_data = {"created_at": created_at, "id": id, "text": text, "reposts_count": reposts_count, "comments_count": comments_count, "attitudes_count": attitudes_count} Mblog_list.append(mblog_data) print(" " * 10, mblog_data) time.sleep(1) return Mblog_list

現在問題來了,uid,oid怎麼獲取呢?

三、獲取uid、oid

重新回到主頁

刷新,出現這個網址

http://m.weibo.cn/api/container/getIndex?type=uid&value=1836003984&containerid=1005051836003984

點擊Preview,展開每個項目,查找uid、fid、oid

好了,現在uid、oid有了,我們專門寫獲取這兩個參數的小腳本,代碼直接上

def usr_info(usr_id): url = "https://m.weibo.cn/api/container/getIndex?type=uid&value={usr_id}".format(usr_id=usr_id) resp = requests.get(url, headers=headers, cookies=Cookies) jsondata = resp.json() uid = jsondata.get("userInfo").get("toolbar_menus")[0].get("params").get("uid") fid = jsondata.get("userInfo").get("toolbar_menus")[1].get("actionlog").get("fid") oid = jsondata.get("userInfo").get("toolbar_menus")[2].get("params").get("menu_list")[0].get("actionlog").get("oid") cardid = jsondata.get("userInfo").get("toolbar_menus")[1].get("actionlog").get("cardid") containerid = jsondata.get("tabsInfo").get("tabs")[0].get("containerid") Info = {"uid": uid, "fid": fid, "cardid": cardid, "containerid": containerid, "oid": oid} print(Info) return Info

獲取完整代碼,請關注

公眾號:大鄧帶你玩Python

更多內容

文本分析

python居然有情感??真的嗎??

文本分析之網路關係

中文分詞-jieba庫知識大全自然語言處理庫之snowNLP用gensim庫做文本相似性分析基於共現發現人物關係的python實現

用python計算兩文檔相似度

數據分析

酷炫的matplotlib

文本分析之網路關係

pandas庫讀取csv文件用詞雲圖解讀「於歡案」

神奇的python

初識Python的GUI編程Python實現文字轉語音功能憐香惜玉,我用python幫助辦公室文秘

逆天的量化交易分析庫-tushare

開扒皮自己微信的秘密

8行代碼實現微信聊天機器人

使用Python登錄QQ郵箱發送QQ郵件

爬蟲

爬蟲實戰視頻專輯【視頻】手把手教你抓美女~

當爬蟲遭遇驗證碼,怎麼辦【視頻】於歡案之網民的意見(1)?【視頻】有了selenium,小白也可以自豪的說:「去TMD的抓包、cookie」

【視頻】快來get新技能--抓包+cookie,爬微博不再是夢

【視頻教程】用python批量抓取簡書用戶信息

爬豆瓣電影名的小案例(附視頻操作)

爬豆瓣電影名的小案例2(附視頻操作)用Python抓取百度地圖裡的店名,地址和聯繫方式
推薦閱讀:

學習筆記四:改善Python程序的91個建議
碎片化學習Python的又一神作:termux
從零開始寫Python爬蟲 --- 導言
Python爬蟲學習系列教程

TAG:Python | Python入门 | Python教程 |