使用Selenium爬取当当网书籍信息并存储至MySQL数据库
技术栈
- mysql5.7
- python3.11
在本文中,我们将通过Selenium库爬取当当网上的书籍信息,并将这些信息存储到MySQL数据库中。Selenium是一个用于自动化Web浏览器操作的Python库,特别适合处理动态加载的网页内容。我们将使用Chrome浏览器作为Selenium的驱动,确保你已正确安装了ChromeDriver。
在开始之前,请确保你已经安装了以下所需的库:
pip install selenium pymysql
一、建立数据库连接
首先,我们创建与MySQL数据库的连接。请将下面的代码中的host, user, password, port, database, charset替换为你自己的数据库配置。
import pymysql
connect = pymysql.connect(
host='127.0.0.1',
user='root',
password='123456',
port=3306,
database='javabook',
charset='utf8'
)
cursor = connect.cursor()
二、创建书籍信息表
接着,我们创建一个用于存储书籍信息的表。这里,我们简单地存储书籍的名称和价格。
sql = '''
create table if not exists book(name varchar(100), price varchar(10));
'''
cursor.execute(sql)
三、爬取当当网书籍信息
我们使用Selenium模拟浏览器操作来爬取数据。下面的代码将自动打开Chrome浏览器,访问当当网,并在搜索框中输入“java书籍”进行搜索。然后,它会逐页爬取书籍的名称和价格,并将这些信息存储到MySQL数据库中。
请注意,由于网络环境和页面结构的变化,你可能需要根据实际情况调整等待时间和CSS选择器。此外,频繁爬取可能导致IP被封禁,使用时请谨慎。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import random
driver = webdriver.Chrome() # 启动Chrome浏览器
driver.get('https://www.dangdang.com/') # 打开当当网首页
driver.implicitly_wait(30) # 隐式等待时间设置为30秒
# 搜索“java书籍”并点击搜索按钮
driver.find_element(By.ID, 'key_S').send_keys('java书籍') # 在搜索框中输入关键词
driver.find_element(By.CSS_SELECTOR, '#form_search_new > input.button').click() # 点击搜索按钮
# 循环爬取20页书籍信息
for i in range(20):
shoplist = driver.find_elements(By.CSS_SELECTOR, '.shoplist li') # 获取书籍列表元素
for li in shoplist: # 遍历每个书籍元素,提取名称和价格信息并存储到数据库中
item = {}
title_name = li.find_element(By.CSS_SELECTOR, 'a').get_attribute('title') # 获取书籍名称
item['name'] = title_name if title_name else None
title_price = li.find_element(By.CSS_SELECTOR, '.search_now_price').text # 获取书籍价格
item['price'] = title_price if title_price else None
insert_sql = '''
insert into book(name, price) values (%s, %s);
'''
item_list = [item['name'], item['price']]
try:
cursor.execute(insert_sql, item_list) # 将书籍信息插入数据库中
connect.commit() # 提交事务
except:
connect.rollback() # 发生错误时回滚事务
print("Error occurred when inserting data into database.")
print('第{}页爬取完毕'.format(i + 1)) # 打印当前页爬取进度
time.sleep(random.uniform(1, 3)) # 随机等待1~3秒以避免被封禁,同时给予页面加载时间
next = driver.find_element(By.LINK_TEXT, '下一页').click() # 点击下一页按钮继续爬取下一页数据直到第