Scrapy 爬取旅游景点相关数据(四)

  • 本节内容主要为:
    (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数据库

后续这个系列还会更新的内容有:

  • 断点续爬功能的研究和实战
  • 图片下载到本地保存
  • 爬取景点评论 \ 景点详情页面
  • 结合爬取的数据搭建前后端分离的数据分析可视化系统

欢迎大家收藏关注!

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麦麦大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值