利用Python系统性爬取微博评论

  • 前言
  • 一、准备
  • 二、实现
    • 1.爬取用户微博
    • 2.爬取微博评论
    • 3.筛选存储评论
    • 4.整合评论数据
  • 总结

前言

本人初习Python不久,自己在实践时发现网络上其它前辈的经验或许对于初学者而言稍有难度,故分享一下自己的心得;部分内容借鉴了许多前辈的经验(文中均有标注),代码简单易上手,能有效地爬取特定用户的微博的所有评论。


提示:以下内容均为个人实践总结而来,下面案例可供参考

一、准备

整个涉及网页爬取和本地存储的过程,需要使用第三方库requests、xlwt和openpyxl(至于为什么将xlwt和openpyx混合使用后文会说明),在cmd中直接使用pip命令安装即可。

pip install request
pip install xlwt
pip install openpyxl

此外,微博面向用户有三种页面,分别是网页端、手机端和移动端;其中移动端页面最简单,爬取过程最容易,其首页网址为:link。进入该网站并登陆你自己的微博账户,按F12进入开发者模式,在Network—weibo.cn—Headers中找到user-agent和cookie,如下图。

以下以“电视剧山海情”微博用户为例,介绍如何爬取该账户所有微博下的所有评论。

二、实现

1.爬取用户微博

代码如下(示例):

import requests
import re
import timedef get_one_page(url):#获取用户主页上的所有微博的信息headers = {'User-agent' : 'your User-agent','Host' : 'weibo.cn','Accept' : 'application/json, text/plain, */*','Accept-Language' : 'zh-CN,zh;q=0.9','Accept-Encoding' : 'gzip, deflate, br','Cookie' : 'your Cookie','DNT' : '1','Connection' : 'keep-alive'}#书写请求头,注意把User-agent和Cookie替换为你自己的response = requests.get(url,headers = headers,verify=False)#利用requests.get命令获取网页htmlif response.status_code == 200:return response.textreturn Nonedef parse_one_page(html,uid):#解析文本并存储有用信息#正则解析htmlpattern1 = re.compile('id="M_.*?"', re.S)pattern2 = re.compile('评论\[.*?\]', re.S)expattern3 = re.compile('原文评论\[.*?\]', re.S)items1 = re.findall(pattern1,html)items2 = re.findall(pattern2,html)items3 = re.findall(expattern3, html)for i in items2:for j in items3:if i in j:items2.remove(i)breakresult1 = str(items1)result2 = str(items2)#将所有微博的id及其页数写入本地文本with open('D:\\PYTHON临时\\微博爬取微博id和页数\\{}.txt'.format(uid),'a',encoding='utf-8') as fp:#文件路径自替换,后同fp.write(result1)fp.write(result2)def make_one_txt(PageNum,uid):#主页翻页遍历for i in range(PageNum):url = "https://weibo.cn/{}/profile?filter=0&page=".format(uid)+str(i+1)html = get_one_page(url)print('正在爬取{}用户的第{}页微博'.format(uid,i+1))parse_one_page(html,uid)time.sleep(1)def main():uid='5513020355'#用户的uid,可在主页网址栏中找到PageNum=38#用户微博页数make_one_txt(PageNum,uid)
main()

这一步完成后,将得到一个包含所有微博id及其评论页数的文本文档(此例中为“5513020355.txt”),记之为文件一。
(前两步的代码参考:link)

2.爬取微博评论

代码如下(示例):

