尝试Ajax数据爬取微博

作者:墨非墨菲非菲

前言

时光荏苒,岁月如梭。在不经意间,一天的时光化作一分一秒,毫无动静的却电光火石般滑过指缝,再难寻觅。转眼又到了周五,又是哪个熟悉的周五,放学铃一响,瞬间人去楼空。我独自坐在教室的最后一排,靠着后窗,独守空门。人群的一合一散,一动一静,让人踌躇难安,举止无状。静静地望着楼下那颗银杏树,人在二楼教室,时间定格在2013年11月的某个周五,思绪却早已飘向了远方。

上面一段引用了当年极其矫揉造作的日记。到这里,可能好事的读者就要问了,请问这位上下,那您的思绪究竟飘到了哪里呢?我要说,既不是张骞出使的塞外边疆的豪壮,也不似田维心心念念半亩花田文静。没错,那个懵懂的年轻人想到了今天的主题————爬取Ajax数据。

一. 简要介绍Ajax

Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式、快速动态网页应用的网页开发技术,无需重新加载整个网页的情况下,能够更新部分网页的技术。
通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

翻译一下,网页的html框架就像一个出租房,它里面定义了客厅,厨房和卫生间,但是里面究竟放什么不管。这时,来了一个客户,装饰了客厅,厨房和卫生间(JavaScript)。当下一个客户来时,依然可以用这个空的出租屋来装饰她的房间(网页前端显示)。数据通过Ajax请求和传输,并最后通过网页加载和渲染出来,这样数据的位置(XHR)和格式就清楚出了。

二. 面向对象编程

整篇代码的完成建立在许多函数之上的。把每一个单独的功能封装为一个方法(也叫函数),并调用,面向一个个单独的对象。这里的对象,不是你的对象,当然也不是我的对象6_6。面向对象有一个显而易见的好处,在参数修改的时候非常方便,之后的维护升级只需要在函数内部进行处理,不会牵一发而动全身体。举个例子,同样要把大象放进冰箱里面(大象内心os:我做错了什么?)面向过程编程需要:打开冰箱;放入大象;关上冰箱。而面向对象编程需要:定义打开冰箱的方法;定义放入大象的方法;定义关上冰箱门的方法;定义主函数(main())并调用以上的方法。
这里,看起来面向对象编程要复杂太多。但是,当你换到装一个新的大象的时候,面向过程编程就会出现:大象(我要我的Hair冰箱_),改完后,关冰箱门(从新定义关Hair冰箱门的方法)而面向对象编程只需要在主函数里面修改新的大象,新的冰箱。这就是方便之处。

三. 步骤实现

1.写一个步骤

打开weibo主页后,显示每一条微博,下拉到底刷新。研究源代码,发现信息并不在html里面,猜测应该是Ajax动态加载。打开XHR,找到了每一条微博的地址。于是,大概的构思就出来了:

  1. :获取主页,解析json,找到每一条动态的url。
  2. :获取一条动态,解析json,得到文本,时间,设备,转发评论点赞数和前五条评论。
  3. :储存。

2.导入库,主页和Headers

先导入requests,之后需要什么再往里面添加就行了。

3.定义方法,获取每一条动态的网址

这里发现了一个巨大的问题!!!原以为微博会用offset=’/d’来切片不同的网页,结果我让我准备关电脑的是,出现了让我完全找不着规律的since_id,它的整个完整的url长这样:

