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()