当前位置: 首页 > news >正文

【爬虫】5.5 Selenium 爬取Ajax网页数据

目录 

AJAX 简介

任务目标

创建Ajax网站

创建服务器程序

编写爬虫程序


AJAX 简介

        AJAX(Asynchronous JavaScript And XML,异步 JavaScript 及 XML)

  1. Asynchronous 一种创建交互式快速动态网页应用的网页开发技术
  2. 通过在后台与服务器进行少量数据交换,无需重新加载整个网页的情况下,能够异步更新部分网页的技术。
  3. AJAX是一种新的技术组合,即基于因特网标准,组合以下技术:
  • XMLHttpRequest 对象(与服务器异步交互数据)
  • JavaScript/DOM(显示/取回信息)
  • CSS(设置数据的样式)
  • XML(常用作数据传输的格式)


任务目标

  1. 现在的网页中大量使用了Ajax技术,通过JavaScript在客户端向服务器发出请求,服务器返回数据给客户端,客户端再把数据展现出来,这样做可以减少网页的闪动, 让用户有更好的体验。
  2. 我们先设计一个这样的网页,然后使用 Selenium 编写爬虫程序爬取网页的数据。

创建Ajax网站

phone.html 如下:

注:phone.html 文件要位于 templates 这个目录下

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body onload="init()">
<div>选择品牌<select id="marks" onchange="display()"></select></div>
<div id="phones"></div>
</body>
<script>function init() {var marks = new Array("华为", "苹果", "三星");var selm = document.getElementById("marks");for (var i = 0; i < marks.length; i++) {selm.options.add(new Option(marks[i], marks[i]));}selm.selectedIndex = 0;display();}function display() {try {var http = new XMLHttpRequest();var selm = document.getElementById("marks");var m = selm.options[selm.selectedIndex].text;http.open("get", "/phones?mark=" + m, false);http.send(null);msg = http.responseText; //传递参数,一般post方法使用,get不传参数obj = eval("(" + msg + ")");  //eval(”(执行的内容)”);加上圆括号的目的是迫使eval函数在运行JavaScript代码的时候强制将括号内的表达式转化为JavaScript对象。// JS中将JSON的字符串解析成JSON数据格式s = "<table width='200' border='1'><tr><td>型号</td><td>价格</td></tr>"for (var i = 0; i < obj.phones.length; i++) {s = s + "<tr><td>" + obj.phones[i].model + "</td><td>" + obj.phones[i].price + "</td></tr>";}s = s + "</table>";document.getElementById("phones").innerHTML = s;} catch (e) {alert(e);}}
</script>
</html>

创建服务器程序

服务器server.py程序如下:

import flask
import jsonapp = flask.Flask(__name__)@app.route("/")
def index():return flask.render_template("phone.html")@app.route("/phones")
def getPhones():mark = flask.request.values.get("mark")phones = []if mark == "华为":phones.append({"model": "P9", "mark": "华为", "price": 3800})phones.append({"model": "P10", "mark": "华为", "price": 4000})elif mark == "苹果":phones.append({"model": "iPhone5", "mark": "苹果", "price": 5800})phones.append({"model": "iPhone6", "mark": "苹果", "price": 6800})elif mark == "三星":phones.append({"model": "Galaxy A9", "price": 2800})s = json.dumps({"phones": phones})  # python对象转化为json字符串return sapp.run()

网站结果如下:
 


编写爬虫程序

(1) 创建一个浏览器对象driver,使用这个driver对象模拟浏览器。

(2) 访问http://127.0.0.1:5000网站,爬取第一个页面的手机数据。

(3) 从第一个页面中获取<select>中所有的选择项目options。

(4) 循环options中的每个option,并模拟这个option的click点击动作,触发 onchange

爬虫程序 WebScraper.py 如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import timedef spider(index):trs = driver.find_elements(By.TAG_NAME, "tr")for i in range(1, len(trs)):  # 从第二行开始查找和提取# print(i)tds = trs[i].find_elements(By.TAG_NAME, "td")model = tds[0].textprice = tds[1].textprint("%-16s%-16s" % (model, price))select = driver.find_element(By.ID, "marks")options = select.find_elements(By.TAG_NAME, "option")if index < len(options) - 1:index += 1options[index].click()time.sleep(3)spider(index)chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome()
driver.get("http://127.0.0.1:5000")spider(0)  # 从option=0开始driver.close()

运行结果:


下一篇文章:5.6 Selenium等待HTML元素

相关文章:

【爬虫】5.5 Selenium 爬取Ajax网页数据

目录 AJAX 简介 任务目标 创建Ajax网站 创建服务器程序 编写爬虫程序 AJAX 简介 AJAX&#xff08;Asynchronous JavaScript And XML&#xff0c;异步 JavaScript 及 XML&#xff09; Asynchronous 一种创建交互式、快速动态网页应用的网页开发技术通过在后台与服务器进行…...

thinkphp6 入门(3)--获取GET、POST请求的参数值

一、Request对象 thinkphp提供了Request对象&#xff0c;其可以 支持对全局输入变量的检测、获取和安全过滤 支持获取包括$_GET、$_POST、$_REQUEST、$_SERVER、$_SESSION、$_COOKIE、$_ENV等系统变量&#xff0c;以及文件上传信息 具体参考&#xff1a;https://www.kanclou…...

JSON简介

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。它使用简洁的文本表示来存储和传输结构化数据。JSON数据由键值对组成&#xff0c;用逗号分隔。键是字符串&#xff0c;值可以是字符串、数字、布尔值、数组、对象或者null 1、JSON的优点 …...

[Java]_[初级]_[以SAX流的方式高效读取XML大文件]

场景 XML文件作为默认utf8格式的文件&#xff0c;它的作用和JSON文件相当。比如可以做为简单的数据存储格式&#xff0c;配置文件&#xff0c;网站的sitemap.xml导航等。它比json强的一点是它还有样式描述文件dtd,可以实现让XML里的结构化数据显示表格样式。 <?xml versi…...

Visual Studio中平台和配置的概念

在 Visual Studio 中&#xff0c;“平台”&#xff08;Platform&#xff09;和 “配置”&#xff08;Configuration&#xff09;是用于管理项目构建和设置的两个关键概念。在 “解决方案配置管理器” 中设置和管理 平台&#xff08;Platform&#xff09;&#xff1a; 指项目构…...

【vue2第八章】工程化开发和使用脚手架和文件结构

vue工程化开发 & 使用脚手架VUE CLI&#xff1a; 1&#xff0c;核心包传统开发模式&#xff1a;基于js/html/css直接引入核心包开发vue。 2&#xff0c;工程化开发。基于构建工具如(webpack)的环境中开发vue。 vue cli是什么&#xff1a; vue cli是一个vue官方提供的一个…...

建造者模式简介

概念&#xff1a; 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;用于将复杂对象的构建过程与其表示分离。它允许您逐步构造一个复杂对象&#xff0c;同时保持灵活性和可读性。 特点&#xff1a; 将对象的构建过程封装在指导者类中&am…...

虚拟世界指南:从零开始,一步步教你安装、配置和使用VMware,镜像ISO文件!

本章目录 CentOS简介镜像下载一、新建虚拟机&#xff08;自定义&#xff09;1、进入主页&#xff0c;在主页中点击“创建新的虚拟机”2、点击创建虚拟机创建自己的虚拟机。可以选择自定义3、在“硬件兼容性(H)中选择&#xff1a;Workststion 15.x” ->下一步4、选择“稍后安…...

服务器卡顿怎么查找原因?

虽然服务器出现卡顿的现象比较少见&#xff0c;但也不排除出现的可能&#xff0c;而服务器一旦出现卡顿&#xff0c;造成的后果会严重的多。这里分享点笔记&#xff0c;希望有所帮助 1. 性能评估: 首先&#xff0c;对服务器的性能进行全面评估。检查 CPU 使用率、内存占用、磁…...

Pnpm,npm,yarn

npm 最初的npm只是简单的通过依赖去递归安装包&#xff0c;所以说每个依赖都会有自己的node_modules,node_modules是嵌套的。一个项目会存在多个包&#xff0c;多个包之间难免会有公共的依赖&#xff0c;node_modules嵌套的话&#xff0c;这样公共依赖就会下载多次。会造成磁盘…...

Kubernetes技术--使用kubeadm快速部署一个K8s集群

这里我们配置一个单master集群。(一个Master节点,多个Node节点) 1.硬件环境准备 一台或多台机器,操作系统 CentOS7.x-86_x64。这里我们使用安装了CentOS7的三台虚拟机 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多 2.主机名称和IP地址规划 3. 初始化准备工作…...

LeetCode 45题:跳跃游戏

题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - …...

idea中设置指定图片为项目站标

前提是准备好一张图片 在idea中创建imgs文件夹&#xff0c;放入图片 创建一个HTML文件 建立链接link标签&#xff0c;链接照片即可 <link href"../02css/imgs/2.jpg" rel"shortcut icon" type"image/x-icon"> 执行效果如下图所示&…...

【【萌新的STM32学习-27--USART异步通信配置步骤】】

萌新的STM32学习-27–USART异步通信配置步骤 USART/UART 异步通信配置步骤 1.配置串口工作参数 HAL_UART_Init() 我们会在此处调用MSP中的回调函数 2.串口底层初始化 用户定义HAL_UART_MspInit() 配置GPIO NVIC CLOCK 等 3.开启串口异步接收中断 HAL_UART_Receive_IT() 4.…...

elementplus实现左侧菜单栏收缩与展开

1.页面结构 Home.vue下包含aside.vue和menu.vue 2.TAside.vue el-menu左侧菜单栏显示 注意&#xff1a; 要使用收缩与展开&#xff0c;el-aside必须设置width"collapse"&#xff0c;否则收缩展开会出现收缩后&#xff0c;el-aside宽度不变窄需要使用动态改变展开收…...

VBA技术资料MF50:VBA_在Excel中突出显示前3个值

【分享成果&#xff0c;随喜正能量】人受到尊重&#xff0c;不是因为权钱&#xff0c;而是他骨子里透出的&#xff0c;正直与善良。。 我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高…...

linux定时删除服务器日志

不说废话。直接进入操作流程 linux 定时任务是用的crontab 查看 crontab是否启动 service crond statusdead 死的 启动crontab service crond start 再次查看状态 running 运转的 查看 crontab cat /etc/crontab 查看 crontab任务 crontab -l 编辑 crontab任务 crontab …...

网络地址转换技术NAT(第九课)

一 什么是NAT? NAT是网络地址转换的缩写,是一种在计算机网络中使用的技术,可以将私有地址转换为公共地址,从而实现本地网络与公共网络的互联。NAT工作在网络层,可以隐藏内部网络中的IP地址和端口号,从而增强网络的安全性和灵活性。在家庭网络、企业网络、公共WIFI热点等…...

K8s 在创建pod时api-server是先找scheduler 还是controller-manager

在K8s中&#xff0c;创建Pod时的流程如下&#xff1a; 用户通过Kubectl或其他方式向API Server发送创建Pod的请求。API Server接收到请求后&#xff0c;会先进行权限验证和身份认证。一旦验证通过&#xff0c;API Server会将请求转发给Scheduler组件。Scheduler负责对新创建的…...

【笔记】常用 js 函数

数组去重 Array.from(new Set()) 对象合并 Object.assign . 这里有个细节&#xff1a;当两个对象中含有key相同value不同时&#xff0c;会以 后面对象的key&#xff1a;value为准 保留小数点后几位 toFixed 注意&#xff1a; Number型&#xff0c;用该方法处理完&#xff0c;会…...

3分钟掌握绝地求生压枪黑科技:罗技鼠标宏终极指南

3分钟掌握绝地求生压枪黑科技&#xff1a;罗技鼠标宏终极指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为《绝地求生》中AKM的后坐力而…...

别再死磕 SEO 了,2026 年是 GEO 的天下:如何让大模型在搜索结果里“翻你的牌子”?

1. 为什么 2026 年你的 SEO 流量断崖式下跌&#xff1f;如果你最近发现网站的 GA&#xff08;Google Analytics&#xff09;或百度统计里的自然流量在掉&#xff0c;别急着骂运营。看看现在的搜索习惯&#xff1a;用户不再去翻第二页的蓝色链接&#xff0c;而是直接在 Perplexi…...

CST可调谐太赫兹超材料吸收器仿真教学,石墨烯,二氧化钒,锑化铟等材料设置 包括建模过程,后处理

CST可调谐太赫兹超材料吸收器仿真教学&#xff0c;石墨烯&#xff0c;二氧化钒&#xff0c;锑化铟等材料设置 包括建模过程&#xff0c;后处理&#xff0c;吸收光谱图教学等 包括宽带吸收器、窄带&#xff0c;以及宽窄带吸收器设计"打开CST微波工作室&#xff0c;先别急着…...

山西口碑好的实体店获客公司哪家可靠

在山西&#xff0c;实体店主们都在为如何有效获客而烦恼。随着市场竞争的加剧&#xff0c;选择一家可靠的获客公司至关重要。今天&#xff0c;我们就来探讨一下山西口碑好的实体店获客公司&#xff0c;重点介绍中谷云&#xff08;厦门&#xff09;大数据科技有限公司&#xff0…...

Redis 不止缓存!从零到一吃透 Redis 向量数据库

前言大模型时代&#xff0c;检索增强生成&#xff08;RAG&#xff09;、智能推荐、多模态检索等场景已成为业务创新的核心方向&#xff0c;而向量数据库正是支撑这些场景的底层基石。很多开发者提起向量数据库&#xff0c;第一反应是Milvus、Pinecone这类专业组件&#xff0c;却…...

云服务器是如何保障数据安全的

在云服务器中&#xff0c;访问控制机制是重要的安全屏障。云服务商会实施严格的身份认证&#xff0c;用户需要通过密码、密钥、生物识别等多种方式进行身份验证&#xff0c;只有通过验证的用户才能获得相应的操作权限。同时&#xff0c;基于角色的访问控制将用户分配到不同角色…...

开源可部署剧本AI|像素剧本圣殿镜像免配置+Qwen2.5本地化教程

开源可部署剧本AI&#xff5c;像素剧本圣殿镜像免配置Qwen2.5本地化教程 1. 像素剧本圣殿简介 Pixel Script Temple&#xff08;像素剧本圣殿&#xff09;是一款基于Qwen2.5-14B-Instruct模型深度微调的专业剧本创作工具。这个开源项目将强大的AI推理能力与独特的8-Bit复古美…...

综合布线入门技术培训ppt

综合布线是弱电项目中最基础的系统&#xff0c;也是最重要的系统之一。不少施工过程不是很楚&#xff0c;主要集中在两个问题&#xff1a;1、综合布线项目如何做&#xff1f;2、有哪些流程&#xff1f;本期我们通过一个培训ppt来详细总结下。来源&#xff1a;弱电行业网...

太烧token了,我用Ai写了一个vscode的插件wps-editor(已开源)

这是一篇关于开源项目Wps-Editor的介绍文章&#xff0c;希望能让大家了解它的价值并支持其发展。 引言 在人工智能(AI)浪潮席卷各行各业的今天&#xff0c;大型语言模型(LLM)已成为内容创作者、办公人士、学生乃至研究者的得力助手。无论是撰写报告、分析数据、润色文案&#…...

一体化数字引擎 驱动机械设备非标项目精益盈

机械设备行业正进入深度数字化转型期&#xff0c;非标定制与项目型制造企业普遍面临项目成本失控、进度不透明、变更响应慢、售后价值难挖掘等核心痛点。传统分散式管理与复杂业务场景脱节&#xff0c;导致交付延迟、利润流失、协同效率低下。面向非标设备行业的数字化管理需求…...