import requests
import re
import timek=0def get_one_page(url):#获取每条微博的所有信息headers = {'User-agent' : 'your User-agent','Host' : 'weibo.cn','Accept' : 'application/json, text/plain, */*','Accept-Language' : 'zh-CN,zh;q=0.9','Accept-Encoding' : 'gzip, deflate, br','Cookie' : 'your Cookie','DNT' : '1','Connection' : 'keep-alive'}response = requests.get(url,headers = headers,verify=False)if response.status_code == 200:return response.textreturn Nonedef parse_one_page(html,uid):#解析文本并存储有用信息global kpattern1 = re.compile('<span class="ctt">.*?</span>', re.S)pattern2 = re.compile('<span class="ct">.*?</span>', re.S)items1 = re.findall(pattern1,str(html))items2 = re.findall(pattern2,str(html))result1 = str(items1)result2 = str(items2)with open('D:\\PYTHON临时\\微博爬取文本\\微博{}of{}.txt'.format(k,uid),'a',encoding='utf-8') as fp:fp.write(result1)fp.write(result2)def make_one_txt(PageNum,uid,ComChara):#评论翻页遍历global kk=k+1for i in range(PageNum):url = "https://weibo.cn/comment/"+ComChara+"?"+uid+"&rl=1&page="+str(i)html = get_one_page(url)print('正在爬取第{}条微博的第{}页评论'.format(k,i+1))parse_one_page(html,uid)time.sleep(1)def get_PNCC(TxtStr):#读取文件一,匹配id和页数content = open(TxtStr,'r',encoding='utf-8').read()TotalComNum=content.count('评论')rawResults1 = re.findall('_.*?"',content,re.S)rawResults2 = re.findall('评论\[.*?\]',content,re.S)firstStepResults1  = []firstStepResults2  = []for result in rawResults1:firstStepResults1.append(result[result.find('_')+1:result.find('"')])for result in rawResults2:if "[0]" in result:firstStepResults2.append("此微博无评论")continuetemp=int(result[result.find('[')+1:result.find(']')])//10+1firstStepResults2.append(str(temp))ls=[firstStepResults1,firstStepResults2,TotalComNum]return lsdef main():uid='5513020355'PNCC=get_PNCC('D:\\PYTHON临时\\微博爬取微博id和页数\\{}.txt'.format(uid))for i in range(PNCC[2]):if PNCC[1][i]!="此微博无评论":make_one_txt(int(PNCC[1][i]),uid,PNCC[0][i])
main()

这一步完成后,将得到数个包含所有微博评论的文本文档(此例中为“微博1of5513020355.txt”等),记之为文件二。

3.筛选存储评论

代码如下(示例):

import re
import xlwt
import osdef make_book(uid):k=0book = xlwt.Workbook(encoding='utf-8',style_compression=0)#为每条微博添加表单while os.path.exists('D:\\PYTHON临时\\微博爬取文本\\微博{}of{}.txt'.format(k+1,uid)):  sheet = book.add_sheet('微博'+str(k+1),cell_overwrite_ok=True)content = open('D:\\PYTHON临时\\微博爬取文本\\微博{}of{}.txt'.format(k+1,uid),'r',encoding='utf-8').read()#读取文件二#初步提取评论中的文字rawResults1 = re.findall('="ctt">.*?</span>',content,re.S)rawResults2 = re.findall('="ct">.*?</span>',content,re.S)firstStepResults1  = []firstStepResults2  = []for result in rawResults1:if "@"  in result:result=result.replace('</a>','')firstStepResults1.append(result[result.find('@'):])else:firstStepResults1.append(result)for result in rawResults2:firstStepResults2.append(result)subTextHead1 = re.compile('="ctt">')subTextHead2 = re.compile('="ct">')subTextFoot = re.compile("</span>")#将评论和日期写入表单中col = ('评论序号','评论内容','评论时间')for i in range(0,3):sheet.write(0,i,col[i])i = 1for lastResult in firstStepResults1:resultExcel1 = re.sub(subTextHead1, '', lastResult)resultExcel = re.sub(subTextFoot, '', resultExcel1)sheet.write(i,0,i)sheet.write(i,1,resultExcel)i+=1i = 1for lastResult in firstStepResults2:resultExcel1 = re.sub(subTextHead2, '', lastResult)resultExcel = re.sub(subTextFoot, '', resultExcel1)sheet.write(i,2,resultExcel)i+=1k=k+1savepath = 'D:\\PYTHON临时\\评论excel\\{}.xls'.format(uid)book.save(savepath)def main():uid="5513020355"make_book(uid)main()

