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 itemdef close_spider(self, spider):self.cursor.close()self.db.close()

6 运行爬虫

和上一期一样的运行方式

scrapy crawl qys3

可以看到存储到MYSQL的效果
在这里插入图片描述

7 小结

通过四期的内容我们完成了如下内容:

  • 利用scrapy框架爬取【东京】景区列表页面进行html保存
  • scrapy + selenium 实现动态页面翻页
  • 解析景区数据存储到excel文件
  • 解析景区数据存储到MySQL数据库

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

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

欢迎大家收藏关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51041.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端JS特效第57波:响应式博客网站图文幻灯片

响应式博客网站图文幻灯片&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html> <html lang"zh-CN"><head> <meta charset"utf-8"> <title>响应式博客幻灯片演示</title><link …

记录|C#批量修改文件后缀

文章目录 前言一、.CHK 批量修改成 .mp3更新时间 前言 针对昨天博文&#xff1a;记录&#xff5c;cmd方式恢复U盘中的数据中的文件修复为.CHK格式后&#xff0c;如果将大量的.CHK后缀改为.mp3后缀的问题进行了编写。 主要是&#xff0c;现在网上的批量修改后缀的软件竟然要开会…

Unity横板动作游戏 - 素材导入和整理

导入素材 编辑器布局 点击每个窗口右上角的三个点可以有更多的窗口选项。 在屏幕的右上角有一个菜单可以保存布局或读取已经报错的布局。 工具按钮 编辑器上的工具按钮在启动的时候是蓝色的&#xff0c;在不启动的时候是灰色的。 这个按钮将会决定场景中的物体是以锚点显示还…

Python包管理工具pip

1、安装pip cmd管理员模式打开控制台 python -m pip install --upgrade pip 2、添加pip环境变量 pip 路径 C:\Users\1\AppData\Local\Programs\Python\Python312\Scripts

【Rust】所有权OwnerShip

什么是所有权 rust使用由编译器检查的一些规则构成的所有权系统来管理内存。且这不会影响程序的运行效率。 所有权规则 rust中每一个每一个值都有一个owner。在同一时刻&#xff0c;只能有一个owner。当这个owner超过范围&#xff0c;则该值会被丢弃。 String类型 为什么需…

斯坦福UE4 C++课学习补充 14:UMG-优化血量条

文章目录 一、优化执行效率二、简单脉冲动画 一、优化执行效率 绑定事件需要每一帧检查绑定对象是否有变化&#xff0c;势必造成CPU资源的浪费&#xff0c;因此优化执行效率的思路是&#xff1a;UI组件不再自行每帧查询血量&#xff0c;而是让血量自己在发生变化的同时通知UI进…

0727,学什么学,周六就应该休息!!!!!

周六就应该休息&#xff0c;一天就忙了两小时也不是我的错喵 目录 UDP的小总结 01&#xff1a;使用select实现一个基于UDP的一对一即时聊天程序。 1.0 复读机服务器和树洞客户端 2.0 byby不了一点的敬业服务器&#xff01;&#xff01;&#xff01; 今天到此为止&#x…

buu做题(8)

[安洵杯 2019]easy_web 查看源代码可以发现一长串的base64编码 就是页面上的一张图片 回到原页面,url上面也有一些奇怪的参数 经过两次base64和一次hex 解密后得到 555.png 应该就是包含着页面上的这张图片 然后尝试将index.php 按照这样的方式编码, 看看能不能包含到 TmprMl…

Linux---gdb工具

目录 初步了解 gdb安装 gdb使用 初步了解 gdb是Linux中的调试器。 发布软件一般有两种方式debug和release。 debug版本&#xff1a;一般开发人员使用&#xff0c;这个版本形成的可执行程序有调试功能和调试信息&#xff0c;文件比较大。 release版本&#xff1a;一般测试人员…

夯实数字经济的“新基建”-基于大数据与区块链技术的新型基础设施

