一、前言

有时候我们在用 requests 抓取页面的时候,得到的结果可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,但是使用 requests 得到的结果并没有,这是因为requests 获取的都是原始的 HTML 文档,而浏览器中的页面则是经过 JavaScript 处理数据后生成的结果,这些数据的来源有多种,可能是通过 Ajax 加载的, 可能是包含在 HTML 文档中的,也可能是经过 JavaScript 和定算法计算后生成的
对于第一种情况,数据加载是一种异步加载方式,原始的页面最初不会包含某些数据,原始页面。加载完后,会再向服务器请求某个接口获取数据,然后数据才被处理从而呈现到网页上,这其实就是发送了一个 Ajax 请求。
照Web 发展的趋势来看,这种形式的页面越来越多 网页的原始 HTML 文档不会包含任何数据,数据都是通过Ajax统一加载后再呈现出来的,这样在 We 开发上可以做到前后端分离,而且降低服务器直接渲染页面带来的压力。所以如果遇到这样的页面,直接利用requests 等库来抓取原始页面,是无法获取到有效数据的,这时需要分析网页后台 接口发送的 jax 请求,如果可以用 requests 来模拟 Ajax 请求,那么就可以成功抓取了。
所以,本章我们的主要目的是了解什么是 jax 及如何去分析和抓取 Ajax 请求

二、什么是Ajax

Ajax ,全称为 Asynchronous JavaScript and XML ,即异步的 JavaScript XML 它不是一门编程
语言,而是利用 JavaScript 在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。
对于传统的网页,如果想更新其内容,那么必须要刷新整个页面,但有了 Ajax ,便可以在页面不被全部刷新的情况下更新其内容 在这个过程中,页面实际上是在后台与服务器进行了数据交互,获取到数据之后,再利用 JavaScript改变网页,这样网页内容就会更新了。

  • 我们以CSDN为例子,点击Python,我们向下拉取页面,数据会不断的更新有新的内容,这就是Ajax。
  • 我们注意到页面其实并没有整个刷新,也就意味着页面的链接没有变化,但是网页中却多了新内容,也就是后面刷出来的新微博,这就是通过Ajax获取新数据呈现的过程

三、Ajax分析方法

我们以前面的CSDN为例,知道拖动刷新的内容由Ajax加载,而且也没的URL没有变化,那么应该到哪里去看这些Ajax请求呢?

  • 1.右击点击检查
  • 2.点Network
  • 3.点击XHR会呈现出XHR数据
  • 4.向下滑动,会有一条条XHR数据更新,这样我们就可以捕获到所有的 Ajax 请求了

四、实战演练

4.1爬取肯德基餐厅信息

需求:爬取肯德基餐厅查询,指定地点的餐厅数量。
网址:http://www.kfc.com.cn/kfccda/storelist/index.aspx

  • 1.我们可以看到页面是一个text,不是json

  • 2.看到所需的参数


代码实现:

# 爬取想要爬取城市的肯德基餐厅信息
import requestsif __name__ == '__main__':# 指定urlurl = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'# 动态输入查找的城市city = input('请输入您想要查找的城市:')# 参数处理param = {'cname': '','pid': '','keyword': city,        # 城市名称'pageIndex': '1',       # 页面'pageSize': '10',       # 一页显示多少数据}# 进行UA伪装header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}# 获取相应数据response = requests.post(url=url,data=param,headers=header)# 这个页面是一个text,不是jsonpage_text = response.textprint(page_text)print('数据爬取成功!')输出结果:
{"Table":[{"rowcount":65}],"Table1":[{"rownum":1,"storeName":"育慧里","addressDetail":"小营东路3号北京凯基伦购物中心一层西侧","pro":"24小时,Wi-Fi,店内参观,礼品卡","provinceName":"北京市","cityName":"北京市"},{"rownum":2,"storeName":"京通新城","addressDetail":"朝阳路杨闸环岛西北京通苑30号楼一层南侧","pro":"Wi-Fi,店内参观,礼品卡,生日餐会","provinceName":"北京市","cityName":"北京市"},{"rownum":3,"storeName":"黄寺大街","addressDetail":"黄寺大街15号北京城乡黄寺商厦","pro":"Wi-Fi,点唱机,店内参观,礼品卡,生日餐会","provinceName":"北京市","cityName":"北京市"},{"rownum":4,"storeName":"四季青桥","addressDetail":"西四环北路117号北京欧尚超市F1、B1","pro":"Wi-Fi,礼品卡,生日餐会","provinceName":"北京市","cityName":"北京市"},{"rownum":5,"storeName":"亦庄","addressDetail":"北京经济开发区西环北路18号F1+F2","pro":"24小时,Wi-Fi,礼品卡,生日餐会","provinceName":"北京市","cityName":"北京市"},{"rownum":6,"storeName":"石园南大街","addressDetail":"通顺路石园西区南侧北京顺义西单商场石园分店一层、二层部分","pro":"24小时,Wi-Fi,店内参观,礼品卡,生日餐会","provinceName":"北京市","cityName":"北京市"},{"rownum":7,"storeName":"北京南站","addressDetail":"北京南站候车大厅B岛201号","pro":"Wi-Fi,礼品卡","provinceName":"北京市","cityName":"北京市"},{"rownum":8,"storeName":"北清路","addressDetail":"北京北清路1号146区","pro":"24小时,Wi-Fi,店内参观,礼品卡","provinceName":"北京市","cityName":"北京市"},{"rownum":9,"storeName":"大红门新世纪肯德基餐厅","addressDetail":"海户屯北京新世纪服装商贸城一层南侧","pro":"Wi-Fi,点唱机,礼品卡","provinceName":"北京市","cityName":"北京市"},{"rownum":10,"storeName":"巴沟","addressDetail":"巴沟路2号北京华联万柳购物中心一层","pro":"Wi-Fi,礼品卡,生日餐会","provinceName":"北京市","cityName":"北京市"}]}
数据爬取成功!

