从爬取微博中搜索的热门事件到数据分析处理全过程(一)

从爬取微博中搜索的热门事件到数据分析处理全过程(一)

本文主要阐述了作者爬取新浪微博中搜索关键词搜到的微博,不涉及技术上的讲解,主要是大体思路,因为本人比较懒,可能第二部分或遥遥无期,但是还是希望大家多多支持:


一、爬取对象及缘由

我爬取的主要是关于医患冲突的微博,初衷是为了分析医患冲突的舆情。想要爬取的对象有用户名、正文、时间、转发数、点赞数、还有评论数。爬取正文是可以做情感分析或者切词做词频分析(云图)。而用户名可以用来统计什么官方报社或者官网对这个关注最高,可以做个柱状图。同时转发数、点赞数、还有评论数可以配合时间做一定时间内的数量分析或者时序折线图。

二、爬虫步骤

1.请求页面

第一当然是进入我们亲爱的微博移动端https://m.weibo.cn/(不要问我为什么是移动端,因为简单哈,小菜真得只会这个。) 搜索关键字并右键点开审查元素。
从爬取微博中搜索的热门事件到数据分析处理全过程(一)_第1张图片
点开右边的network选项,在里面选中xhr,并滑动页面的滚动条加载出新页面,此时会出现一个表单,点击该表单。从爬取微博中搜索的热门事件到数据分析处理全过程(一)_第2张图片
接下来就是我们最喜欢的填代码时刻了。

from urllib.parse import urlencode
import requests
from pyquery import PyQuery as pq
import time
from pymongo import MongoClient

base_url = 'https://m.weibo.cn/api/container/getIndex?' 

headers = {
    'Host': 'm.weibo.cn',
    'Referer': 'https://m.weibo.cn/u/2830678474',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest',
}

def get_page(page): #得到页面的请求,params是我们要根据网页填的,就是下图中的Query String里的参数
    params = {
        'containerid': '100103type=1&q=杀医',
        'page': page,#page是就是当前处于第几页,是我们要实现翻页必须修改的内容。
        'type':'all',
        'queryVal':'医患纠纷',
        'featurecode':'20000320',
        'luicode':'10000011',
        'lfid':'106003type=1',
        'title':'医患纠纷'
    }
    url = base_url + urlencode(params)
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            print(page) 
            return response.json()
    except requests.ConnectionError as e:
        print('Error', e.args)

从爬取微博中搜索的热门事件到数据分析处理全过程(一)_第3张图片

2.解析页面

获取到页面就到了最麻烦的解析页面的环节了,因为ajax返回的是json格式,所以用pyquery特别方便,这一部分需要具体分析获得json结构,我的经验是先如果嵌套在字典里就用.get()方法,如果内容在list里,就用for循环,最终可以发发现,我们要获取的内容先大致是这样的
{data:
{cards:
[{card_group:
[{mblog:{
id:,text…
}]}
主要内容都在mblog,,解析这个花了我不少时间,真是城市套路深我要回家┭┮﹏┭┮:

def parse_page(json):
    if json:
        items = json.get('data').get('cards')

        for i in items:
            for item in i.get('card_group'):
                item = item.get('mblog')
                if item == None:
                    continue

                weibo = {}
                weibo['id'] = item.get('id')
                weibo['text'] = pq(item.get('text')).text()
                weibo['name'] = item.get('user').get('screen_name')
                if item.get('longText') != None :#要注意微博分长文本与文本,较长的文本在文本中会显示不全,故我们要判断并抓取。
                    weibo['longText'] = item.get('longText').get('longTextContent')
                else:weibo['longText'] =None
                print(weibo['name'])
                print(weibo['longText'])
                weibo['attitudes'] = item.get('attitudes_count')
                weibo['comments'] = item.get('comments_count')
                weibo['reposts'] = item.get('reposts_count')
                weibo['time'] = item.get('created_at')

                yield weibo

3.存入数据库

最后一步比较简单

if __name__ == '__main__':
    client = MongoClient()    #连接mongodb
    db = client['weibo_1']    #建立数据库
    collection = db['weibo_1']#建立表


    def save_to_mongo(result):#存入数据库
        if collection.insert(result):
            print('Saved to Mongo')

    for page in range(21,200):#循环页面
        time.sleep(1)         #设置睡眠时间,防止被封号
        json = get_page(page)
        results = parse_page(json)

        for result in results:
            save_to_mongo(result)
            print(result['time'])

最后效果,存入了mongodb中
从爬取微博中搜索的热门事件到数据分析处理全过程(一)_第4张图片
下期将会简要介绍如何从mongodb中提取文件,以及文件初期是数据清理工作,激不激动开不开心哪!
代码主要参考崔庆才的知乎专栏https://zhuanlan.zhihu.com/p/33877731,非常感谢

你可能感兴趣的:(数据分析)