爬取微博评论详细解析,学习爬取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异步数据交换动态网页相关推荐

  1. python爬取微博评论_用 python 爬取微博评论并手动分词制作词云

    最近上海好像有举行个什么维吾尔族的秘密时装秀,很好看的样子,不过我还没时间看.但是微博上已经吵翻了天,原因是 好吧,这不是我们关心的,我的心里只有学习 我爱学习 Python 爬虫 本次爬取的是这条微 ...

  2. python爬取微博评论点赞数_python爬取点赞评论数

    马上注册,结交更多好友,享用更多功能^_^ 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 本帖最后由 清歌终南 于 2018-3-24 22:35 编辑 看了小甲鱼老师的爬取网易云音乐热门评 ...

  3. python爬取微博评论(通过xpath解析的方式)

    前段时间笔者写了一份儿爬取微博评论的代码,是用了http://m.weibo.cn的接口,通过这个接口比较好的是代码比较好写,因为数据都是json格式的,规律性非常直观,属性json数据和字典操作的朋 ...

  4. 【Python爬虫实例学习篇】——5、【超详细记录】从爬取微博评论数据(免登陆)到生成词云

    [Python爬虫实例学习篇]--5.[超详细记录]从爬取微博评论数据(免登陆)到生成词云 个人博客地址:ht/tps://www.asyu17.cn/ 精彩部分提醒: (1)微博评论页详情链接为一个 ...

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

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

  6. ajax将数据显示在class为content的标签中_python爬取微博评论(无重复数据)

    python爬取微博评论(无重复数据) 前言 一.整体思路 二.获取微博地址 1.获取ajax地址2.解析页面中的微博地址3.获取指定用户微博地址 三.获取主评论 四.获取子评论 1.解析子评论2.获 ...

  7. python爬取微博评论(无重复数据)

    python爬取微博评论(无重复数据) 前言 一.整体思路 二.获取微博地址 1.获取ajax地址2.解析页面中的微博地址3.获取指定用户微博地址 三.获取主评论 四.获取子评论 1.解析子评论2.获 ...

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

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

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

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

最新文章

  1. 常见采集脑电信号的四种技术
  2. ubuntu安装时N卡黑屏处理
  3. 【错误记录】Visual Studio 中编译 NDK 报错 ( no matching function for call to ‘cacheflush‘ cacheflush(); )
  4. scala调用java代码
  5. Error:Execution failed for task ':APP:transformClassesWithDexForDebug'...
  6. 出道50年+!乘风破浪的编程语言们,能二次翻红吗?
  7. Ext.grid.CheckboxSelectionModel状态设置
  8. [Ubuntu] apt 添加第三方库
  9. C++ 重载赋值运算符与11选5平台修复
  10. 17. Element dir 属性
  11. 补办毕业、学历证明流程
  12. 基于单片机的光立方设计
  13. matlab怎么算方差和标准差,matlab怎么求矩阵的均值和标准差 看完你就知道了
  14. 什么是ROOT?ROOT权限有什么用?
  15. 工信部发文启动2019网络安全防护赛,是时候对短信验证码说再见了
  16. Elasticsearch 7.X 中文分词器 ik 使用,及词库的动态扩展
  17. Xpoded模块开发教程
  18. Python程序员爬出百套美女写真集,同样是爬虫,他为何如此突出?
  19. 大四最后一个学期去公司实习前2天的一点感悟
  20. 「编程猫」融资13亿破记录 编程是如何风靡到小学生课程的?

热门文章

  1. Manjaro清理指南
  2. 计算机考研各科时间安排,计算机考研书目、心得、时间安排等.doc
  3. 海康威视、大华摄像头RTSP视频流嵌入到谷歌Chrome等VUE页面中实时播放方案(图文教程)
  4. 查看fna文件Linux,NCBI上基因组文件格式及解释
  5. 使用Hummingbird提升Rackspace Cloud Files的性能
  6. 移动应用测试篇(4)——App测试技术(2)
  7. 在虚拟机中建立一个最简单的JSP网页,并通过Tomcat服务器发布这个网页。通过虚拟机的宿主机浏览器访问虚拟机上所发布的JSP网页
  8. 网吧软件出租,微软迟早发难
  9. java 方法名_java的命名方法
  10. 简单的图像处理——2. 图像的形态学操作:开运算与闭运算