使用Selenium爬取当当网书籍信息并存储至MySQL数据库

284 阅读2分钟

使用Selenium爬取当当网书籍信息并存储至MySQL数据库

技术栈

  • mysql5.7
  • python3.11

在本文中,我们将通过Selenium库爬取当当网上的书籍信息,并将这些信息存储到MySQL数据库中。Selenium是一个用于自动化Web浏览器操作的Python库,特别适合处理动态加载的网页内容。我们将使用Chrome浏览器作为Selenium的驱动,确保你已正确安装了ChromeDriver

在开始之前,请确保你已经安装了以下所需的库:

	pip install selenium pymysql

一、建立数据库连接

首先,我们创建与MySQL数据库的连接。请将下面的代码中的hostuserpasswordportdatabasecharset替换为你自己的数据库配置。

	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()  # 点击下一页按钮继续爬取下一页数据直到第

码云链接:gitee.com/httpzhang-s…