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