爬虫如何抓取网页的动态加载数据-ajax加载
本文讲的是不使用selenium插件模拟浏览器,如何获得网页上的动态加载数据。步骤如下: 一、找到正确的URL。二、填写URL对应的参数。三、参数转化为urllib可识别的字符串data。四、初始化Request对象。五、urlopen这个Request对象,获得数据。
url='http://www.*****.*****/*********'
formdata = {'year': year,
'month': month,
'day': day
}
data = urllib.urlencode(formdata)
request=urllib2.Request(url,data = data) #如果URL不带参数就是request=urllib2.Request(url)
r = urllib2.urlopen(request)
html=r.read() # html就是你要的数据,可能是html格式,也可能是json,或去他格式
后面步骤都是相同的,关键在于如何获得URL和参数。我们以新冠肺炎的疫情统计网页为例(https://news.qq.com/zt2020/page/feiyan.htm#/)。
如果直接抓浏览器的网址,你会看见一个没有数据内容的html,里面只有标题、栏目名称之类的,没有累计确诊、累计死亡等等的数据。因为这个页面的数据是动态加载上去的,不是静态的html页面。需要按照我上面写的步骤来获取数据,关键是获得URL和对应参数formdata。下面以火狐浏览器讲讲如何获得这两个数据。
肺炎页面右键,出现的菜单选择检查元素。
点击上图红色箭头网络选项,然后刷新页面。如下,
这里会出现很多网络传输记录,观察最右侧红框“大小”那列,这列表示这个http请求传输的数据量大小,动态加载的数据一般数据量会比其它页面元素的传输大,119kb相比其它按字节计算的算是很大的数据了,当然网页的装饰图片有的也很大,这个需要按照文件类型那列来甄别。
然后点击域名列对应那行,如下
可以在消息头中看见请求网址,这个就是url,点击参数可以看见url对应的参数
https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=jQuery341004532487105727312_1584498763134&_=1584498763135
可以看到url的尾部?后面已经把参数写上了。
我们如果使用带参数的URL,那么就
request=urllib2.Request(url),不加data参数。
如果使用request=urllib2.Request(url,data = data)
那么url="https://view.inews.qq.com/g2/getOnsInfo"
formdata = {'name': 'disease_h5',
'callback': '',
'_': 当前时间戳
}
name是disease_h5,callback是页面回调函数,我们不需要有回调动作,所以设置为空,_对应的是时间戳(Python很容易获得时间戳的),因为查询肺炎患者数量和时间是紧密相关的。
如果都写在一个url中是下面形式的
url='https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=&_=%d'%int(stamp*1000)
按照这个思路就可以获得疫情数据了。两种方案任你选择。
找url和参数是一项需要耐心,需要一定的分析能力的,才能正确甄别url和参数的含义,进行正确的编程实现。参数是否可以空,是否可以硬编码写死,是否有特殊要求,其实是一个很考验经验的事情。
有的url很简单,返回一个.dat文件,里面直接就是json格式的数据,这种是最友好的了。有的需要你设置大量参数,才能获得,而且获得的是html格式的,需要解析才能提取数据。解析部分请参考我之前写的BeautifulSoup解析html
- Oracle中的PUBLIC(r10笔记第14天)
- Data Guard高级玩法:通过闪回恢复switchover主库 (r10笔记第13天)
- WinForm/MIS项目开发之中按钮级权限实践
- 恢复控制文件避免使用resetlogs选项 (r10笔记第12天)
- Go实现短url项目
- 【Go 语言社区】GO语言多核并行化的问题
- mysql执行计划看是否最优
- 通过IP定位区域的SQL优化思路(r10笔记第10天)
- Java基础-day06-知识点回顾与练习
- 【Go 语言社区】Golang语言的多核并行化例子
- 一条SQL语句的执行计划变化探究(r10笔记第9天)
- 【Go 语言社区】Web 通信 之 长连接、长轮询(long polling)--转
- Dubbo入门-协议;注册中心
- Oracle 12c PDB浅析(二)(r8笔记第29天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python实现名片管理系统
- Python unittest 简单实现参数化的方法
- CentOS7部署Flask(Apache、mod_wsgi、Python36、venv)
- php的instanceof和判断闭包Closure操作示例
- PHP中的自动加载操作实现方法详解
- python 实现语音聊天机器人的示例代码
- Linux应用程序使用写文件调试程序的方法
- python3学生名片管理v2.0版
- 移植新内核到Linux系统上的操作步骤
- PHP实现简单的协程任务调度demo示例
- YII2.0框架行为(Behavior)深入详解
- php数组函数array_push()、array_pop()及array_shift()简单用法示例
- PHP+MySQL+sphinx+scws实现全文检索功能详解
- php封装的page分页类完整实例代码
- Thinkphp自定义生成缩略图尺寸的方法