这一步完成后,将得到一个包含多个表单的EXCEL工作簿(此例中为“5513020355.xls”等),记之为文件三。

4.整合评论数据

在完成上面三步后,已经完成了对某一账户下所有微博的所有评论的获取了,接下来只需根据这一粗文本做进一步分析即可。
当然在此之前我们还可以将所有表单合并,并在合并的同时根据需要对评论文本进行一定的规范化处理。
在这一步前,需要将xls格式文件另存为xlsx格式文件,以便使用openpyxl——这里之所以不继续使用xlwt和xlrd,是因为xlrd无法读取数据量过大的xls文件会报错,因此这里只能转而使用针对xlsx格式的openpyxl;而不统一在前后都使用openpyxl则是由于xlwt相比于openpyxl有更高的写入效率(参考:link)。
代码如下(示例):

import jieba
import re
import openpyxldata=None
newbook=None
sheet=None
redundancy=["<a href=","<img alt="]def make_one_sheet(uid,book):global data,sheetdata = openpyxl.load_workbook('D:\\PYTHON临时\\评论excel\\{}.xlsx'.format(uid)) #读取格式转换后的文件三sheet = book.create_sheet(uid)col = ['评论序号','评论内容','评论时间']for i in range(1,3):sheet.cell(row=1,column=i).value=col[i]def fill_one_sheet():global data,sheetcount = len(data.sheetnames)k = 2for j in range(count):table = data.get_sheet_by_name('微博{}'.format(j+1))rows = table.max_rowprint('微博{}一共有{}行数据,开始清洗数据...'.format(j+1,rows))for i in range(2,rows):Comment = str(table.cell(row=i,column=2).value)Time = str(table.cell(row=i,column=3).value)if len(Time)>19:#时间规范化Time=Time[:19]if ("<a href=" in Comment) or ("<img alt=" in Comment):#去除因引用、回复或插入图片、表情而来的冗余文本head1, sep1, tail1 =Comment.partition("<")head2, sep2, tail2 =tail1.partition(">")Comment=head1+tail2Comment=Comment.replace("评论配图","")if ("@" in Comment) :head1, sep1, tail1 =Comment.partition("@")head2, sep2, tail2 =tail1.partition(":")Comment=head1+tail2if Comment != "":sheet.cell(row=k,column=1).value=k-1sheet.cell(row=k,column=2).value=Commentsheet.cell(row=k,column=3).value=Timek=k+1def save_excel(book,uid):savepath = 'D:\\PYTHON临时\\评论excel\\{}整合.xlsx'.format(uid)book.save(savepath)def main():uid="5513020355"newbook=openpyxl.Workbook()make_one_sheet(uid,newbook)fill_one_sheet()save_excel(newbook,uid)main()

总结

只需根据某一微博账户的uid即可系统性爬取其所有微博的所有评论。后续基于这些文本数据进行了进一步分析处理后,或许对单一事件、话题或对象的研究能有一定的价值。
小白第一次写文,多有疏漏之处,欢迎大佬们批评指正。