随着我国数据市场的蓬勃发展&#xff0c;构建契合数据特性、加速数据流通与价值释放的新型数据基础设施变得尤为关键。数字基础设施作为数字经济蓬勃发展的基石&#xff0c;其完善与否直接关系到数据能否有效存储、顺畅流通及高效利用&#xff0c;进而促进数据资源向数据资产的…

深度学习loss

pytorch模型训练demo代码 在PyTorch中&#xff0c;模型训练通常涉及几个关键步骤&#xff1a;定义模型、定义损失函数、选择优化器、准备数据加载器、编写训练循环。以下是一个简单的PyTorch模型训练演示代码&#xff0c;该代码实现了一个用于手写数字识别&#xff08;使用MNIS…

基于GitHub page和Hexo主题搭建个人博客(win)

1.安装git git官网下载地址&#xff1a;Git - Downloads (git-scm.com) (1)下载&#xff1a;进入官网&#xff0c;选择对应版本下载&#xff0c;得到.exe文件 (2)安装&#xff1a;打开.exe文件&#xff0c;进行如下操作 (3)安装好后&#xff0c;右击鼠标&#xff0c;点击显示…

Vue element ui分页组件示例

https://andi.cn/page/621615.html

从单个视频中重建3D场景——开启虚拟现实与数字孪生的新探索

在当今的科技前沿,人工智能与计算机视觉技术正在以前所未有的速度推动着虚拟现实(VR)、增强现实(AR)以及数字孪生(Digital Twin)领域的发展。其中,一项引人注目的研究方向是从单个视频中重建3D场景,这项技术不仅能够捕捉到场景的完整3D动态,还能处理复杂的遮挡问题,…

docker前端部署

挂载&#xff0c;把自己的目录位置&#xff0c;挂载到容器内的HTML

阿里服务器购买与java环境搭建 实践

【云服务器搭建与环境配置】 工作几年了&#xff0c;最近又买了个云服务器搭着玩一玩&#xff0c;在这里记录下搭建云服务器的过程&#xff0c;以及各种基础环境配置&#xff0c;可供初学者学习搭建云服务器的过程。 云服务器购买 这里作者搭建阿里云服务器&#xff0c;搭建…

Servlet1-Servlet程序、请求处理、继承体系

目录 什么是Servlet 手动实现Servlet程序 ​编辑url地址如何定位到Servlet程序去访问 Servlet的生命周期 ​编辑GET和POST请求的分发处理 通过继承HttpServlet类实现Servlet程序 IDEA菜单生成Servlet程序 Servlet类的继承体系 ServletConfig类 ServletContext类 什么…

【彩虹商城】虚拟发卡系统

运行环境&#xff1a; Nginx 1.22.1 Mysql5.7 PHP7.4 直接访问域名即可安装 [呵呵] 彩虹二次开发 拥有供货商系统 多余模板删除 保留一套商城,两套发卡 源码无后门隐患 已知存在的BUG修复 目前适用于卡密类型业务销售。 后续将会慢慢编写数卡权益类的对接&#xf…

神经网络的参数初始化【PyTorch】

文章目录 1、常见初始化方法2、代码2.1、导包&#xff1a;2.2、均匀分布随机初始化2.3、固定初始化2.4、全0初始化2.5、全1初始化2.6、正态分布随机初始化2.7、kaiming 初始化2.8、xavier 初始化2.9、完整代码 3、小节 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专…

科技云报道:算网筑基AI注智,中国联通如何讲出AI时代的“新故事”?

科技云报道原创。 AI从未停止进化&#xff0c;也从未停止给人类带来惊喜。 从ChatGPT代表的文生文、Dall-E代表的文生图&#xff0c;到Sora代表的文生视频&#xff0c;Suno为代表的文生音乐&#xff0c;生成式AI的“暴力美学”持续突破内容生产的天花板&#xff0c;大模型技术…