selenuim实战优化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 该文介绍了如何使用Selenium将数据直接存入MySQL数据库,以苏宁易购网站为例。首先,优化了JSON数据写入,通过pymysql连接数据库,创建`books`表并读取JSON文件插入数据。接着,整合代码实现直接从网页抓取价格和标题,使用Selenium自动化滚动加载页面,定位元素,清洗数据并使用参数化查询插入到`books`表。主程序循环遍历多页数据,最后关闭数据库连接。

selenium数据入库

这次使用的案例还是之前的苏宁易购,因为上次没有完整的使用数据库插入。而是间接的使用文件写入数据库,但这并不是我们想要的效果,所以这次是直接写入MySQL数据库,一步到位!

优化json写入

这次是还是从文件内写入数据库,前面已经优化成了可以入库的格式,现在的代码是演示的用文件写入数据库的操作。

import pymysql
import json

# 连接数据库
db = pymysql.connect(
    host="localhost",
    user="你使用的数据库用户",
    password="你的数据库密码",
    db="test"
)

# 创建表格
cursor = db.cursor()
sql = """
create table if not exists books(
   id int auto_increment primary key,
   price varchar(255) not null,
   title varchar(255) not null
)
"""
cursor.execute(sql)

# 读取JSON数据并插入数据库
data = open("3.json", encoding="utf-8").read()
data_dict = json.loads(data)
sql = "insert into books(price, title) values(%s, %s)"
for i in data_dict:
    values = (i["price"], i["title"])
    cursor.execute(sql, values)

# 提交更改并关闭连接
db.commit()
db.close()

数据库入库

这次对上面写过的所有代码进行了整合,选择直接写入我们所用的MySQL数据库

上述代码使用了Python的selenium库来自动化浏览器,以及pymysql库来连接和操作MySQL数据库。下面是对代码的分段讲解:

导入所需的库

import pymysql
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

连接数据库

# 连接数据库
db = pymysql.connect(
    host="localhost",
    user="root",
    password="540439qwe",
    db="test"
)
cursor = db.cursor()

这段代码使用pymysql库连接到名为test的MySQL数据库。

定义滚动函数

def scrollTo_down():
    for i in range(1, 100):
        time.sleep(0.7)
        driver.execute_script(f"window.scrollTo(0, {i*700})")
        y = driver.execute_script("return window.scrollY")
        if y > 11000:
            break

这个函数用于模拟滚动网页的行为,以便加载更多的数据。

数据入库

在函数get_data()中,首先使用XPath定位找到价格和标题的元素,然后通过zip()函数将它们打包在一起,以确保价格和标题能够一一对应。接着,对于每个价格和标题对,将价格使用strip()函数去除字符串首尾的空格和指定的字符(此处是"到手价"),以保证数据的干净性。

接下来,将价格和标题插入到MySQL数据库中的books表中。插入操作使用了参数化查询,这是一种防止SQL注入攻击的好方法,同时也可以避免手动拼接SQL语句带来的麻烦。在执行SQL插入语句之后,调用commit()方法提交事务,确保数据被永久性地保存到数据库中。

这样,每当调用get_data()函数时,价格和标题对将会被插入到MySQL数据库的books表中。这种方式使得数据库操作更加安全和高效。

def get_data():
    price_elements = driver.find_elements(By.XPATH, "//div[@class='price-box']")
    title_elements = driver.find_elements(By.XPATH, "//div[@class='title-selling-point']")
    for price_element, title_element in zip(price_elements, title_elements):
        price = price_element.text.strip("到手价")
        title = title_element.text
        # 插入数据到数据库
        sql = "INSERT INTO books(price, title) VALUES (%s, %s)"
        values = (price, title)
        cursor.execute(sql, values)
        db.commit()

这个函数用于从网页中提取价格和标题,并将它们插入名为books的数据库表中。

主程序

if __name__ == '__main__':
    url = "https://list.suning.com/0-179001-0.html?safp=d488778a.46601.searchMain.4&safc=cate.0.0&safpn=10006"
    driver = webdriver.Edge()
    driver.get(url)

    max_page = 1
    max = 1
    for i in range(max, max_page + 1):
        scrollTo_down()
        get_data()
        time.sleep(1)
        driver.find_element(By.XPATH, "//a[@id='nextPage']").click()

    # 关闭数据库连接
    db.close()

主程序首先定义了要爬取的网页URL,然后使用Selenium打开浏览器,循环遍历网页内容,执行滚动和数据获取操作。最后关闭数据库连接。

完整代码

import pymysql
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 连接数据库
db = pymysql.connect(
    host="localhost",
    user="root",
    password="540439qwe",
    db="test"
)
cursor = db.cursor()

