今天呢,繼續擼微博,但願新浪的大神們不在啊啊啊。html
緣起git
前面寫了一篇文章,主要是有感於文章馬伊琍的婚姻,才爬了下他們微博下的評論,結果有位老哥說github
這還了得,我這小暴脾氣不能忍啊,果斷準備再次出手,拿下姐姐的微博評論。可是當我把瓜子都買好的時候。。。正當我準備再次 F12 查 ID,造 URL 的時候,做爲一名非專業碼農的惰性就體現出來了,每次都這麼搞,是否是有點太繁瑣了。因而,做爲各種輪子的深度依賴者,此次我準備本身造個輪子。json
因而乎,在上述設想的指引下,我開始了輪子之旅api
首先想到的就是利用微博的搜索功能,而後再看看能獲得些啥 這個搜索 URL:markdown
"s.weibo.com/user?q=林志玲"cookie
能夠直接調,爽的飛起!網絡
具體分析過程就不詳細寫了,從中咱們能夠拿到用戶的 UID,很重要。ide
import requests
from bs4 import BeautifulSoup
url = 'https://s.weibo.com/user?q=林志玲'
res = requests.get(url).text
content = BeautifulSoup(res, 'html.parser')
user = content.find('div', attrs={'class': 'card card-user-b s-pg16 s-brt1'})
user_info = user.find('div', attrs={'class': 'info'}).find('div')
href_list = user_info.find_all('a')
if len(href_list) == 3:
title = href_list[1].get('title')
if title == '微博我的認證':
uid = href_list[2].get('uid')
print(uid)
else:
print("this is not a big VIP")
複製代碼
由於這種搜索,可能會搜索出不少結果,張3、李四啥的都出來了,咱們只關心大 V,對於非大 V,就取第一個嘍。函數
下面要隆重解釋一個 URL
"m.weibo.cn/api/container/getIndex"
這個地址能夠在微博的 m 站上找到,有時候,爬 m 站的地址要更容易些。 對於這個地址,咱們主要有兩個做用,使用不一樣的參數,調用兩次
markdown 裏 url 展現有些奇怪,能夠看 Postman 的截圖
首先咱們這樣調用該 URL
"m.weibo.cn/api/container/getIndex?type=uid&value=1312412824"
value 爲上面拿到的用戶 UID
看 Postman
能獲得該用戶的用戶信息,這裏面有一個很重要的信息,containerid,保存下來,一會用。接着咱們再這樣調用該 URL
"m.weibo.cn/api/container/getIndex?containerid=1076031312412824&page=0"
containerid 就是上一步獲得的 ID
繼續看 Postman
獲得的就是 blog 信息了,返回的是 json 數據,很棒。最後,咱們能夠再結合前面文章獲取評論的方法,那麼該用戶下的博客和評論內容就都到手嘍。
此處先省去菜鳥被虐的一萬點傷害值
其中的千辛萬苦,誰能知之。先來個配置文件,畢竟大型項目都是這麼玩的,我這也是大型項目
config.py 文件sleep_time = 5 # 延遲時間,建議配置5-10s
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
"Cookie": "your cookie"
}
day = 60 # 最久抓取的微博時間,60即爲只抓取兩個月前到如今的微博
複製代碼
抽象出一些公共的函數,不能把代碼寫的太醜了
tools.py 文件
def checkTime(inputtime, day):
try:
intime = datetime.datetime.strptime("2019-" + inputtime, '%Y-%m-%d')
except:
return "時間轉換失敗"
now = datetime.datetime.now()
n_days = now - intime
days = n_days.days
if days < day:
return True
else:
return False
複製代碼
這個是用來檢查時間間隔的,後面在抓取微博時,若是時間過久遠的,就不抓了。
還有一個函數是用來解析 blog 數據的,由於是 json 數據,解析起來很簡單,就很少說了
def get_blog_info(cards, i, name, page):
...
複製代碼
定義一個 WeiBo 類
class WeiBo(object):
def __init__(self, name, headers):
self.name = name
self.headers = headers
複製代碼
後面全部的操做,都是基於該類來的
類中的方法
def get_uid(self): # 獲取用戶的 UID
...
def get_userinfo(self, uid): # 獲取用戶信息,包括 containerid
...
def get_blog_by_page(self, containerid, page, name): # 獲取 page 頁的微博信息
...
def get_blog_by_text(self, containerid, blog_text, name): # 一個簡單的搜索功能,根據輸入的內容查找對應的微博
...
def get_comment(self, mblog_id, page): # 與上個函數配合使用,用於獲取某個微博的評論
...
def download_comment(self, comment): # 下載評論
...
def download_pic(self): # 靈感來源於「胖虎」哥的「養分快線」文章,暫未實現
pass
複製代碼
這裏我的感受邏輯寫的仍是有點臃腫,沒辦法,菜!各位大神若是路過,還請不要嫌棄。
主要就是配合 input 函數,來獲取用戶的輸入,而後根據不一樣狀況調取 WeiBo 類裏的方法。
至此,一個勉強可用的輪子基本完成了,可把我累(牛)壞(逼)了(壞)啦(了)
扯了這麼多,終於到了見成果的時候了,先來看個動圖
網絡上爆炸的「喬碧蘿殿下」,成爲了我檢(祭)驗(刀)的第一人那麼最後仍是要扣題呀,把那段緣結束掉。看看志玲姐姐微博下的評論,究竟是咋樣
其實拿到評論數據以後,簡單瀏覽了下,確實有不少難以啓齒的評論,可是呢,這個事情我以爲仍是沒有必要太上綱上線了,哈哈哈,總之祝福吧
(此處請自動過濾掉一些些不和諧因素)
下面, 前方, 高能,
前方是大型認親現場,怕引發不適的請跳過。 持續發酵的事件背後,產生了各類贏家,鬥魚平臺、主播晴子,固然還有 CXK 嘍,不能說了最後的最後,獻上代碼:
完!