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

news2025/1/16 18:49:27

目录 

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 json

app = 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 s


app.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 time


def 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].text
        price = tds[1].text
        print("%-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 += 1
        options[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元素

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/944299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在字节做了5年测试,6月被无情辞退,想给还在摸鱼的兄弟提个醒...

先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入华为&#xff0c;以“人员优化”的名义无情被裁员&#xff0c;之后跳槽到了有赞&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是5年的工作经验吧。 这5年之间完成了一次…

Linux整合seata

1、到官网下载seata&#xff0c;这里以ZIP为例 2、使用远程工具上传ZIP包 3、通过命令解压 unzip seata-server-1.7.0.zip4、修改配置文件、新建表&#xff0c;参考我之前的文章 分布式系统的多数据库&#xff0c;实现分布式事务回滚&#xff08;1.7.0 seata整合2.0.4nacos…

高薪项目经理的12条成长指南

大家好&#xff0c;我是老原。 有不少朋友私信问我&#xff1a; 老原&#xff0c;你做项目经理时&#xff0c;还能同时兼顾写公众号、小红书、回答知乎、管理社群&#xff0c;还有给我们解答问题的……是怎么做到的。 其实&#xff0c;关于提升工作效率这方面啊&#xff0c;…

数据库CPU飙高问题定位及解决

在业务服务提供能力的时候&#xff0c;常常会遇到CPU飙高的问题&#xff0c;遇到这类问题&#xff0c;大多不是数据库自身问题&#xff0c;都是因为使用不当导致&#xff0c;这里记录下业务服务如何定位数据库CPU飙高问题并给出常见的解决方案。 CPU 使用率飙升根因分析 在分…

云计算——虚拟化中的网络架构与虚拟网络(文末送书)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 目录 前期回顾 前言 一.网卡虚拟化 1.网卡虚拟化方法&…

FAQ专题 | smardaten园区能源集控场景8大问题解答,建议收藏!

睿友们进来看&#xff0c;面对smardaten的IoT数据能力&#xff0c;你一定问过这些问题&#xff01; 本期针对智慧园区、能源等集控场景下的数据接入常见问题&#xff0c;答案大放送啦~~&#xff08;文末有福利&#x1f447;&#xff01;&#xff09; Q1&#xff1a;如何在智慧…

虚拟机的使用

首先需要安装VMware软件&#xff0c;这是虚拟机&#xff0c;在里面可以实现在windows的笔记本上运行包括&#xff0c;windows11和linux系统的开发和研究。 VMware是一种虚拟化技术&#xff0c;可以让你在一台物理计算机上运行多个操作系统和应用程序&#xff0c;而不需要重启或…

Redis——如何解决redis穿透、雪崩、击穿问题

目录 一、查询商品信息的常规代码示例二、缓存击穿2.1、缓存击穿的理解2.2、缓存击穿的解决方案2.3、解决缓存击穿的代码示例 三、缓存雪崩3.1、缓存雪崩的理解3.2、缓存雪崩的解决方案3.2.1、缓存集中过期的情况3.2.2、缓存服务器宕机的情况3.2.3、缓存服务器断电的情况 3.3、…

lib61850 学习笔记一 (概念)

IEC61850 定义60多种服务满足变电站通信需求。支持在线获取数据模型&#xff0c;也支持IED水平通信&#xff08;GOOSE报文&#xff09; 术语定义 间隔 bay: 变电站由据应公共功能紧密连接的子部分组成。 例如 介于进线或者 出线 和母线之间的断路器&#xff1b;二条母线之间…

克隆 Windows 硬盘的 5 个理由

您什么时候需要克隆 Windows 硬盘&#xff1f; ​根据用户研究&#xff0c;以下是您的五个常见原因&#xff1a; 备份&#xff1a;克隆 Windows 硬盘是创建所有数据备份的推荐方法。如果发生任何硬盘故障&#xff0c;您可以快速将所有数据恢复到新硬盘。 升级&#xff1a;如…

【C51基础实验 点亮一颗LED】

51单片机项目基础篇 点亮一颗LED1、认识头文件1.1、头文件的书写格式分类1.2、头文件存放的内容 2、硬件电路设计3、软件设计4、编译结果5、结束语 点亮一颗LED 前言&#xff1a; 了解了前面篇章的内容&#xff0c;工程模板就不多赘述了&#xff0c;这篇就开始写51 单片机的第…

Compose眼珠跟随手势移动的笑脸

眼珠跟随手势移动的笑脸&#x1f601; 前言一、Canvas画图笑脸微笑眼睛和眼珠子 二、跟随手势移动transformableanimateFloatAsState 总结 前言 阅读本文需要一定compose基础&#xff0c;如果没有请移步Jetpack Compose入门详解&#xff08;实时更新&#xff09; 在网上看到有…

MySql DATE_ADD()实践

DATE_ADD() 函数使用 定义和用法 DATE_ADD() 函数向日期添加指定的时间间隔。 DATE_ADD(date,INTERVAL expr type) -- 获取当前时间2天后的时间 SELECT DATE_ADD(NOW(),INTERVAL 2 day) -- 获取当前时间2天前的时间 SELECT DATE_ADD(NOW(),INTERVAL -2 day)

2023最新MathType7.4中文版数学公式编辑器

MathType是一款专业的数学公式编辑器&#xff0c;理科生专用的必备工具&#xff0c;可应用于教育教学、科研机构、工程学、论文写作、期刊排版、编辑理科试卷等领域。可视化公式编辑器轻松创建数学方程式和化学公式。兼容Office Word、PowerPoint、Pages、Keynote、Numbers 等7…

容器和宿主机之间的存储问题

简介 作用&#xff1a;方便备份恢复数据&#xff0c;实现数据共享 一、单台机器中 用数据卷挂载 二、多台机器中 ssh 建立免密通道将数据scp过去&#xff0c;然后再用卷挂载到容器内 nfs 网络文件系统 搭建nfs服务器客户端挂载 过程如下 一.安装软件包yum install -…

tp5使用redis及redis7.2安装到window系统上面

redis安装教程 redis7.2安装到window系统上面 https://download.csdn.net/download/qq_39161501/88269037 解决方案&#xff1a;修改配置php.ini文件 打开Apache目录下的php.ini文件&#xff0c;搜索extension&#xff0c;在空白处加上下列代码&#xff1a; 注&#xff1a;e…

Cloudpods 私有云平台有哪些优势?

作为一套完整的私有云管理软件&#xff0c;我们经常会被问到 Cloudpods 和其他的同类产品相比&#xff0c;有哪些优势&#xff1f;我总结了 2 个方面&#xff0c;供大家参考。 功能方面 产品化&#xff0c;开箱即用&#xff0c;易用性较高&#xff0c;基本上都可以傻瓜式的操…

网络直播源码UDP协议搭建:为平台注入一份力量

网络直播源码中的UDP协议的定义&#xff1a; UDP协议又名用户数据报协议&#xff0c;是一种轻量级、无连接的协议。在网络直播源码平台中&#xff0c;UDP协议有着高速传输与实时性的能力&#xff0c;尤其是在网络直播源码实时性要求较高的场景&#xff0c;UDP协议的应用有着重要…

GDB 源码分析 -- 断点源码解析

文章目录 一、断点简介1.1 硬件断点1.2 软件断点 二、断点源码分析2.1 断点相关结构体2.1.1 struct breakpoint2.1.2 struct bp_location 2.2 断点源码简介2.3 break设置断点2.4 enable break2.5 disable breakpoint2.6 delete breakpoint2.7 info break 命令源码解析 三、Linu…

我想开通期权?如何开通期权账户?

场内期权的合约由交易所统一标准化定制&#xff0c;大家面对的同一个合约对应的价格都是一致的&#xff0c;比较公开透明&#xff0c;期权开户当天不能交易的&#xff0c;期权开户需要满足20日日均50万及半年交易经验即可操作&#xff0c;下文科普我想开通期权&#xff1f;如何…