一、背景&目的

心理学专业在读,又一心做一些和数据科学相关的项目,于是选择了基于微博的焦虑和抑郁识别作为毕设项目,开始从数据获取到处理建模到调参的全过程。院里和指导老师都非常在乎数据隐私问题,所以不能贸然爬虫,需要提前获取用户的知情同意才可以定向爬取目标用户的微博。在此期间也掉了不少坑,也想把经验分享给大家,所以在此整理了一下前期获取数据的过程。

二、爬虫流程

心理学临床研究中,对于这焦虑和抑郁的初步识别是通过抑郁自评量表(SDS)、焦虑自评量表(SAS)等自评量表进行的。借助问卷星广撒问卷,获取用户的微博名称和对应的量表分数,并根据实际的得分情况将用户分为3*3不同水平的用户。这部分的数据处理还是比较简单的,从问卷星导出包含得分的xlxs文件直接在excel中编写规则即,用数据透表做一个分类即可;也可以用python导入转成DataFrame更自由地做一些计算,在此便不再详述这一过程,默认已经获得了对应微博用户的昵称和对应的分类标签。

0. 调包

import pandas as pd
import requests as re
import json
import time
import random

1. UID获取

由于UID才是微博用户的唯一标识,但我担心用户找不到自己的ID或嫌麻烦不愿意参加实验,所以在通过问卷星获取用户的问卷分数时只要求用户留下了自己的微博名称,需要一步通过昵称找UID的步骤,在网上找到了一个可以直接通过昵称返回UID的接口,调取代码如下:

def getUID(nickname):# 获取用户的uidurl = 'https://open.weibo.com/widget/ajax_getuidnick.php'data = {'nickname':nickname}headers = {'user-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0','Referer': 'http://open.weibo.com/widget/followbutton.php'}res = re.post(url,data = data,headers = headers)res_js = json.loads(res.text,strict=False)try:uid = res_js['data']except:uid = -1return uid

   注意:

  • 务必要在headers传入'user-Agent'和'Referer'。这里可以直接用我提供的参数,也可以换成自己浏览器的参数和自己的应用链接。
  • 参数可以在任意网页右击,在弹出的菜单中点击[查看元素],(下图以Firefox为例)找到[网络]选项,(如果为空刷新一下页面)找到任意一个请求,在请求头中找到对应参数。

2. 发送请求

