selenuim实战优化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 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
目录
相关文章
|
12天前
|
缓存 监控 前端开发
性能优化方案详解,史上最全,必知必备!
本文详细解析了 9 大必备大厂优化方案,性能优化是一线互联网公司程序员的必备技能,非常重要。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
性能优化方案详解,史上最全,必知必备!
|
13天前
|
缓存 算法 数据库
性能优化实战——从理论到实践
性能优化实战——从理论到实践
25 1
|
6月前
|
弹性计算 关系型数据库 数据库
利用阿里云进行性能优化:实践案例分享
在开发在线教育平台过程中,我们遇到了由于用户访问量增加而导致的性能瓶颈问题。通过使用阿里云的多种服务,包括RDS数据库、ECS弹性扩展、SLB负载均衡、OSS存储和CDN加速,我们对数据库、应用服务器和静态资源加载进行了全面优化。优化后的系统性能显著提升,数据库查询速度提高了60%,服务器负载下降了40%,静态资源加载时间减少了70%,从而极大改善了用户体验。本文详细介绍了问题分析、具体解决方案及其实施效果,旨在为其他开发者提供有价值的参考。
231 3
|
5月前
|
存储 JSON 数据格式
如何提升写入效率?Schemaless 写入性能优化实践分享
TDengine 是一款时序数据库,其Schemaless模式适应物联网数据动态变化。通过分析火焰图,发现parser和insert操作是性能瓶颈。优化措施包括减少标签解析、排序和子表生成的重复执行,提前判断schema变更,改进数据插入方法,减少内存分配和拷贝。通过这些优化,如在3.0版本中,line协议性能提升了2.5倍,telnet提升2倍,json提升近5倍。使用工具如火焰图和perf进行性能分析,以识别和解决瓶颈,实现性能提升。
36 0
|
6月前
|
缓存 监控 NoSQL
一次性能优化实践
【5月更文挑战第21天】为解决在线教育平台在高并发下数据库查询响应时间增加的问题,开发者采用Redis缓存策略。通过数据分层、LRU淘汰策略、异步更新及监控调优,成功提升性能,缓存命中率超90%,页面加载时间从3秒降至1秒,改善了用户体验。此实践强调了合理缓存策略、监控调优以及考虑数据访问模式在系统设计中的重要性。
74 2
|
6月前
|
存储 网络协议 Java
服务优化实践
v服务优化实践
46 2
|
缓存 编解码 前端开发
前端项目的性能优化实战
前端项目的性能优化实战
153 0
|
前端开发
前端学习案例2-if...else..优化
前端学习案例2-if...else..优化
77 0
前端学习案例2-if...else..优化
|
前端开发
前端学习案例1-if...else..优化
前端学习案例1-if...else..优化
76 0
前端学习案例1-if...else..优化
|
消息中间件 缓存 弹性计算
下一篇
无影云桌面