def scrollTo_down():
    for i in range(1, 100):
        time.sleep(0.7)
        driver.execute_script(f"window.scrollTo(0, {i*700})")
        y = driver.execute_script("return window.scrollY")
        if y > 11000:
            break

def get_data():
    price_elements = driver.find_elements(By.XPATH, "//div[@class='price-box']")
    title_elements = driver.find_elements(By.XPATH, "//div[@class='title-selling-point']")
    for price_element, title_element in zip(price_elements, title_elements):
        price = price_element.text.strip("到手价")
        title = title_element.text
        # 插入数据到数据库
        sql = "INSERT INTO books(price, title) VALUES (%s, %s)"
        values = (price, title)
        cursor.execute(sql, values)
        db.commit()

if __name__ == '__main__':
    url = "https://list.suning.com/0-179001-0.html?safp=d488778a.46601.searchMain.4&safc=cate.0.0&safpn=10006"
    driver = webdriver.Edge()
    driver.get(url)

    max_page = 1
    max = 1
    for i in range(max, max_page + 1):
        scrollTo_down()
        get_data()
        time.sleep(1)
        driver.find_element(By.XPATH, "//a[@id='nextPage']").click()

    # 关闭数据库连接
    db.close()
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
消息中间件 缓存 NoSQL
如何做性能优化?
如何做性能优化?
|
15天前
|
存储 SQL Prometheus
【TiDB原理与实战详解】1、原理与基础优化~学不会? 不存在的!
TiDB 是一款开源的分布式关系型数据库,具备水平扩展、高可用性和强一致性等特点,适用于高并发、低延迟的大规模数据处理场景。其架构设计灵感源自 Google 的 Spanner 和 F1,并兼容 MySQL。TiDB 集群由 TiDB Server(无状态 SQL 层)、PD(元数据管理模块)和 TiKV Server(分布式存储层)组成,还包含 TiFlash(列存储引擎)以加速分析型查询。TiDB 支持分布式事务和多种事务模式,适用于 OLTP 和 HTAP 场景,如电商平台和金融系统。此外,TiDB 的部署要求包括高性能硬件配置和特定网络设置,以确保系统的稳定性和高效运行。
|
4月前
|
弹性计算 关系型数据库 数据库
利用阿里云进行性能优化:实践案例分享
在开发在线教育平台过程中,我们遇到了由于用户访问量增加而导致的性能瓶颈问题。通过使用阿里云的多种服务,包括RDS数据库、ECS弹性扩展、SLB负载均衡、OSS存储和CDN加速,我们对数据库、应用服务器和静态资源加载进行了全面优化。优化后的系统性能显著提升,数据库查询速度提高了60%,服务器负载下降了40%,静态资源加载时间减少了70%,从而极大改善了用户体验。本文详细介绍了问题分析、具体解决方案及其实施效果,旨在为其他开发者提供有价值的参考。
154 3
|
4月前
|
缓存 监控 NoSQL
一次性能优化实践
【5月更文挑战第21天】为解决在线教育平台在高并发下数据库查询响应时间增加的问题,开发者采用Redis缓存策略。通过数据分层、LRU淘汰策略、异步更新及监控调优,成功提升性能,缓存命中率超90%,页面加载时间从3秒降至1秒,改善了用户体验。此实践强调了合理缓存策略、监控调优以及考虑数据访问模式在系统设计中的重要性。
62 2
|
4月前
|
存储 网络协议 Java
服务优化实践
v服务优化实践
36 2
|
前端开发
一次性能优化思考过程
最近业务上空闲了下来,也是把之前在开发时自身感受比较大的白屏时间放在了主线上去排查优化,这里记录一下笔者对于移动端vConsole脚本的引入问题全过程。
156 0
一次性能优化思考过程
|
前端开发
前端学习案例1-if...else..优化
前端学习案例1-if...else..优化
66 0
前端学习案例1-if...else..优化
|
前端开发
前端学习案例2-if...else..优化
前端学习案例2-if...else..优化
74 0
前端学习案例2-if...else..优化
|
消息中间件 缓存 弹性计算
|
Web App开发 JavaScript 前端开发
当我们进行性能优化,我们在优化什么(LightHouse优化实操)
好的互联网产品不仅仅在功能上要高人一筹,在性能层面也需要出类拔萃,否则金玉其外败絮其中,页面是美轮美奂了,结果首屏半天加载不出来,难免让用户乘兴而来,败兴而归。 幸运的是,前端的性能优化有诸多有迹可循的理论和方法,其中相对权威的,无疑是LightHouse。
当我们进行性能优化,我们在优化什么(LightHouse优化实操)