- 本节内容主要为:
(1)创建数据库
(2)创建数据库表
(3)爬取数据进MYSQL库
1 新建数据库
使用MYSQL数据库存储数据,创建一个新的数据库
create database scrapy_demo;
2 新建数据表
CREATE TABLE tb_tour (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键',
title VARCHAR(255) NOT NULL COMMENT '景点标题',
title_en VARCHAR(255) COMMENT '景点英文标题',
img VARCHAR(255) COMMENT '景点图片链接',
score FLOAT COMMENT '景点评分',
comments int COMMENT '景点评分数量',
comment_url VARCHAR(255) COMMENT '评论链接',
rank_title VARCHAR(255) COMMENT '排名标题',
ranks INT COMMENT '景点排名',
select_user VARCHAR(255) COMMENT '精选评论用户头像',
select_comment TEXT COMMENT '精选评论'
);
3 增加常量
因为我们的表中新增了国家和城市的字段,程序中可以通过常量传递过去,新增一个constant.py。
NATION = "日本"
CITY = "东京"
4 修改爬虫
爬虫qiongyou_3.py 有2处修改,第一是指明驱动存储的路径。
def __init__(self, *args, **kwargs):
super(QiongyouSpider, self).__init__(*args, **kwargs)
options = webdriver.ChromeOptions()
# 这行代码是用于设置 Chrome 浏览器的选项。--headless 参数表示以无头模式(无 GUI 界面)运行 Chrome 浏览器。
# 无头模式下,浏览器运行在后台,不会显示任何图形界面,从而能够提高爬取效率和性能。这在服务器环境中非常有用,因为服务器通常没有图形界面。
options.add_argument('--headless')
LOGGER.setLevel(logging.WARNING)
# 这行代码是用于指定 ChromeDriver 的路径。ChromeDriver 是 Selenium 用于控制 Chrome 浏览器的驱动程序。
service = Service('/usr/local/bin/chromedriver')
self.driver = webdriver.Chrome(options=options, service=service) # 替换为 ChromeDriver 的实际路径
第二是对解析页面的时候新增城市和国家字段,引入这2个常量就可以了。
item['city'] = CITY
item['nation'] = NATION
5 修改pipelines
由于我们改造成MYSQL存储数据了,因此修改原来的管道类,只需要改个名字:
# 保存excel
class TourFilePipeline:
我们新增的管道类还是用原来的名字,这样在配置文件中就不需要修改了,在这边也可以看到scrapy的设计,如果说我们想切换会保存excel ,只需要改配置文件就可以,是不需要改代码的,下面给出我们新增的管道类。
安装pymysql
pip install pymysql
编写管道类
import pymysql
import json
# 保存mysql
class TourPipeline:
def __init__(self):
# 连接 MySQL 数据库
self.db = pymysql.connect(
host="localhost",
user="root",
password="***",
database="scrapy_demo",
charset="utf8"
)
self.cursor = self.db.cursor()
def process_item(self, item, spider):
# 检查数据是否已存在
sql = "SELECT COUNT(*) FROM tb_tour WHERE title = %s"
self.cursor.execute(sql, (item["title"],))
count = self.cursor.fetchone()[0]
if count > 0:
spider.log(f"Data already exists: {item['title']}")
return item
# 插入新数据
sql = ("INSERT INTO tb_tour (title, title_en, img, score, comments, comment_url,"
" rank_title, ranks, select_user, select_comment, nation, city) "
"VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)")
values = (
item["title"],
item["title_en"],
item["img"],
item["score"],
item["comment"],
item["comment_url"],
item["rank_title"],
item["rank"],
item["select_user"],
item["select_comment"],
item["nation"],
item["city"]
)
try:
self.cursor.execute(sql, values)
self.db.commit()
spider.log(f"Saved data: {item['title']}")
except pymysql.Error as e:
self.db.rollback()
spider.log(f"Error saving data: {item['title']} - {e}")
return item
def close_spider(self, spider):
self.cursor.close()
self.db.close()
6 运行爬虫
和上一期一样的运行方式
scrapy crawl qys3
可以看到存储到MYSQL的效果
7 小结
通过四期的内容我们完成了如下内容:
- 利用scrapy框架爬取【东京】景区列表页面进行html保存
- scrapy + selenium 实现动态页面翻页
- 解析景区数据存储到excel文件
- 解析景区数据存储到MySQL数据库
后续这个系列还会更新的内容有:
- 断点续爬功能的研究和实战
- 图片下载到本地保存
- 爬取景点评论 \ 景点详情页面
- 结合爬取的数据搭建前后端分离的数据分析可视化系统
欢迎大家收藏关注!