urls = ['https://m.weibo.cn/status/IvxUIvnzi?mblogid=IvxUIvnzi&luicode=10000011&lfid=1076032830678474','https://m.weibo.cn/status/IyieDa0M1?mblogid=IyieDa0M1&luicode=10000011&lfid=1076032830678474','https://m.weibo.cn/status/Ix2jNtRNI?mblogid=Ix2jNtRNI&luicode=10000011&lfid=1076032830678474'

没错,所有的字段都一样,唯独这个mblogid完全找不到规律。
遂有面向谷歌和CSDN和ctrl+find找到了,原来它隐藏在每一页的data[‘cardlistInfo’][“since_id”]下面。问题解决了。
此时获取每一条动态的方法返回两个参数:since_id, list_each_page。

4.主函数里面循环前10页

先放入一个默认的参数(第一个url的参数)sence_id,for循环爬取20页,再次for循环取这一页的每一个动态的url。

5.定义方法,获取每一个动态的信息

信息是多种多样的并且散乱不堪,这个时候数据清洗和格式化就显得特别重要!在前面一文浅谈解析库XPath,bs4和pyquery中,没有提到regex,因为它实在复杂。然而,re确实操作字符串(string)的绝对利器,可以对字符串进行任何想到达到的操作。比如时间文本等等。这里需要提取mblogid的字段也就水到渠陈了,像这样:

import re
url = 'https://m.weibo.cn/status/IvxUIvnzi?mblogid=IvxUIvnzi&luicode=10000011&lfid=1076032830678474'
each_url_right = re.findall('.*mblogid=(.*?)&.*',url)

这一步没什么问题。唯独解析json的时候字典列表互相嵌套的特别仔细。

6.主函数main()里运行

试跑几次发现这里面会有错误的数据,会报错。后来加上了try…except字段以确保顺利的跑完全程。还有一个问题至今也没想明白,迭代列表后导入单个url之后为什么进入函数里面回事list,实在没搞明白,时间关系type()并打印后直接取索引值了。

7.储存csv

储存到excel中,但是没有相关的储存字典的方法。于是我就选取csv中的csv.DictWriter()方法。
第一次出现了每一次都写入一行header,糟糕,写表头一个方法,写content一个方法。
第二次出现了空行,百度之后发现需要在打开文件的时候加入" newline=’’ "
成功解决!
展示一下爬取后的excel结果。

四. 结束语

时间一晃而过,从周四中午11点到下午三点,所有的数据最后呈现在屏幕面前无疑是激动的,晚上抽时间整理了’尝试Ajax数据爬取微博.md’出来,算是分享个人的一点经验和心得。最后展示一下源代码。

尝试Ajax数据爬取微博相关推荐

  1. 简单爬虫Ajax数据爬取——今日头条图片爬取

    一.Ajax简介 什么是Ajax? Ajax 即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML),是指一种创建交互式网页 ...

  2. 《PYTHON3网络爬虫开发实践》——第六章 Ajax数据爬取

    第六章 Ajax数据爬取 有时候我们在用requests抓取页面的时候,得到的结果可能和在浏览器中看到的不一样:这是因为requests 获取的都是原始的HTML文档,而浏览器中的页面则是经过Java ...

  3. Python爬虫——Ajax数据爬取

    前言 有时候我们在用requests抓取页面的时候,得到的结果可能和在浏览器中看到的不一样,在浏览器中可以看到正常显示的页面数据,但使用requests得到的结果并没有.这是因为在requests获得 ...

  4. Python3 爬虫学习笔记 C03 【Ajax 数据爬取】

    Python3 爬虫学习笔记第三章 -- [Ajax 数据爬取] 文章目录 [3.1]Ajax 简介 [3.2]解析真实地址提取 [3.1]Ajax 简介 Ajax - Asynchronous Ja ...

  5. python网络爬虫学习笔记(十一):Ajax数据爬取

    文章目录 1.基本介绍 2.基本原理 3.实战 有时候我们在用requests抓取页面的时候,得到的结果可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,但是使用requests得到 ...

  6. (五) 爬虫教程 |Ajax 数据爬取

    一.前言 有时候我们在用 requests 抓取页面的时候,得到的结果可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,但是使用 requests 得到的结果并没有,这是因为requ ...

  7. 利用新浪API实现数据的抓取\微博数据爬取\微博爬虫

    PS:(本人长期出售超大量微博数据.旅游网站评论数据,并提供各种指定数据爬取服务,Message to YuboonaZhang@Yahoo.com.由于微博接口更新后限制增大,这个代码已经不能用来爬 ...

  8. 利用新浪API实现数据的抓取\微博数据爬取\微博爬虫 1

    PS:(本人长期出售超大量微博数据.旅游网站评论数据,并提供各种指定数据爬取服务,Message to YuboonaZhang@Yahoo.com.由于微博接口更新后限制增大,这个代码已经不能用来爬 ...

  9. python实例3.0——动态页面:Ajax数据爬取

    页面内容的生成方式 动态页面区别于静态页面的最主要特征是页面内容的生成方式,动态页面的内容 生成方式可以分成两类,即服务端生成.客户端生成. 服务器端生成  Web内容管理系统,页面主要内容和页面的 ...

  10. Python模拟Ajax请求爬取微博

    一 分析请求 1 Chrome浏览器打开开发工具,然后访问https://m.weibo.cn/u/2830678474 2 一直滑动页面以加载新的微博内容.可以看到,会不断有Ajax请求发出. 3  ...

最新文章

  1. linux kernel makefile analysis
  2. 并发库应用之三 线程池与定时器应用
  3. 不是python中用于开发用户界面的第三方库-Python计算生态习题(50题)
  4. [转]GridView导出Excel总结
  5. run webIDE application using mock data
  6. 2021年茂名市高考成绩查询,2021年茂名高考最高分多少分,历年茂名高考状元
  7. 快速排序查询第k大元素C语言,快速排序和查找第K大元素
  8. iOS任何界面全屏炫酷倒计时,一句代码就够了
  9. 用脚踹?地震火灾中,如何快速打开人脸识别闸机门?
  10. 利用WPF建立自适应窗口大小布局的WinForm窗口
  11. iOS 内购详解及遇到的坑
  12. Atitit rest框架选型总结 Resteasy 实现 但是麻烦 作为JAX-RS的标准实现,RestEasy还具有以下亮点特性:   1)不需要配置文件,只要把JARs文件放到类路径里面
  13. LeetCode(2) 两数相加递归解法,速度最快,内存消耗最小
  14. BXP无盘中启用bootp服务的设置详解(转)
  15. 统计学 常用的数据分析方法大总结,推荐收藏
  16. AndroidStudio插件集合
  17. linux下c/c++实例之十四c实现的bt软件下载(记录)
  18. 局域网计算机怎样注销用户名,win10系统取消局域网共享用户名密码的解决办法...
  19. python实现税后工资计算器_[宜配屋]听图阁
  20. VOT数据集下载——(vot2013到vot2019)

热门文章

  1. 计算机加内存还是固态硬盘,电脑运行速度慢加内存条还是固态硬盘
  2. 使用Blynk打造一款物联网产品
  3. 虚拟主机终极选购指南
  4. length php,length与size()使用对比
  5. 2019.05 随笔
  6. chm文档制作 java_自己动手制作chm格式开源文档
  7. WebGL/ThreeJS项目结构介绍2-创建地板并贴图
  8. threejs学习笔记:贴图实现木地板效果
  9. 计算机桌面文件能单独设密码吗,win7文件夹设置密码_给单独一个文件夹设密码...
  10. Cropper使用(图片裁切)