前言
微博數(shù)據(jù)基本上可以說(shuō)是社交圈里面最大的了。但是單純的使用urllib,是不足以獲取數(shù)據(jù)的。
今天來(lái)使用Cookie的方式繞開(kāi)微博權(quán)限驗(yàn)證這一關(guān)卡, 爬取一下數(shù)據(jù)。
查找的過(guò)程
打開(kāi)Chrome 的F12之后,刷新頁(yè)面,真的是眼花繚亂的數(shù)據(jù)流啊,飛流直下。找了好久,發(fā)現(xiàn)大部分?jǐn)?shù)據(jù)都是通過(guò)JavaScript腳本渲染到頁(yè)面上的。
這也就是為什么單純的使用urllib抓不到的原因了。因?yàn)檫@是動(dòng)態(tài)頁(yè)面,而Urllib則是抓取靜態(tài)頁(yè)面。明白了這一點(diǎn),就找到了方向了。
那就是找到數(shù)據(jù)源接口。后來(lái)經(jīng)過(guò)我的仔細(xì)審核,發(fā)現(xiàn)了類似于這樣的一個(gè)URL。
http://weibo.com/p/aj/v6/mblog/mbloglist?ajwvr=6&domain=103505&is_search=0&visible=0&is_hot=1&is_tag=0&profile_ftype=1&page=2&pagebar=0&pl_name=Pl_Official_MyProfileFeed__23&id=1035051198367585&script_uri=/kqdpku&feed_type=0&pre_page=2&domain_op=103505&__rnd=1495367966928
然后發(fā)現(xiàn)服務(wù)器端返回的數(shù)據(jù)內(nèi)容是JSON格式的。大致內(nèi)容如下;
然后這姑且算是找到一個(gè)人的數(shù)據(jù)了吧。那么問(wèn)題接著來(lái)了,如果我想看其他人的頁(yè)面怎么辦呢?
思路有如下兩個(gè):
- 一是按照剛才的方法,一個(gè)個(gè)的去查找。(費(fèi)時(shí)費(fèi)力,不贊同)
- 二是走捷徑,對(duì)比URL,我們會(huì)發(fā)現(xiàn)一個(gè)domain的參數(shù),而對(duì)應(yīng)的值就是目標(biāo)博主的ID。
比如我要看劉強(qiáng)東的主頁(yè),http://weibo.com/p/1003061866402485/home?from=page_100306&mod=TAB&is_hot=1#place
里面的from參數(shù)的page值后面的數(shù)據(jù)就是我們需要的domain值了。拿過(guò)來(lái)就可以直接使用。
核心
經(jīng)過(guò)了剛才的各種鋪墊,下面直接上代碼。體驗(yàn)一把吧。
# coding: utf8
# @Author: 郭 璞
# @File: login.py
# @Time: 2017/5/21
# @Contact: 1064319632@qq.com
# @blog: http://blog.csdn.net/marksinoberg
# @Description: 新浪微博登錄測(cè)試
import requests
import json
from bs4 import BeautifulSoup
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36',
'Host': 'weibo.com'
}
Cookies = {
"Cookie": "SCF=Asl3BNSxfmhmaP2cIVfnvOp-mmfHwOPYfdoMZIz6y4WtkH4xK0jdB0Hr0Tll4RzJ0xUHIi5HOLBAjEASrqSGDiQ.; SUB=_2A250JQA2DeThGeNI41UX8ifJyziIHXVXU3b-rDV8PUNbmtBeLWbGkW9yh-AUBKZFFYCHZ2zA0zH1I-l4dg..; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9W5yNOfs44nTEDRpARDUs7Yl5JpX5K2hUgL.Fo-c1hMceo.fehB2dJLoIcBLxK-LBo5L12qLxK-LBo5L12qLxK-LBo5L12qLxK-LBo5L12qLxK-LBo5L12qpi--fi-z7iKysi--fi-z7iKysi--Ni-z0i-8si--Ni-zpi-z0i--fiKLFi-2Ei--fi-82iK.7; SUHB=0HTxO_F0SbtSsP; ALF=1526899685; SSOLoginState=1495363686; YF-V5-G0=8d4d030c65d0ecae1543b50b93b47f0c; _s_tentry=my.sina.com.cn; Apache=9206065364153.127.1495363942807; SINAGLOBAL=9206065364153.127.1495363942807; ULV=1495363942825:1:1:1:9206065364153.127.1495363942807:; YF-Page-G0=fc0a6021b784ae1aaff2d0aa4c9d1f17; YF-Ugrow-G0=ea90f703b7694b74b62d38420b5273df; wvr=6; wb_publish_fist100_5687629504=1; UOR=blog.csdn.net,widget.weibo.com,www.sina.com.cn"
}
# 劉強(qiáng)東
url = 'http://weibo.com/p/aj/v6/mblog/mbloglist?ajwvr=6&domain=103505&is_search=0&visible=0&is_hot=1&is_tag=0&profile_ftype=1&page=2&pagebar=0&pl_name=Pl_Official_MyProfileFeed__23&id=1035051198367585&script_uri=/kqdpku&feed_type=0&pre_page=1&domain_op=100306&__rnd=1495367966928'
response = requests.get(url=url, headers=headers, cookies=Cookies)
data = json.loads(response.text)
result = data['data']
soup = BeautifulSoup(result, 'html.parser')
blogs = soup.find_all('div', {'class': 'WB_detail'})
for blog in blogs[0:8]:
print("微博發(fā)文:", blog.find_all('div')[2].get_text())
# 為了減少控制臺(tái)內(nèi)容輸出,這里注釋掉即可
# print("配圖:", blog.find_all('div', {'class': 'media_box'}))
print('======='*36)
# WB_innerwrap
運(yùn)行結(jié)果如何呢?
C:\Users\biao\Desktop\network\env\Scripts\python.exe C:/Users/biao/Desktop/network/code/sina/login.py
微博發(fā)文:
騙人,南通沒(méi)有普洱!//@普洱玫瑰湯:啊哈,我也是南通人呢。
===========================================================
微博發(fā)文:
回復(fù)@流氓無(wú)產(chǎn)者劉爺:即使那樣死了,無(wú)恥的看客們還要說(shuō)不過(guò)癮哩。//@流氓無(wú)產(chǎn)者劉爺:不僅不應(yīng)該收費(fèi),還應(yīng)該累死餓死是不?還應(yīng)該綁著炸彈跟恐怖分子對(duì)炸去是不?還應(yīng)該拎著菜刀跟漢奸對(duì)砍去是不?說(shuō)話之前掂量掂量自己,考慮考慮別人不行么?
===========================================================
微博發(fā)文:
給隊(duì)里多買(mǎi)點(diǎn)。
===========================================================
微博發(fā)文:
聰明。//@遇見(jiàn)那兵荒馬亂:還是那天紅場(chǎng)閱兵那天您閱的未名湖嗎?
===========================================================
微博發(fā)文:
你這眼神??!//@鐵匠--孫:上面怎么還有肉渣渣,還是饞嘴
===========================================================
微博發(fā)文:
這哥倆才超過(guò)五百。
===========================================================
微博發(fā)文:
順也是一種孝,但不可機(jī)械教條。//@夜半有人私語(yǔ)時(shí):以前只知道“以順行孝”,原來(lái)也可以“以諫行孝”。謝謝孔老師。
===========================================================
微博發(fā)文:
美夢(mèng)與歹命。我回答了 @NEW七七 的問(wèn)題,問(wèn)題價(jià)值¥433.00,大家快來(lái)花1元圍觀~ O微博問(wèn)答 ????
===========================================================
Process finished with exit code 0
如此,微博數(shù)據(jù)也能搞到手了。
總結(jié)
使用Cookie繞開(kāi)登錄選項(xiàng),確實(shí)是一個(gè)比較好的捷徑。但是由于時(shí)效的問(wèn)題,治標(biāo)不治本。
從上面的結(jié)果也可以看出,這里簡(jiǎn)單的打印出了前幾條數(shù)據(jù)內(nèi)容。也算是拋磚引玉了。而且對(duì)比網(wǎng)頁(yè)源碼之后,我發(fā)現(xiàn)了更多好玩的數(shù)據(jù)源。圖片,短視頻,都會(huì)是很好的素材。
然后對(duì)XX進(jìn)行文本分析,做成詞云啊,或者做一下社交網(wǎng)絡(luò)分析啊等等。
今天其實(shí)真的是太閑了,所以才搞了一下微博數(shù)據(jù)的爬取。文章內(nèi)容,排版都挺失敗的。(⊙﹏⊙)b