利用Python系统性爬取微博评论相关推荐

  1. php抓取微博评论,python爬虫爬取微博评论案例详解

    前几天,杨超越编程大赛火了,大家都在报名参加,而我也是其中的一员. 在我们的项目中,我负责的是数据爬取这块,我主要是把对于杨超越 的每一条评论的相关信息. 数据格式:{"name" ...

  2. Python爬虫爬取微博评论案例详解

    文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 前几天,杨超越编程大赛火了,大家都在报名参加,而我也是其中的一员. 在我们的项目中 ...

  3. 利用python如何抓取微博评论?

    [Part1--理论篇] 试想一个问题,如果我们要抓取某个微博大V微博的评论数据,应该怎么实现呢?最简单的做法就是找到微博评论数据接口,然后通过改变参数来获取最新数据并保存.首先从微博api寻找抓取评 ...

  4. python跑一亿次循环_python爬虫爬取微博评论

    原标题:python爬虫爬取微博评论 python爬虫是程序员们一定会掌握的知识,练习python爬虫时,很多人会选择爬取微博练手.python爬虫微博根据微博存在于不同媒介上,所爬取的难度有差异,无 ...

  5. python爬虫微博评论图片_python爬虫爬取微博评论

    原标题:python爬虫爬取微博评论 python爬虫是程序员们一定会掌握的知识,练习python爬虫时,很多人会选择爬取微博练手.python爬虫微博根据微博存在于不同媒介上,所爬取的难度有差异,无 ...

  6. python爬取微博恶评_python爬取微博评论的实例讲解

    python爬虫是程序员们一定会掌握的知识,练习python爬虫时,很多人会选择爬取微博练手.python爬虫微博根据微博存在于不同媒介上,所爬取的难度有差异,无论是python新入手的小白,还是已经 ...

  7. 利用 Python 自动抓取微博热搜,并定时发送至邮箱

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 夜阑卧听风吹雨,铁马冰河入梦来. ...

  8. 看看你爱的他今天是什么‘颜色‘ -- Python爬取微博评论制作专属偶像词云

    简介:快来拿出你珍藏的pick star,用大家对他的爱重塑一个他吧.通过爬取微博评论,制作你的偶像图片词云,天天都是不重样的哦! 很多人学习python,不知道从何学起. 很多人学习python,掌 ...

  9. python爬取微博评论点赞数_python 爬虫 爬微博 分析 数据

    python 爬虫 爬微博分析 数据 最近刚看完爱情公寓5,里面的大力也太好看了吧... 打开成果的微博,小作文一样的微博看着也太爽了吧... 来 用python分析分析 狗哥这几年微博的干了些啥. ...

  10. python3爬取微博评论教程_用python 爬取微博评论,怎么打开微博评论下的查看更多|...

    怎样用python爬新浪微博大V所有数据 先上结论,通过公开的api如爬到某大v的所有数据,需足以下两个条件: 1.在你的爬虫开始运行时,该大v的所有微博发布量没有超过回溯查询的上限,新浪是2000, ...

最新文章

  1. SHELL中的三神器:管道、重定向、backtick
  2. ADSL宽带为什么下载和上传速度差别如此之大?
  3. getattr的巨大作用
  4. python语言入门e_python 语言学入门第一课必看:编码规范
  5. BDOC generated after customer product id is changed in CRM - CUST_MAT_INF
  6. 3-7 基于SpringBoot的Apache Shiro环境快速搭建与配置实操
  7. 论文浅尝 | MulDE:面向低维知识图嵌入的多教师知识蒸馏
  8. 加法变乘法(蓝桥杯)
  9. oracle手动注册数据库,Oracle 11g手动创建数据库(Linux平台)
  10. 帝国后台报错:out of memory
  11. zabbix使用ICMP ping监控网络状态
  12. anaconda: command not found
  13. java 开发规约插件_阿里巴巴Java开发规约IDE插件
  14. 地摊赚钱秘籍(视频)+地摊攻略玩法(新鲜出炉)
  15. Excel 函数公式大全
  16. 什么是存储过程?用什么来调用?
  17. ubuntu 14.04 更新 flash
  18. MyBatis_Learning_3.5.7
  19. 设计模式 策略模式 以角色游戏为背景
  20. 实战| Python爬虫、构建GUI、程序打包,这篇文章带你玩过瘾!

热门文章

  1. CLodop start
  2. JavaScript之Ajax(一篇入门Ajax就够了)
  3. 简单实现京东分类页面(二)
  4. 《动手学深度学习》全系列目录
  5. 计算机文化书签,《计算机文化基础》EXCEL-机试[1]
  6. 【转】强大的矩阵奇异值分解(SVD)及其应用
  7. python chardet_chardet
  8. python中chardet库的安装和导入
  9. Lua C API 研究 —— 基础篇
  10. 用户研究:用户行为分析