微博爬蟲-發(fā)布微博以及獲取微博資料
1.發(fā)布微博
為了減少限制我們使用移動(dòng)版本登錄
首先登錄微博皇拣,這里我采用cookie來登錄
如圖,登錄后獲得cookie
登錄后先發(fā)布一個(gè)微博查看需要傳輸什么值
圖中可以看出疫萤,我們需要2個(gè)值城须,一個(gè)為st一個(gè)為content,且content已知值為我們要發(fā)送的微博
發(fā)送微博的url在圖片里面可以看出是:https://m.weibo.cn/api/statuses/update
接著我們從這個(gè)網(wǎng)頁里面找到st值生成的地方稳摄,找到后我們就可以開始寫發(fā)送微博的代碼了
import re
import requests
headers = {'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36'}
cookie = {"Cookie": "你的cookie"}
url = 'https://m.weibo.cn/compose'
html = requests.get(url, cookies=cookie).text
pattern = r'st:(.+)'
st = re.findall(pattern, html)[0].replace("'",'').replace(',','').replace(' ','')
post_url = 'https://m.weibo.cn/api/statuses/update'
postdata = {
'st':st,
'content':'測(cè)試Python發(fā)微博!',
}
update = requests.post(post_url, data=postdata, headers=headers, cookies=cookie)
在這里我用正則找出來棱诱,不過加了‘’就找不到了泼橘,所以只能粗略找出來再把不要的替換掉,接著就可以傳入postdata進(jìn)行發(fā)微博了
結(jié)果如圖:
2.爬取評(píng)論
其實(shí)這個(gè)是我爬取一半遇到個(gè)坑迈勋,然后百度后找到的教程- -炬灭。。粪躬。
先貼上鏈接這里
然后是代碼
from lxml import html
import requests
import json
import re
class CrawlWeibo:
# 獲取指定博主的所有微博card的list
def getWeibo(self,id,page):#id(字符串類型):博主的用戶id,page(整型):微博翻頁參數(shù)
url='https://m.weibo.cn/api/container/getIndex?type=uid&value='+id+'&containerid=107603'+id+'&page='+str(page)
response=requests.get(url)
ob_json=json.loads(response.text)
list_cards=ob_json['cards']
return list_cards# 返回本頁所有的cards
# 返回某條微博的熱門評(píng)論的list
def getComments(self,id,page):# id(字符串類型):某條微博的id昔穴,page(整型):評(píng)論翻頁參數(shù)
url='https://m.weibo.cn/api/comments/show?id='+id+'&page='+str(page)
response=requests.get(url)
ob_json=json.loads(response.text)
list_comments=ob_json['hot_data']
return list_comments
def printAllTopic(self,page):
list_cards=self.getWeibo('1713926427',page)
# 遍歷當(dāng)頁所有微博镰官,輸出內(nèi)容,并根據(jù)id查找輸出熱門評(píng)論
for card in list_cards:
if card['card_type']==9:# 過濾出微博吗货,card_type=9的是微博card泳唠,card_type=11的是推薦有趣的人
id=card['mblog']['id']
text=card['mblog']['text']
if re.search('___', text)!=None:# 用正則匹配,將博文有下劃線的微博過濾出來宙搬,有下劃線的是“話題微博”
print (u"### 話題: "+text+'\n')
#根據(jù)微博id獲取熱門評(píng)論笨腥,并輸出
list_comments=crawl_weibo.getComments(id, 1)# 熱門評(píng)論只需要訪問第一頁
count_hotcomments=1
for comment in list_comments:
created_at=comment['created_at']# 發(fā)表日期時(shí)間
like_counts=comment['like_counts']# 點(diǎn)贊數(shù)
text=comment['text']# 評(píng)論內(nèi)容
tree=html.fromstring(text)
text=tree.xpath('string(.)')# 用string函數(shù)過濾掉多余標(biāo)簽
name_user=comment['user']['screen_name']# 評(píng)論者的用戶名
source=comment['source']# 來源于哪個(gè)終端
if source=='':
source=u'未知'
pic_url=''# 評(píng)論內(nèi)容的圖片
if 'pic' in comment:
pic_url=comment['pic']['url']
# 輸出評(píng)論數(shù)據(jù)
print (str(count_hotcomments),': **',name_user,'**',u' **發(fā)表于:**'+created_at,u' **點(diǎn)贊:**'+str(like_counts)+u' **來自:**'+source)
print (text+'\n')
count_hotcomments=count_hotcomments+1
print ('***')
#實(shí)例化爬蟲類并調(diào)用成員方法進(jìn)行輸出
crawl_weibo=CrawlWeibo()
crawl_weibo.printAllTopic(1)# 只輸出一頁進(jìn)行示例展示
其實(shí)就是不斷的解析JSON來獲取自己想要的,搜索到榜姐后勇垛,點(diǎn)他的微博
可以找到生成微博的JSON文件
把URL提取后進(jìn)去查看脖母,可以看到JSON內(nèi)容,然后COPY再到json.cn查看
之后就會(huì)發(fā)現(xiàn)我們要的微博都再card 9里面闲孤,提取之
再點(diǎn)進(jìn)去評(píng)論列表谆级,跟分析博文一樣進(jìn)行分析
就能從里面提取精彩評(píng)論了,然而讼积,只有8條- -
然后我就重新弄了一下肥照,那里不是有個(gè)更多評(píng)論嗎,點(diǎn)擊后就能看到很多熱門評(píng)論了勤众,缺點(diǎn)是看不到圖片舆绎。不過還好我主要捉取的是評(píng)論- -,然后下拉評(píng)論查找評(píng)論更新URL規(guī)則
然而我找不到第一頁们颜,卻找到了第二頁- -
查看JSON文件后吕朵,可以發(fā)現(xiàn)熱門評(píng)論更改page就可以了1頁有9個(gè)評(píng)論
然后更改里面的鏈接就差不多可以了猎醇,還有hot_data改為card_group
def getComments(self,id,page):# id(字符串類型):某條微博的id,page(整型):評(píng)論翻頁參數(shù)
#url='https://m.weibo.cn/api/comments/show?id='+id+'&page='+str(page)
url = 'https://m.weibo.cn/single/rcList?format=cards&id='+id+'&type=comment&hot=1&page='+str(page)
response=requests.get(url)
ob_json=json.loads(response.text)
list_comments=ob_json['card_group']
return list_comments
3.爬取微博內(nèi)容
原來我寫的有點(diǎn)亂边锁,不好的代碼還是扔在電腦里面好了」檬常現(xiàn)在爬取微博內(nèi)容直接對(duì)以上獲取到的list_cards解析就行了,不過圖片有3種形式茅坛,分別是縮略圖音半,壓縮圖,原圖
"thumbnail_pic":"http://wx1.sinaimg.cn/thumbnail/6628711bgy1fca7isjl7nj215o15o167.jpg",
"bmiddle_pic":"http://wx1.sinaimg.cn/bmiddle/6628711bgy1fca7isjl7nj215o15o167.jpg",
"original_pic":"http://wx1.sinaimg.cn/large/6628711bgy1fca7isjl7nj215o15o167.jpg",
4.爬取用戶信息
這個(gè)栗子同樣也是使用移動(dòng)版微博來獲取資料(我這里是從我關(guān)注列表里面獲取的)
使用cookie登錄后 贡蓖,再去查看關(guān)注列表的信息曹鸠。因?yàn)槭怯孟吕@取信息的,所以多次下拉后可以發(fā)現(xiàn)改變page = 的數(shù)值就可以獲取到新的列表
可以看到列表里面有個(gè)鏈接:https://m.weibo.cn/api/container/getSecond?containerid=1005051896662273_-_FOLLOWERS&page=2 這個(gè)containerid這個(gè)不知道是什么斥铺,之前也沒看過彻桃。所以重新跑回主頁查看
可以發(fā)現(xiàn),再這個(gè)頁面已經(jīng)出現(xiàn)這個(gè)containerid了
到這個(gè)頁面獲取就好了晾蜘,然而我直接填寫= =邻眷。。
接著獲取到j(luò)son后就像上面一樣開始分析剔交,下面是一個(gè)分析的記過栗子
"card_type":10,
"user":{
"id":5909185172,
"screen_name":"拜托啦學(xué)妹",
"profile_image_url":"https://tva1.sinaimg.cn/crop.0.0.976.976.180/006rUl0gjw8f4uuscl9p5j30r40r410i.jpg",
"profile_url":"https://m.weibo.cn/u/5909185172?uid=5909185172&luicode=10000012&lfid=1005051896662273_-_FOLLOWERS&featurecode=20000320",
"statuses_count":390,
"verified":true, 有沒有認(rèn)證
"verified_type":0, -1 為沒認(rèn)證肆饶。0為個(gè)人認(rèn)證,其余為企業(yè)認(rèn)證
"verified_type_ext":1, _ext為1時(shí)(橙色V)岖常, _ext為0(黃色v)_ext
"verified_reason":"微博知名搞笑視頻博主 教育視頻自媒體 微博簽約自媒體", 認(rèn)證說明
"description":"一個(gè)只屬于大學(xué)生的街訪", 簡介
"gender":"f", 性別:f為女m為男
"mbtype":12, 12都是個(gè)人賬戶驯镊,0也是。2有個(gè)人賬戶也有企業(yè)賬戶竭鞍,11也是企業(yè)賬戶
"urank":27, 等級(jí)
"mbrank":5, 會(huì)員等級(jí)
"follow_me":false, 是否關(guān)注我
"following":true, 我是否關(guān)注他
"followers_count":5445128, 粉絲數(shù)量
"follow_count":69, 關(guān)注量
"cover_image_phone":"https://tva1.sinaimg.cn/crop.0.0.640.640.640/549d0121tw1egm1kjly3jj20hs0hsq4f.jpg",
"desc1":null,
"desc2":null
},
然后就可以獲取了板惑,結(jié)果如下:
id: 5364707424 姓名: Just春苑 簡介: ?? 等級(jí): 9 性別: m 是否關(guān)注我: True
id: 5406572240 姓名: 魅藍(lán)手機(jī) 簡介: 等級(jí): 17 性別: m 是否關(guān)注我: False
id: 3230122083 姓名: Flyme 簡介: Flyme是魅族基于Android內(nèi)核為旗下智能手機(jī)量身打造的操作系統(tǒng),旨在為用戶提供優(yōu)秀的交互體驗(yàn)和貼心的在線服務(wù)偎快。源自內(nèi)心的設(shè)計(jì)冯乘,做最本質(zhì)的思考,F(xiàn)lyme定會(huì)讓你刮目相看晒夹! 等級(jí): 35 性別: m 是否關(guān)注我: False
id: 5608433557 姓名: 微博雷達(dá) 簡介: 等級(jí): 5 性別: f 是否關(guān)注我: False
id: 1861358972 姓名: 氣勢(shì)如虹Leslie 簡介: 去認(rèn)識(shí)更廣闊的世界 等級(jí): 16 性別: m 是否關(guān)注我: True
id: 1992613670 姓名: 鳳凰新聞客戶端 簡介: 等級(jí): 37 性別: m 是否關(guān)注我: False
id: 2629306884 姓名: CSDN產(chǎn)品客服 簡介: 還在為你的下載積分太少發(fā)愁嗎往湿?快來參加CSDN做任務(wù),拿積分活動(dòng)~~攢下載積分啦~~http://task.csdn.net/rule.aspx 等級(jí): 21 性別: f 是否關(guān)注我: False
id: 2251036402 姓名: Colombo丶Fd 簡介: 等級(jí): 14 性別: m 是否關(guān)注我: True
id: 1720064601 姓名: RNF_牧牧子 簡介: |后院43024|輪協(xié)3.0|脫了一半的偽宅|世上稀有的腐男|絕對(duì)領(lǐng)域萬歲|我終于過了CCIE|全(部)球(類)通 等級(jí): 31 性別: m 是否關(guān)注我: True
id: 2472362284 姓名: RNF_某清 簡介: 微不足道惋戏。 等級(jí): 22 性別: m 是否關(guān)注我: True
這部分內(nèi)容的代碼:
import re
import requests
import json
from lxml import etree
cookie = {"Cookie": "你的cookie"}
url = 'https://m.weibo.cn/api/container/getSecond?containerid=1005051896662273_-_FOLLOWERS&page=7'
html = requests.get(url, cookies=cookie)
ob_json=json.loads(html.text)
list_cards=ob_json['cards']
for card in list_cards:
if card['card_type'] == 10:
id = card['user']['id']
name = card['user']['screen_name']
description = card['user']['description']
urank = card['user']['urank']
gender = card['user']['gender']
follow_me = card['user']['follow_me']
if gender == 'm':
gender =='男'
if gender == 'f':
gender =='女'
else:
gender == '其他'
if follow_me:
follow_me == '是'
else:
follow_me == '否'
print('id:', id, '姓名:', name ,'簡介:', description ,'等級(jí):', urank, '性別:', gender ,'是否關(guān)注我:', follow_me)