简单爬取微博评论详细解析,学习爬取ajax异步数据交换动态网页
爬取微博评论详细解析,学习爬取ajax异步数据交换动态网页
- 1.什么是ajax异步数据交换网页
- 2.用到的工具模块和简单解释
- 3.网页内容解析
- 4.代码实现及解释
1.什么是ajax异步数据交换网页
简单来说,就像微博评论一样,你获取新的内容不需要翻页,一直在固定的一个网页不断往下拉就行,手机端和电脑端都是如此;这样的网页用,把信息不断地数出在同一个网页上地技术就是ajax,具体地不必再说,直接切入爬取正题。
2.用到的工具模块和简单解释
1.爬虫主要模块 requests模块
2.用于计时的time模块
3.用于随机获取指定内容的random模块
当然,time模块和random模块可以不需要,就能完成所有爬取功能。
不过,使用Time 是可以看一下爬取耗时,如果耗时太久想办法优化,也可以用于延迟程序运行一小段时间(就是创造爬取间隔时间),使用random是为了构造user-agent池。延迟程序运行一小段时间和构造user-agent 池都是为了防止微博发现你在爬取评论,微博反爬能力还是强的,我刚开始没用的程序延迟的时候,老是被反爬,被反爬的时候不仅爬取不到信息,连你网页上的评论也不给你看了,要等十几分钟才能恢复。
我在爬取很多条博客的时候,亲身实验,每一页爬取时间间隔在1-2s,爬取效果比较稳妥,使用user-agent池 交替更换user-agent 就可以缩短爬取时间间隔至0-1s。
3.网页内容解析
1.我爬的是移动端微博,微博主页网页https://m.weibo.cn
2.随便选取一条评论数较多的微博,点进去(我随便找了一篇7000多评论的)
3.解析第一步 f12 ,你懂的。。。找到network,再找到XHR,点进去。(XHR存放的就是通过ajax方式传递信息的文本,这些文本也是网页,网页内容是标准的json(json可以理解为str化的字典)
4.在这个页面上,光标移到左边的网页不断往下拉看评论,使劲拉到,左边的XHR里面就会产生新的文件,没错这些就是不断呈现给网页的评论数据了(上衣张图还是只有一个文件,现在有好多)
5.每一个文件装有一定数量的评论信息(你可以观察很多文件是重复的,不必理会),可以点进去双击具体查看内容,这就是我们爬取的目标了。要爬取所有评论,当然要爬取完所有的这些文件(也就是网页),现在问题是,我们怎么获取这些网页的链接呢,不可能一直拉下去拉到头呀,就算你想拉下去让他们全部刷新也要花好久。
6.怎么找到所有链接呢?注意看我红色圈圈的两条,它们后面有两串数字,mid=xxxxxx,和max_id=xxxxxxx,还有一个max_id_type,两个链接的mid是相同的(因为它是这篇博文的id,这篇博文的所有mid当然相同),max_id是不相同的,(max_id_type这两条都是0,但是后面的不一定是),所以所有这些链接的区别仅仅是max_id和max_id_type的数值了,现在就要去找它们的关系。
7.大胆猜测一下,上一条链接必定存储着怎么打开下一个链接的信息,也就是max_id和max_id_type。点开一个链接的priview可以大致查看它的信息。
点开小箭头:
一点开就会发现下一条链接的信息了。所以目标就是爬取这一条链接评论的信息的时候,记录下一条信息的max_id和max_id_type
8.找到了不断爬取的方式,那现在就要来找到我们爬取的主要内容,还是在上一张图的priview中不断点开小箭头查去更多内容。
上面两个图分别可以看出,一个链接包含19条信息,再点开一条信息看看,发现它包含评论和评论者的各种信息,都可以爬取。我这里只需要评论内容 也就是text的内容了。
9.网页解析完毕,那怎么提取这个text的内容呢?
刚才讲过,它是一个json格式的str字典(层层叠叠的字典,字典里包含着子字典),requests模块可以直接将它转化为python字典(具体看待会的代码)。按照我们的查看方式,依次是data、data、数字0、text,从后面跟着的{}、[],就可以分别出它们各自的类型分别是字典、列表、字典,text为数字0的key,评论内容为相应的value
4.代码实现及解释
# coding=utf-8
import requests
import time
import randomstart = time.time() # 开始计时
user_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60','Opera/8.0 (Windows NT 5.1; U; en)','Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0','Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2 ','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36','Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)','Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0) ',
] # 我在网上搜来的很多网页的引擎def GET_COMMENT():f = open('weibocomment.txt', 'w',encoding='utf-8')used_maxid=[0] # 接收使用过的max_id,用于判断是否爬取完毕。最后一个链接返回的max_id可能是第一个的,如果循环了说明已经爬取完毕。max_id = 0max_id_type = 0 # 开始的链接一般这两个值都是0BOOL = 0 # 用于判断是否爬取结束的标识url = 'https://m.weibo.cn/comments/hotflow?id=4487934499914367&mid=4487934499914367&max_id_type=0' # 刚开始第一个链接while 1:headers = {'Cookie': '这里些你的cookie','User-Agent': random.choice(user_agents), # 我从池里随便选一个,躲避反爬'X-Requested-With': 'XMLHttpRequest'}proxies = {'http': 'http://218.21.96.128:58080'} # 我为了反爬用了个免费代理 (可以不用,没用的话不用待会参数别写就行)}pars = {'max_id': max_id,'max_id_type': max_id_type} # 记录爬取页面的下一个链接的信息response = requests.get(url, params=pars, headers=headers, proxies=proxies) # 对链接发送请求# response 是链接的内容,和在网页打开的一样JSON = response.json() # 将它解析为Python字典try: # 避免网页内容可能出错 我用了try 继续往下for json in JSON['data']['data']: # 按照刚才的搜索路径找到JSON字典里面的子字典和列表comment = json['text'] # 读取 评论内容comment = comment.split('<')[0] # 有的评论内容后边有<>包裹的英文信息,将评论内容以 < 拆开 选取前面的一个就是想要的内容f.write(comment + '\n') # 写入目标文件# 类似的,下面找到跳转到下一条链接所需内容 max_id 和max_id_typemax_id = response.json()['data']['max_id']max_id = int(max_id) # 可能是字符串,转为数字max_id_type = response.json()['data']['max_id_type']max_id_type = int(max_id_type)print(max_id, max_id_type) # 可以打出来看看它们的变化if max_id in used_maxid:BOOL=1 # BOOL控制跳出where 循环used_maxid.append(max_id) # 接收已经使用过的max_idtime.sleep(2) # 爬完一个 暂停2秒except: # 如果爬取出错,或者爬取完毕 将BOOL设置为1 跳出爬虫BOOL = 1if BOOL:f.close() # 爬取完毕 关闭文件breakGET_COMMENT() # 运行函数
end = time.time() # 设置结束时间
total = end - start # 求取总时间单位是秒
print("总用时", total / 60, '分钟')
收工! 欢迎指点,共同学习;下一篇我将抓取三万评论做一个词云图和文字情感分析学习。
简单爬取微博评论详细解析,学习爬取ajax异步数据交换动态网页相关推荐
- python爬取微博评论_用 python 爬取微博评论并手动分词制作词云
最近上海好像有举行个什么维吾尔族的秘密时装秀,很好看的样子,不过我还没时间看.但是微博上已经吵翻了天,原因是 好吧,这不是我们关心的,我的心里只有学习 我爱学习 Python 爬虫 本次爬取的是这条微 ...
- python爬取微博评论点赞数_python爬取点赞评论数
马上注册,结交更多好友,享用更多功能^_^ 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 本帖最后由 清歌终南 于 2018-3-24 22:35 编辑 看了小甲鱼老师的爬取网易云音乐热门评 ...
- python爬取微博评论(通过xpath解析的方式)
前段时间笔者写了一份儿爬取微博评论的代码,是用了http://m.weibo.cn的接口,通过这个接口比较好的是代码比较好写,因为数据都是json格式的,规律性非常直观,属性json数据和字典操作的朋 ...
- 【Python爬虫实例学习篇】——5、【超详细记录】从爬取微博评论数据(免登陆)到生成词云
[Python爬虫实例学习篇]--5.[超详细记录]从爬取微博评论数据(免登陆)到生成词云 个人博客地址:ht/tps://www.asyu17.cn/ 精彩部分提醒: (1)微博评论页详情链接为一个 ...
- 看看你爱的他今天是什么‘颜色‘ -- Python爬取微博评论制作专属偶像词云
简介:快来拿出你珍藏的pick star,用大家对他的爱重塑一个他吧.通过爬取微博评论,制作你的偶像图片词云,天天都是不重样的哦! 很多人学习python,不知道从何学起. 很多人学习python,掌 ...
- ajax将数据显示在class为content的标签中_python爬取微博评论(无重复数据)
python爬取微博评论(无重复数据) 前言 一.整体思路 二.获取微博地址 1.获取ajax地址2.解析页面中的微博地址3.获取指定用户微博地址 三.获取主评论 四.获取子评论 1.解析子评论2.获 ...
- python爬取微博评论(无重复数据)
python爬取微博评论(无重复数据) 前言 一.整体思路 二.获取微博地址 1.获取ajax地址2.解析页面中的微博地址3.获取指定用户微博地址 三.获取主评论 四.获取子评论 1.解析子评论2.获 ...
- python爬取微博评论点赞数_python 爬虫 爬微博 分析 数据
python 爬虫 爬微博分析 数据 最近刚看完爱情公寓5,里面的大力也太好看了吧... 打开成果的微博,小作文一样的微博看着也太爽了吧... 来 用python分析分析 狗哥这几年微博的干了些啥. ...
- php抓取微博评论,python爬虫爬取微博评论案例详解
前几天,杨超越编程大赛火了,大家都在报名参加,而我也是其中的一员. 在我们的项目中,我负责的是数据爬取这块,我主要是把对于杨超越 的每一条评论的相关信息. 数据格式:{"name" ...
最新文章
- 常见采集脑电信号的四种技术
- ubuntu安装时N卡黑屏处理
- 【错误记录】Visual Studio 中编译 NDK 报错 ( no matching function for call to ‘cacheflush‘ cacheflush(); )
- scala调用java代码
- Error:Execution failed for task ':APP:transformClassesWithDexForDebug'...
- 出道50年+!乘风破浪的编程语言们,能二次翻红吗?
- Ext.grid.CheckboxSelectionModel状态设置
- [Ubuntu] apt 添加第三方库
- C++ 重载赋值运算符与11选5平台修复
- 17. Element dir 属性
- 补办毕业、学历证明流程
- 基于单片机的光立方设计
- matlab怎么算方差和标准差,matlab怎么求矩阵的均值和标准差 看完你就知道了
- 什么是ROOT?ROOT权限有什么用?
- 工信部发文启动2019网络安全防护赛,是时候对短信验证码说再见了
- Elasticsearch 7.X 中文分词器 ik 使用,及词库的动态扩展
- Xpoded模块开发教程
- Python程序员爬出百套美女写真集,同样是爬虫,他为何如此突出?
- 大四最后一个学期去公司实习前2天的一点感悟
- 「编程猫」融资13亿破记录 编程是如何风靡到小学生课程的?
热门文章
- Manjaro清理指南
- 计算机考研各科时间安排,计算机考研书目、心得、时间安排等.doc
- 海康威视、大华摄像头RTSP视频流嵌入到谷歌Chrome等VUE页面中实时播放方案(图文教程)
- 查看fna文件Linux,NCBI上基因组文件格式及解释
- 使用Hummingbird提升Rackspace Cloud Files的性能
- 移动应用测试篇(4)——App测试技术(2)
- 在虚拟机中建立一个最简单的JSP网页,并通过Tomcat服务器发布这个网页。通过虚拟机的宿主机浏览器访问虚拟机上所发布的JSP网页
- 网吧软件出租,微软迟早发难
- java 方法名_java的命名方法
- 简单的图像处理——2. 图像的形态学操作:开运算与闭运算