4.2爬取国家药品监督管理局

需求:爬取国家药品监督管理局中化妆品生产许可信息管理系统服务平台,其中每个企业的详细信息。
网址:http://scxk.nmpa.gov.cn:81/xk/

  • 可以发现这是一个json动态页面
  • 我们随意点击进入一个企业,可以发现网址的区别只是后面id不一样
  • 并且可以看到他所需的参数



代码实现:

import requests
import jsonif __name__ == '__main__':# 指定url,国家药品监督总局化妆品生产许可信息管理服务平台url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'# 进行UA伪装header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}id_list = []        # 存贮id信息(需要定义在循环外,要不然就相当于每次循环都创建一个名为id_list的列表,会报错)# 从第一页到第六页信息(也可以是从第n页到第m页)# page为动态变量表示的是页码数for page in range(1,6):page = str(page)# 参数处理param = {'on': 'true','page' : page,           # 页码数'pageSize' : '15',     # 一页只有15个企业'productName': '','conditionType': '1',  # 从第一个企业开始'applyname': '','applysn': ''}# 获取相应数据# 为了获取所有企业的idresponse = requests.post(url=url,data=param,headers=header)json_id = response.json()# print(json_id)# 将id信息存入列表中for dic in json_id['list']:id_list.append(dic['ID'])# print(id_list)# 获取企业详细信息# 每个企业的化妆品生产许可信息url1 = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'# 遍历列表中的id信息,用post方法抓取数据,打印企业详细信息for i in id_list:data = {'id': i}page_post = requests.post(url=url1,headers=header,data=data).json()print(page_post)

(五) 爬虫教程 |Ajax 数据爬取相关推荐

  1. 爬虫:Ajax数据爬取

    目录 1.什么是Ajax 1.1 实例的引入 1.2 基本原理 2.Ajax分析方法 1.查看请求 2.过滤请求 3.Ajax结果提取 1.分析请求 2.分析响应 3.例子 我们在用 requests ...

  2. python爬虫基础Ⅱ——Ajax数据爬取、带参请求:QQ音乐歌单、QQ音乐评论

    文章目录 基础爬虫部分Ⅱ Ajax技术 json 1. Network 2. XHR怎么请求? 3. 什么是json? 4. json数据如何解析? 带参数请求 1. 复习 2. params 3. ...

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

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

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

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

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

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

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

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

  7. python爬虫从入门到实战笔记——第一章爬虫原理和数据爬取

    爬虫原理和数据抓取 1.1 通用爬虫和聚焦爬虫 通用爬虫 聚焦爬虫 1.2 HTTP和HTTPS HTTP的请求与响应 浏览器发送HTTP请求的过程: 客户端HTTP请求 请求方法 常用的请求报头 服 ...

  8. python财务报表预测股票价格_机器学习股票价格预测从爬虫到预测-数据爬取部分...

    声明:本文已授权公众号「AI极客研修站」独家发布 前言 各位朋友大家好,小之今天又来给大家带来一些干货了.上篇文章机器学习股票价格预测初级实战是我在刚接触量化交易那会,因为苦于找不到数据源,所以找的一 ...

  9. 爬虫之websocket数据爬取

    收集了大家的问题.我又重新写了一篇websocket的代码,并添加了注释,在文章最后.希望可以解决大家遇到的问题- websocket是最近开发很常用的技术之一,他可以一直保持着连接不断,但是你的页面 ...

最新文章

  1. Docker 清理命令集锦
  2. python快速入门答案-Python快速入门(一)
  3. .net 访问mysql链接池_c# – .NET SqlConnection类,连接池和重新连接逻辑
  4. 使用Spring Integration重试RabbitMQ
  5. JavaSE基础chapter1Homework
  6. h3c trunk口改access_H3C交换机二层应用及三层交换基本配置
  7. Leecode刷题热题HOT100(5)——最长回文子串
  8. 超级芯片电路板问世 比现有电脑快9000倍
  9. PHP实现的服务器端,PHP实现服务器端允许客户端ajax跨域
  10. 使用Aforge 开发的摄像头,有拍照,录像,设置帧率,分辨率等,以及对视频以及相机等的控制
  11. POI介绍及视频教程
  12. win10 mysql8.0修改密码
  13. Windows11 C盘清理-系统休眠文件占用15G
  14. BT源代码学习心得(七):跟踪服务器(Tracker)的代码分析(HTTP协议处理对象) -- 转贴自 wolfenstein (NeverSayNever)
  15. 事件的互斥和对立的联系和区别
  16. 信息级联(Information cascade)
  17. php artisan migrate,laravel php artisan migrate错误
  18. 2016-2017 CT S03E06: Codeforces Trainings Season 3 Episode 6(8/13)
  19. jenson nx 下使用奥比中光orbbec astra mini
  20. C# 将一种类型的数组转换为另一种类型的数组

热门文章

  1. AndroidStudio的ImageView使用网络图片
  2. [知识小节]Windbg常用指令(笔记本)
  3. [转] 40个全球免费开放的电子图书馆(给能看懂英文的用)
  4. python键盘怎么输入双引号_python中怎么输入引号 -问答-阿里云开发者社区-阿里云...
  5. TDK | CeraLink 电容器快速切换逆变器的革新
  6. 电商-- 京东和亚马逊,哪个更胜一筹?
  7. 注册资本和公司章程有关系吗
  8. dpdk 程序适配麦洛斯 mlx5 网卡
  9. TextField的圆边框
  10. python二维向量运算模拟_【转载 Python】Numpy基础:数组和矢量运算