Python實現微博爬蟲,爬取新浪微博

含光。發表於2020-12-14

上程式碼

import requests
import pandas as pd
import json
import re


user_type_dict = {-1:'無認證',0:'個人賬戶',3:'非個人使用者'}  # 個人:個人賬戶仍保留橙色黃色標識,非個人使用者(機構、企業、媒體等)將採用全新藍色標識。

def get_one_page(keyword,page):
    one_page_data = []
    params = {
        'containerid': f'100103type=1&q={keyword}',
        'page_type': 'searchall',
        'page': page
    }
    url = 'https://m.weibo.cn/api/container/getIndex?'# 請求api
    response = requests.get(url,params=params).text
    id_ls = re.findall('"id":"(.{16}?)",',response,re.DOTALL)
    detail_url = ['https://m.weibo.cn/detail/' + i for i in id_ls]

    for i in detail_url:
        print(i)
        response = requests.get(i).text
        # print(response)
        data = re.findall("var \$render_data = \[({.*})]\[0]",response,re.DOTALL)[0]
        data = json.loads(data)['status']
        # 發文時間
        created_at_time = data['created_at']
        # 文章id
        log_id = data['id']
        # 文章內容
        log_text = data['text']
        log_text = re.sub('<.*?>','',log_text)
        # 發文裝置
        source = data["source"]
        # 轉發數"reposts_count": 1376,
        reposts_count = data['reposts_count']
        # 評論數"comments_count": 10244,
        comments_count = data['comments_count']
        # 點贊數"attitudes_count": 326440
        attitudes_count = data['attitudes_count']
        # 使用者id-->"id": 1951123110,
        uesr_id = data['user']['id']
        # 使用者暱稱
        uesr_screen_name = data['user']['screen_name']
        # 使用者驗證型別-->"verified_type": 3,
        user_type = data['user']['verified_type']
        if user_type not in user_type_dict:
            continue
        user_type = user_type_dict[user_type]

        one_piece_data = (created_at_time,i, log_text,source,reposts_count,comments_count,attitudes_count, uesr_id, uesr_screen_name, user_type)
        column_name = ('發文時間','文章地址','文章內容','發文裝置','轉發數','評論數','點贊數','使用者id','使用者暱稱','使用者驗證型別')
        one_page_data.append(dict(zip(column_name,one_piece_data)))
        print(one_piece_data)
    return one_page_data

if __name__ == '__main__':
    keyword = input('請輸入檢索話題:')
    page = input('請輸入獲取前幾頁:')
    all_data = []
    for i in range(1,eval(page)+1):
        try:
            one_page_data = get_one_page(keyword, str(i))
        except:
            continue
        all_data += one_page_data
    df = pd.DataFrame(all_data)
    df.to_excel('微博爬取內容4.xlsx',index = False)

設計思路

從微博手機端進行爬取
https://m.weibo.cn/
在這裡插入圖片描述

進入話題列表頁面
https://m.weibo.cn/search?containerid=100103type%3D1%26q%3D%E8%80%81%E4%BA%BA%E8%A2%AB%E7%8B%97%E7%BB%8A%E5%80%92
在這裡插入圖片描述

文章詳情頁面
https://m.weibo.cn/detail/4539964169139251
在這裡插入圖片描述

我們見到的所有的資訊無非就在這兩個介面,包括文章的視訊播放量啊,評論數啊,點贊數啊,使用者資訊啊,使用者評論啊,使用者端型別啊等等,大家有興趣自行探索,我只介紹如何獲取正文和點贊評論轉發數量以及使用者型別

獲取每一頁的文章列表

在這裡插入圖片描述
在這裡插入圖片描述
我們獲取detail後面的那個標誌,是文章的id和idstr以及mid,在此,我們使用id這個變數
在這裡插入圖片描述

獲取文章的id與短文

https://www.zhihu.com/question/22099567

個人賬戶仍保留橙色黃色標識,非個人使用者(機構、企業、媒體等)將採用全新藍色標識。
在這裡插入圖片描述
在這裡插入圖片描述

評論的id

在這裡插入圖片描述

評論的詳情

詳情的url就是文章詳情連結加上評論的id
https://m.weibo.cn/detail/4539964169139251?cid=4540355267798522

但是可以直接呼叫api實現,cid就是文章的id

在這裡插入圖片描述
在這裡插入圖片描述

相關文章