做学校网站素材,中企动力科技股份有限公司广州分公司,郑州 服装网站建设,科凡网站建设目录 1. 什么是Ajax1.1 实例引入1.2 基本原理发送请求解析内容渲染网页 2. Ajax分析方法2.1 分析案例2.2 过滤请求 3. Ajax分析与爬取实战3.1 爬取目标3.2 初步探索3.3 爬取列表页分析实现基础配置爬取页面内容#xff08;获取页面的JSON内容#xff09;爬取列表页#xff0… 目录 1. 什么是Ajax1.1 实例引入1.2 基本原理发送请求解析内容渲染网页 2. Ajax分析方法2.1 分析案例2.2 过滤请求 3. Ajax分析与爬取实战3.1 爬取目标3.2 初步探索3.3 爬取列表页分析实现基础配置爬取页面内容获取页面的JSON内容爬取列表页爬取指定列表页 合并 3.4 爬取详情页分析实现爬取详情页串联调用 合并 3.5 保存数据MongoDB后期补充 使用requests获取的是原始HTML文档浏览器中的页面是JavaScript处理数据后生成的结果数据的来源 通过Ajax加载包含在HTML文档中经过JavaScript和特定算法计算后生成 Ajax加载数据 方式异步 原始页面最初不包含某些数据当原始页面加载成功后再向服务器请求某个接口获取数据 发送Ajax请求 然后将数据处理并呈现在网页上
1. 什么是Ajax
AjaxAsynchronous JavaScript and XML异步的 JavaScript 和 XML 不是一门编程语言利用 JavaScript 在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术
1.1 实例引入
下滑查看更多下滑后加载的动画Ajax 加载的过程
1.2 基本原理
从Ajax请求到网页更新的这个过程可以分为3步 发送请求解析内容渲染网页
发送请求
JavaScript对Ajax最底层的实现
var xmlhttp;
if (window.XMLHttpRequest) {xmlhttp new XMLHttpRequest();
} else {xmlhttp new ActiveXObject(Microsoft.XMLHTTP);
}// 监听服务器返回响应
xmlhttp.onreadystatechange function() {// 解析响应内容if (xmlhttp.readyState 4 xmlhttp.status 200) {document.getElementById(myDiv).innerHTML xmlhttp.responseText;}
}// 打开服务器链接
xmlhttp.open(POST, /ajax/, true);// 向服务器发送强求
xmlhttp.send();解析内容
var xmlhttp;
if (window.XMLHttpRequest) {xmlhttp new XMLHttpRequest();
} else {xmlhttp new ActiveXObject(Microsoft.XMLHTTP);
}xmlhttp.onreadystatechange function() {// 解析响应内容if (xmlhttp.readyState 4 xmlhttp.status 200) {document.getElementById(myDiv).innerHTML xmlhttp.responseText;}
}xmlhttp.open(POST, /ajax/, true);
xmlhttp.send();渲染网页
var xmlhttp;
if (window.XMLHttpRequest) {xmlhttp new XMLHttpRequest();
} else {xmlhttp new ActiveXObject(Microsoft.XMLHTTP);
}xmlhttp.onreadystatechange function() {if (xmlhttp.readyState 4 xmlhttp.status 200) {// 更改网页内容document.getElementById(myDiv).innerHTML xmlhttp.responseText;}
}xmlhttp.open(POST, /ajax/, true);
xmlhttp.send();2. Ajax分析方法
2.1 分析案例
微博 (weibo.cn)Ajax 的请求类型xhr如果 Request Headers 中有一个信息为XMLHttpRequest则此请求就是 Ajax 请求 以 getIndex 开头的请求 可以在 Preview 查看响应的内容也可以在 Response 查看真实返回的数据
2.2 过滤请求
点击 Network 中的 XHR 选项显示所有的 Ajax 请求
3. Ajax分析与爬取实战
爬取 Scrape | Movie 与 2.5Scrape | Movie不同 数据请求是通过 Ajax 实现的页面内容通过 JavaScript 渲染出来的只是呈现样式是一样的
3.1 爬取目标
爬取电影的名称、封面、类别、上映时间、评分、剧情简介等内容分析页面数据的加载逻辑用 requests 实现 Ajax 数据的爬取将每部电影数据分别保存到 MongoDB 数据库
3.2 初步探索
import requestsurl https://spa1.scrape.center/
html requests.get(url).textprint(html)获取到的 html 资源较少整个页面都是JavaScript渲染得到的浏览器执行了HTML中引用的JavaScript文件JavaScript通过调用一些数据加载和页面渲染方法才最终呈现出浏览器中的显示效果数据一般是通过Ajax加载的JavaScript在后台调用Ajax数据接口
3.3 爬取列表页
分析
请求URL的limit恒定为10offset为已经已经翻过的电影数量 ( 当前页数 − 1 ) ∗ 10 (当前页数-1)*10 (当前页数−1)∗10根据响应内容可以发现所需数据皆在其中
实现
基础配置
import logginglogging.basicConfig(levellogging.INFO,format%(asctime)s %(levelname)s: %(message)s)INDEX_URL https://spa1.scrape.center/api/movie/?limit{limit}offset{offset}爬取页面内容获取页面的JSON内容
import requestsdef scrape_api(url):logging.info(fscraping {url}...)try:response requests.get(url)if response.status_code 200:return response.json()logging.error(fStatus code: {response.status_code} while scraping {url})except requests.RequestException:logging.error(fError while scraping {url}, exc_infoTrue)爬取列表页爬取指定列表页
LIMIT 10def scrape_index(page):url INDEX_URL.format(limitLIMIT, offsetLIMIT * (page - 1))return scrape_api(url)合并
import logging
import requestslogging.basicConfig(levellogging.INFO,format%(asctime)s %(levelname)s: %(message)s)INDEX_URL https://spa1.scrape.center/api/movie/?limit{limit}offset{offset}
LIMIT 10def scrape_api(url):logging.info(fscraping {url}...)try:response requests.get(url)if response.status_code 200:return response.json()logging.error(fStatus code: {response.status_code} while scraping {url})except requests.RequestException:logging.error(fError while scraping {url}, exc_infoTrue)def scrape_index(page):url INDEX_URL.format(limitLIMIT, offsetLIMIT * (page - 1))return scrape_api(url)3.4 爬取详情页
分析
url最后的一个参数为此电影的id电影的idAjax请求返回的数据中含有电影对应的id
实现
爬取详情页
DETAIL_URL https://spa1.scrape.center/api/movie/{id}def scrape_detail(id):url DETAIL_URL.format(idid)return scrape_api(url)串联调用
TOTAL_PAGE 10def main():for page in range(1, TOTAL_PAGE 1):index_data scrape_index(page)for item in index_data.get(results):id item.get(id)detail_data scrape_detail(id)logging.info(fdetail data {detail_data})if __name__ __main__:main()合并
import logging
import requestslogging.basicConfig(levellogging.INFO,format%(asctime)s %(levelname)s: %(message)s)INDEX_URL https://spa1.scrape.center/api/movie/?limit{limit}offset{offset}
DETAIL_URL https://spa1.scrape.center/api/movie/{id}
LIMIT 10
TOTAL_PAGE 10def scrape_api(url):logging.info(fscraping {url}...)try:response requests.get(url)if response.status_code 200:return response.json()logging.error(fStatus code: {response.status_code} while scraping {url})except requests.RequestException:logging.error(fError while scraping {url}, exc_infoTrue)def scrape_index(page):url INDEX_URL.format(limitLIMIT, offsetLIMIT * (page - 1))return scrape_api(url)def scrape_detail(id):url DETAIL_URL.format(idid)return scrape_api(url)def main():for page in range(1, TOTAL_PAGE 1):index_data scrape_index(page)for item in index_data.get(results):id item.get(id)detail_data scrape_detail(id)logging.info(fdetail data {detail_data})if __name__ __main__:main()3.5 保存数据MongoDB后期补充