使用ajax爬取微博

分析请求

Chrome浏览器点击我的微博首页之后,右键检查→手机模式→刷新之后url变成https://m.weibo.cn/p... →network→XHR筛选

在这里插入图片描述

依次对不同类型的内容进行预览

  • 以home开头的请求:空白框架,无实质内容

在这里插入图片描述

  • 以config开头的请求:用于校验
  • 以getIndex开头的请求:
    • 如果请求的url中containerid=100505+id,则内容是网页设置
      在这里插入图片描述
    • 如果请求的url中containerid=107603+id,则内容是微博内容
      在这里插入图片描述
    • 后一个url中since_id的内容来源于上一次请求返回的内容
      在这里插入图片描述

请求一页的函数

import requests
uid = "3759694794"
headers = {
    'Accept': 'application/json, text/plain, */*',
    'MWeibo-Pwa': '1',
    'Referer':
    'https://m.weibo.cn/p/100505'+uid+'/home?from=page_100505_profile&from=page_100505_profile&wvr=6&wvr=6&mod=data&mod=data&is_all=1&is_all=1&jumpfrom=weibocom',
    'User-Agent':
    'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Mobile Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest',
    'X-XSRF-TOKEN': '3ef4df'
}
baseurl = "https://m.weibo.cn/api/container/getIndex?from[]=page_100505_profile&from[]=page_100505_profile&wvr[]=6&wvr[]=6&mod[]=data&mod[]=data&is_all[]=1&is_all[]=1&jumpfrom=weibocom&containerid=107603"
def get_onepage(url):
    try:
        response = requests.get(url, headers)
        if response.status_code == 200:
            return response.json()
    except requests.ConnectionError as e:
        print('Error:', e.args)
testjson = get_onepage(baseurl+uid)

解析json

## 获取sinceid
testjson['data']['cardlistInfo']['since_id']
4471262158450663
## 获取微博总数
testjson['data']['cardlistInfo']['total']
1515
## 获取微博
import re
for m in testjson['data']['cards']:
    if m['card_type'] == 9:
        print('创建时间:', m['mblog']['created_at'])
        if m['mblog'].get('raw_text') == None:
            print('原创内容:', re.sub('<s.*>', '', m['mblog']['text']))
        else:
            print('转载内容:', m['mblog']['raw_text'])
创建时间: 昨天 21:20
转载内容: 哈哈哈//@马伯庸 :给你看这件事的后续,这兄弟俩的互动实在太……狗了 http://t.cn/A6hrdI0a //@幻想狂劉先生 :段子感也太强了
创建时间: 02-20
转载内容: //@大侦探家福尔摩斯 :此案无反馈!
创建时间: 02-17
转载内容: 我也想当助理//@著名网黄猫日 :我的工作之路真的很艰辛
创建时间: 02-15
转载内容: 转发微博
创建时间: 02-14
原创内容: 王者荣耀搞到改名卡啦,现在我叫鹤立鳖群 
创建时间: 02-13
转载内容: [并不简单]
创建时间: 02-13
转载内容: //@折翼丛林 :可怜的北红尾鸲……可以用风油精去胶(千万别硬撕),接着用洗洁精去风油精,再用温水去洗洁精,最后用吹风机吹干。用个大纸箱装起来让它休息一下,注意保暖,喂点水,等体力恢复后就放飞(不要抛扔,放在树枝上就可以了)
创建时间: 02-13
转载内容: 转发微博
创建时间: 02-13
转载内容: [冲锋队员]

整合函数

import pandas as pd
def get_weibo(uid, number):
    headers = {
        'Accept': 'application/json, text/plain, */*',
        'MWeibo-Pwa': '1',
        'Referer': 'https://m.weibo.cn/p/100505' + uid +
        '/home?from=page_100505_profile&from=page_100505_profile&wvr=6&wvr=6&mod=data&mod=data&is_all=1&is_all=1&jumpfrom=weibocom',
        'User-Agent':
        'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Mobile Safari/537.36',
        'X-Requested-With': 'XMLHttpRequest',
        'X-XSRF-TOKEN': '3ef4df'
    }
    baseurl = "https://m.weibo.cn/api/container/getIndex?from[]=page_100505_profile&from[]=page_100505_profile&wvr[]=6&wvr[]=6&mod[]=data&mod[]=data&is_all[]=1&is_all[]=1&jumpfrom=weibocom&containerid=107603"+uid
    info = get_onepage(baseurl)
    tnumber = info['data']['cardlistInfo']['total']
    # 确保要爬取的微博数小于等于微博总数
    if tnumber < number:
        number = tnumber
    timelist = []
    contentlist = []
    baseurl  = baseurl + "&since_id="
    while len(timelist) < number:
        for m in info['data']['cards']:
            if m['card_type'] == 9:
                timelist.append(m['mblog']['created_at'])
                if m['mblog'].get('raw_text') == None:
                    contentlist.append('原创内容:' + re.sub('<.*>', '', m['mblog']['text']))
                else:
                    contentlist.append('转载内容:' + m['mblog']['raw_text'])
        if info['data']['cardlistInfo'].get('since_id') == None:
            break
        since_id = info['data']['cardlistInfo']['since_id']
        info = get_onepage(baseurl+str(since_id))
    output = pd.DataFrame( data={"时间":timelist, "内容":contentlist})
    # 解决中文乱码
    output.to_csv( uid+".csv", encoding="utf_8_sig")
get_weibo("3759694794", 30)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/jining11/article/details/104488733
今日推荐