python爬取微博动态页面id、内容、评论点赞数存入MongoDB 详解

前情提要

本次爬取有未解决的问题
1.用urlencode合成的url解析出错
2.微博爬取个人微博页面不知道如何翻页
但是操作和代码可以实现在m.weibo.cn输入关键字后出现的页面的 爬取

一、具体操作及注意事项

1.获取解析json文件

微博有
weibo.com和m.weibo.cn两种页面
从weibo.com打开要爬的页面 XHR中全是视频分流数据 找不到需要的文件
在这里插入图片描述
所以要注意换为m.weibo.cn这个网址
在这里插入图片描述
如果分析某个人的个人微博暂时还未找到url翻页的规律
在这里插入图片描述
本次通过搜索关键字爬取整个关键字下面的内容
在这里插入图片描述
在这里插入图片描述

以这种方式输入url 输出后url正常但是解析json数据异常
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
因为本次只改变page后面的数 所以去掉params传入的方式 直接传入
在这里插入图片描述
发现可以输出解析的json文件
在这里插入图片描述
代码:

def getjson(p):

    url = 'https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E5%A4%A7%E6%95%B0%E6%8D%AE&page_type=searchall&page='+str(p)
    '''params = {
            'containerid':'100103',
            'type':'1',
            'q':'大数据',
            'page_type':'searchall',
            'page':p
                }
    url = base_url + urlencode(params)'''  
    headers={
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'
            }
    
    cookies={
            '_T_WM':'45882317882',
            'XSRF-TOKEN':'ee8062',
            'WEIBOCN_FROM':'1110006030',
            'MLOGIN':'0',
            'M_WEIBOCN_PARAMS':'luicode%3D10000011%26lfid%3D1076032286908003%26fid%3D100103type%253D1%2526q%253D%25E5%25A4%25A7%25E6%2595%25B0%25E6%258D%25AE%26uicode%3D10000011'
            }#这里的headers和cookies需要自己从网站中复制
    try:
        res = requests.get(url,headers=headers,cookies=cookies)
        if res.status_code == 200:
            return res.json()
    except requests.ConnectionError as e:
        print('抓取错误', e.args)

2.获取微博内容

将下图的url复制到火狐浏览器中 出现json格式的文件(别的浏览器无法出现 可以复制到json在线解析 进行解析 或者直接从preview中看)
在这里插入图片描述

在这里插入图片描述

def wb_bigdata(json):
    items = json.get('data').get('cards')#先定位到cards 因为cards下是列表 此时items返回的也是列表
    #print(items)
    for item in items:
        item2 = item.get('mblog')#定位到mblog
        #print(item2)
        if item2:
            data = {
                'id': item2.get('id'),
                'text': pq(item2.get("text")).text(),  # 仅提取内容中的文本(pq为前面调用的pyquery包 用于网页解析 因为直接item2.get(“text”)得到的是所有的文本加视频图片链接 比较混乱 所以这里获取text比较特殊)
                'attitudes': item2.get('attitudes_count'),
                'comments': item2.get('comments_count'),
                'reposts': item2.get('reposts_count')
            }
            yield data #生成器 相当于return 但是把数据暂时保存起来 最终输出 如果直接用return输出的是最后的一段数据

3.存入MongoDB数据库

首先在cmd下打开mongodb
在这里插入图片描述
打开mongodb-compass可视化界面
代码如下:

def w_mongodb(results):
    myclient = pymongo.MongoClient('mongodb://127.0.0.1:27017')#链接到MongoDB
    mydb = myclient["wb_bigdata"]#链接到数据库
    mycol = mydb["bigdata"]#连接到表
    for result in results:
        
        myset = [result]
        mycol.insert_many(myset)#输入
    print("成功")
    

总代码及结果展示

import requests
from pyquery import PyQuery as pq
import pymongo
from pymongo import MongoClient

def getjson(p):

    url = 'https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E5%A4%A7%E6%95%B0%E6%8D%AE&page_type=searchall&page='+str(p)
    '''params = {
            'containerid':'100103',
            'type':'1',
            'q':'大数据',
            'page_type':'searchall',
            'page':p
                }
    url = base_url + urlencode(params)'''  
    headers={
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'
            }
    
    cookies={
            '_T_WM':'45882317882',
            'XSRF-TOKEN':'ee8062',
            'WEIBOCN_FROM':'1110006030',
            'MLOGIN':'0',
            'M_WEIBOCN_PARAMS':'luicode%3D10000011%26lfid%3D1076032286908003%26fid%3D100103type%253D1%2526q%253D%25E5%25A4%25A7%25E6%2595%25B0%25E6%258D%25AE%26uicode%3D10000011'
            }
    try:
        res = requests.get(url,headers=headers,cookies=cookies)
        if res.status_code == 200:
            return res.json()
    except requests.ConnectionError as e:
        print('抓取错误', e.args)
def wb_bigdata(json):
    items = json.get('data').get('cards')
    #print(items)
    for item in items:
        item2 = item.get('mblog')
        #print(item2)
        if item2:
            data = {
                'id': item2.get('id'),
                'text': pq(item2.get("text")).text(),  # 仅提取内容中的文本(pq为前面调用的pyquery包 用于网页解析 因为直接item2.get(“text”)得到的是所有的文本加视频图片链接 比较混乱 所以这里获取text比较特殊)
                'attitudes': item2.get('attitudes_count'),
                'comments': item2.get('comments_count'),
                'reposts': item2.get('reposts_count')
            }
            yield data #生成器 相当于return 但是把数据暂时保存起来 最终输出 如果直接用return输出的是最后的一段数据
def w_mongodb(results):
    myclient = pymongo.MongoClient('mongodb://127.0.0.1:27017')
    mydb = myclient["wb_bigdata"]
    mycol = mydb["bigdata"]
    for result in results:
        
        myset = [result]
        mycol.insert_many(myset)
    print("成功")
    
if __name__=='__main__':
    for page in range(1,10):
        json=getjson(page)
        results=wb_bigdata(json)
        #print(result)
        w_mongodb(results)

输出结果:
在这里插入图片描述
数据库结果
在这里插入图片描述

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值