自造微博輪子,再爬姐姐和奶奶殿下

今天呢,繼續擼微博,但願新浪的大神們不在啊啊啊。html

緣起git

前面寫了一篇文章,主要是有感於文章馬伊琍的婚姻,才爬了下他們微博下的評論,結果有位老哥說github

這還了得,我這小暴脾氣不能忍啊,果斷準備再次出手,拿下姐姐的微博評論。可是當我把瓜子都買好的時候。。。

正當我準備再次 F12 查 ID,造 URL 的時候,做爲一名非專業碼農的惰性就體現出來了,每次都這麼搞,是否是有點太繁瑣了。因而,做爲各種輪子的深度依賴者,此次我準備本身造個輪子。json

設想

  1. 最起碼是一個自動抓取的腳本,嗯,這是底線!
  2. 有個入口輸入要爬取的人物(當前設定爲大 V,和搜索到的第一我的)
  3. 以後,就交給程序,坐等數據

思路

因而乎,在上述設想的指引下,我開始了輪子之旅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 數據,很棒。

最後,咱們能夠再結合前面文章獲取評論的方法,那麼該用戶下的博客和評論內容就都到手嘍。

開搞

此處先省去菜鳥被虐的一萬點傷害值

其中的千辛萬苦,誰能知之。

1、配置文件

先來個配置文件,畢竟大型項目都是這麼玩的,我這也是大型項目

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即爲只抓取兩個月前到如今的微博
複製代碼

2、工具箱

抽象出一些公共的函數,不能把代碼寫的太醜了

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):
    ...
複製代碼

3、主邏輯

定義一個 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
複製代碼

4、運行函數

這裏我的感受邏輯寫的仍是有點臃腫,沒辦法,菜!各位大神若是路過,還請不要嫌棄。

主要就是配合 input 函數,來獲取用戶的輸入,而後根據不一樣狀況調取 WeiBo 類裏的方法。

至此,一個勉強可用的輪子基本完成了,可把我累(牛)壞(逼)了(壞)啦(了)

成果展現

扯了這麼多,終於到了見成果的時候了,先來看個動圖

網絡上爆炸的「喬碧蘿殿下」,成爲了我檢(祭)驗(刀)的第一人

那麼最後仍是要扣題呀,把那段緣結束掉。看看志玲姐姐微博下的評論,究竟是咋樣

其實拿到評論數據以後,簡單瀏覽了下,確實有不少難以啓齒的評論,可是呢,這個事情我以爲仍是沒有必要太上綱上線了,哈哈哈,總之祝福吧

(此處請自動過濾掉一些些不和諧因素)

下面, 前方, 高能,

前方是大型認親現場,怕引發不適的請跳過。

持續發酵的事件背後,產生了各類贏家,鬥魚平臺、主播晴子,固然還有 CXK 嘍,不能說了

最後的最後,獻上代碼:

github.com/zhouwei713/…

完!

本站公眾號
   歡迎關注本站公眾號,獲取更多信息