selenuim实战优化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 该文介绍了如何使用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
目录
相关文章
|
6月前
|
开发者 Python
|
6月前
|
弹性计算 关系型数据库 数据库
利用阿里云进行性能优化:实践案例分享
在开发在线教育平台过程中,我们遇到了由于用户访问量增加而导致的性能瓶颈问题。通过使用阿里云的多种服务,包括RDS数据库、ECS弹性扩展、SLB负载均衡、OSS存储和CDN加速,我们对数据库、应用服务器和静态资源加载进行了全面优化。优化后的系统性能显著提升,数据库查询速度提高了60%,服务器负载下降了40%,静态资源加载时间减少了70%,从而极大改善了用户体验。本文详细介绍了问题分析、具体解决方案及其实施效果,旨在为其他开发者提供有价值的参考。
214 3
|
6月前
|
存储 网络协议 Java
服务优化实践
v服务优化实践
45 2
|
6月前
|
JSON JavaScript 前端开发
Python selenuim实战
使用Selenium爬取苏宁易购商品信息,步骤包括打开网页、翻页、获取信息并保存至本地JSON文件。核心功能有滚动页面加载更多商品(模拟鼠标滚动)和抓取每页数据(提取标题和价格)。主程序通过循环实现自动翻页,直到无下一页按钮,最终将所有数据整合到一个JSON文件中。完整代码展示了所需导入的模块、滚动页面及获取数据的函数,以及主程序逻辑。
50 0
|
前端开发
前端学习案例2-if...else..优化
前端学习案例2-if...else..优化
77 0
前端学习案例2-if...else..优化
|
前端开发
前端学习案例1-if...else..优化
前端学习案例1-if...else..优化
75 0
前端学习案例1-if...else..优化
|
Web App开发 JavaScript 前端开发
当我们进行性能优化,我们在优化什么(LightHouse优化实操)
好的互联网产品不仅仅在功能上要高人一筹,在性能层面也需要出类拔萃,否则金玉其外败絮其中,页面是美轮美奂了,结果首屏半天加载不出来,难免让用户乘兴而来,败兴而归。 幸运的是,前端的性能优化有诸多有迹可循的理论和方法,其中相对权威的,无疑是LightHouse。
当我们进行性能优化,我们在优化什么(LightHouse优化实操)
|
缓存 算法 安全
性能优化:第一章:我们应该怎么优化
性能优化:第一章:我们应该怎么优化
110 0
|
SQL 存储 算法
【笔记】最佳实践—偏分析场景的实践和优化
PolarDB-X是一款以TP为主的HTAP数据库,也支持一定场景的分析需求。而典型的分析场景一般有以下几类特征:
【笔记】最佳实践—偏分析场景的实践和优化
|
数据采集 关系型数据库 MySQL
【笔记】最佳实践—偏高并发场景的实践和优化
本文介绍了如何判断查询语句是否为“点查”,以及如何将查询优化为“点查”。 “点查”是应用访问OLTP数据库的一种常见方式,特点是返回结果前只扫描表中的少量数据,在淘宝上查看订单/商品信息对应到数据库上的操作就是点查。PolarDB-X对点查的响应时间(Response Time, RT)和资源占用做了较多优化,能够支持较高的吞吐,适合高并发读取场景使用。
147 0