超簡單,只需4步爬取女神微博評論
想去微博爬微博評論拿來做數據分析,拿以前寫的代碼用發(fā)現跑不起來了
然后用瀏覽器登錄微博看了下請求過程,發(fā)現規(guī)則確實變了。以前可以直接看到數據接口,現在變復雜多了。
咋辦呢?
吭呲吭呲從0開始分析?那樣太低效了。
你遇到的坑肯定很多人都遇到過,這個時候我們就沒必要自己重新去踩了。直接從他們填好的坑上走過去就好了,過蜀道如平川。
這里教你一個方法,4步爬取微博評論。
第一步:百度/Google
用搜素引擎搜關鍵字“微博評論爬蟲 python”, 基本上第一頁的結果都是最近一年寫的文章,有一定時效性,太早的文章就直接忽略。隨便打開兩篇你能看懂的文章,記住,看不懂不是你的問題,是作者沒寫明白。
我搜到簡書上的一篇文章,地址:https://www.jianshu.com/p/8dc04794e35f , 不過按照她的方式操作已經不起效了,因為微博的評論數據獲取方式改了,但是發(fā)現了一個很重要的線索。
第二步:分析驗證
雖然數據不再是通過接口的方法返回的,但是老接口還能用https://m.weibo.cn/api/comments/show?id={id}&page={page} , 這里的id是某條微博的id, page 是分頁參數。
于是嘗試用這個接口去獲取數據
確實能拿到數據,一共有40多萬條數據,每頁10條,41336頁。當你正喜出望外的時候,卻發(fā)現只能獲取最近50頁的數據。把 page 參數改成 51 就不行了。
不難理解,這種分頁方式在MySQL中是效率非常低效的,特別是遇到數據非常的時候,所以用這種方式拿不到全部分頁的數據是情理之中的。
幸好,還有一個新接口,https://m.weibo.cn/comments/hotflow?mid=4477013081328252&max_id=330569188932643&max_id_type=0
這個接口也能拿到評論,mid 是某條微博的參數, max_id 是分頁參數,這個參數可以從一個請求返回的數據中拿到
第三步:寫代碼、測試
數據獲取的原理搞懂了, 就可以通過代碼來實現,幾十萬條數據就能唰唰的爬下來。
為了能夠更好的做分析處理,我決定叫數據保存到MongoDB,它的好處就不介紹了,反正就是省事。
直接上代碼吧!
- """
- 爬取微博評論,保存到數據庫
- https://m.weibo.cn/api/comments/show?id=4477013081328252&page=50
- 該接口能獲取微博的前50頁數據,每頁10條, id 是某條微博的id
- https://m.weibo.cn/comments/hotflow?mid=4477013081328252&max_id=330569188932643&max_id_type=0
- 此接口能爬到所有評論信息, mid 是某條微博id, max_id 是上一個請求返回的分頁參數, max_id_type 固定為0就好
- """
- from pymongo import MongoClient
- import requests
- import time
- __author__ = 'liuzhijun'
- headers = {
- "Host": "m.weibo.cn",
- "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) "
- "Version/9.0 Mobile/13B143 Safari/601.1",
- "Cookie": "xxxxx" # 這里將瀏覽器的cookie復制過來進行了。
- }
- client = MongoClient('mongodb://localhost:27017/')
- db = client['weibo']
- def main(mid, max_id):
- """
- :param mid: 某條微博id
- :param max_id: 分頁參數
- :return:
- """
- url = "https://m.weibo.cn/comments/hotflow?max_id_type=0"
- params = {"mid": mid}
- if max_id:
- params['max_id'] = max_id
- res = requests.get(url, params=params, headers=headers)
- print(res.content)
- result = res.json()
- max_id = result.get("data").get("max_id")
- data = result.get('data').get('data')
- for item in data:
- db['comment'].insert_one(item)
- if max_id:
- time.sleep(1)
- main(mid, max_id)
- if __name__ == '__main__':
- main("4477013081328252", None)
最后數據整齊劃一保存在數據庫中
剩下的時候就可以做分析了
第4步:關注公眾號
這一步是可選項。核心代碼就那么幾行,是不是覺得特別簡單,如果你會寫HelloWorld,那么這個代碼對你來說也不難嘛,這對做產品、做運營的時候來說,簡直就是救命藥。再也不要求程序員哥哥要數據了。
把這邊文章分享給你身邊的朋友,關注我一起搞數據啊。。。