移动端微博(链接:https://m.weibo.cn/ )对爬虫比较友好,杂七杂八的内容会少一些,而且返回的数据是json,结构非常清晰。点击任意一名用户的主页,在上图所示的窗口观察网页的请求行为,我们可以发现更新的方式也非常简单,只需要调节page参数就能模拟翻页,修改containerid就能切换用户。具体实现代码如下:

def getText(text_json):
# 获取当前请求的文本text_list = []for i in range(0,10):try:text = text_json['data']['cards'][i]['mblog']['text']text_list.append(text)except:continuereturn text_listdef process(text_list):
# 处理标签for i in range(len(text_list)):#count = 0while(text_list[i].find('>')>-1):# 处理标签,获取纯文本start = text_list[i].find('<')end = text_list[i].find('>')+1text_list[i] = text_list[i][:start]+text_list[i][end:]#count = count+1#print('第'+str(i)+'段文本,经过第'+str(count)+'次操作后的结果为'+text_list[i])#print('第%d条处理的结果为%s.'%(i,text_list[i]))return text_listdef sendRequest(containerid):
# containerid为微博的uid前加230413page = 1text_list = []seconds = random.random()*5+5print('首次调取,当前休息{0}s中'.format(seconds))time.sleep(seconds)url = 'https://m.weibo.cn/api/container/getIndex?containerid=%d_-_WEIBO_SECOND_PROFILE_WEIBO'%containerid res = re.get(url)print(res.url)bugTimes = 0text_json = json.loads(res.text.encode('UTF-8'),strict=False)#print(text_json)if(text_json['ok']==1):page = page+1flag = text_json['data']['cards'][0]['card_type']print(flag)while((flag!=58)&(page<300)&(bugTimes<10)):text_list.extend(getText(text_json))url = 'https://m.weibo.cn/api/container/getIndex?containerid=%d_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page=%d'%(containerid,page)res = re.get(url)print(res.url)try:text_json = json.loads(res.text.encode('UTF-8'),strict=False)flag = text_json['data']['cards'][0]['card_type']print(str(page)+'转码成功')except:print('当前'+str(page)+'页无法转码')bugTimes = bugTimes+1page = page+1if page%5 == 0:seconds = 3+random.random()*3print('连续调取{0}页,当前休息{1}s中'.format(page,seconds))time.sleep(seconds)# print(flag)return process(text_list)else:print('该用户目前没有发布过内容。')return []

说明:

  • 由于一次请求最大可以返回10个cards(就是在页面看到的一个个小卡片),getText就是为了获取所有cards里的文本内容。cards里面还返回了其他一些数据,如果有需要可以按照格式获取其他一些想要的内容。
  • 由于返回的text中包含样式标签,process就是为了把这些标签处理掉。
  • 为了控制请求频率,在sendRequest中加了随机休息的操作。

3. 自动请求

        我把前期获取的id和昵称分别存在了id_list和nicknames中,于是最后一步就是遍历列表一个个sendRequest就可以获取目标用户的微博内容,存在新建的空corpus里啦,具体代码如下:

corpus = []
start = 20
end = start + 10
for i in range(start,end):if id_list[i]!=-1:print(nicknames[i])corpus.append([i,id_list[i],nicknames[i],sendRequest(int(id_list[i]))])else:print(nicknames[i]+'无文本')corpus.append([i,id_list[i],nicknames[i],[]])

三、总结

这篇博文只涉及到了爬虫的部分,目前博主还在对文本数据进行处理和特征提取,会随着毕设项目进度陆续更新。博主不是计算机专业出身,代码写得会有些粗糙,但是基本功能还是可以实现,希望读者在参考代码时多多思考自行进行优化噢~

【微博简易爬虫】Python获取指定微博用户的发布文本相关推荐

  1. 新浪微博APP开发应用示例之获取指定微博账户的微博内容记录

    最近在搞下新浪微博APP开发应用,这个示例之获取指定微博账户的微博内容记录 合肥网产品中心 新浪微博APP开发应用示例演示 < html > < head > < tit ...

  2. python下载文件到指定目录-Python获取指定文件夹下的文件名的方法

    本文采用os.walk()和os.listdir()两种方法,获取指定文件夹下的文件名. 一.os.walk() 模块os中的walk()函数可以遍历文件夹下所有的文件. os.walk(top, t ...

  3. python获取指定目录下的所有指定后缀的文件名

    python获取指定目录下的所有指定后缀的文件名 使用到的函数有: os.path.splitext():分离文件名与扩展名 代码如下: #! /usr/bin/python # -*- coding ...

  4. Python 获取指定模块基址

    因为昨天研究FPS游戏时候,发现有个动态地址每次重启电脑都会不同,然后因为有过用C和易语言编写指定模块名获取基址的经验,所以打算用Python来试试 在网上搜索了一点资料,发现有吾爱有一篇是使用Pyt ...

  5. php获取微博热搜,Python获取微博热搜的方法

    原标题:Python获取微博热搜的方法 微博热搜的爬取需要用到lxml和requests两个库 url=https://s.weibo.com/top/summary?Refer=top_hot&am ...

  6. python发微博_用 Python 自动发微博

    虽然微博官方有Python SDK,但是下载链接竟然失效了??在Pypi找到一个库--weibo,貌似还不错 安装weibo库 pip install weibo 报错 "ERROR: Co ...

  7. 利用python获取指定url在ATS中缓存对象的信息

    业务需求 给定url,如何查询指定的ATS中是否有该url的缓存对象信息?如果缓存了的话,希望提供该缓存对象的大小,缓存时间,缓存文件名,缓存份数(document alternative)等等信息 ...

  8. 用python写脚本筛选原创微博_基于python编写的微博应用

    本文实例讲述了基于python编写的微博应用,分享给大家供大家参考.具体如下: 在编写自己的微博应用之前,先要到weibo开放平台申请应用的公钥和私钥. 下载python版的SDK,打开example ...

  9. 基于python的微博_基于python编写的微博应用

    本文实例讲述了基于python编写的微博应用,分享给大家供大家参考.具体如下: 在编写自己的微博应用之前,先要到weibo开放平台申请应用的公钥和私钥. 下载python版的SDK,打开example ...

最新文章

  1. 刀模图是什么意思_“吃鸡”光子公布神秘图,海岛图上有44个坐标,暗示信号值取消?...
  2. Windows核心编程 第十九章 DLL基础
  3. 《java多线程编程实战指南 核心篇》读书笔记二
  4. 【加法笔记系列】逻辑电路的实现
  5. linux关闭沙盒模式,打开或关闭沙盒模式以禁用宏
  6. 十进制大数的加法运算
  7. Java 进阶——自动装箱和自动拆箱
  8. html提交列表编号自动生成目录,解析 Html 自动生成目录 TOC 的相关代码
  9. 三位数的茎叶图怎么看_人参怎么判断年份,这些点你要了解
  10. fat+linux权限,Linux 文件和目录权限详细介绍
  11. Ta还没有分享呢,过段时间再来看看吧~ 解决办法
  12. Oracle RAC详解
  13. 移动前端开发人员必知必会:移动设备概述
  14. 通过建设银行外联平台进行转账/提现操作(Java)
  15. 两个例子让你了解什么是中介作用和调节作用
  16. 任正非在持股员工代表会上讲:我的家人永不会进入接班人序列
  17. 2021年诺贝尔物理学奖——平衡混沌与秩序的复杂
  18. 如何从零开始建站,四个步骤了解一下
  19. 1e计算机,1E: 错误
  20. 潇的MySQL自学日记-汇总(二)

热门文章

  1. Spark MLlib特征处理:MinMax最大最小值区间缩放---原理及实战
  2. Matebook xpro2019指纹驱动不可用
  3. 跟我一起写 Makefile
  4. Semantic Proximity Search on Heterogeneous Graph by Proximity Embedding
  5. 图片处理中对于Sigmod函数图像的理解
  6. 04oracle单表查询、连接查询、子查询
  7. C语言中的类型限定符有哪些?
  8. PowerMock使用-Mock私有方法
  9. YGG 与 Thirdverse 达成合作,将《足球小将》IP 带入 Web3
  10. 聚观早报 | 苹果被曝开发16英寸iPad;5.5G已经取得关键进展