当前位置: 首页 > news >正文

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

本期内容:(1)爬取日本其他城市数据存入数据库(2)爬取景点评论数据

1 爬取其他城市景点数据

只爬取一个城市的数据对于做数据可视化系统可能是不够的,因为数据样本量少嘛,本期来爬取其他城市的景点数据,前面四期已经打好的良好基础,本期内容非常简单,只需要对项目稍加修改,就可以完成,废话不多说,let’s go。

首先改一下爬虫,把城市作为一个参数,比如现在改为横滨:

start_urls = ['https://place.qyer.com/yokohama/sight/']
city = '横滨'
nation = '日本'

item部分这样写:

item['city'] = self.city
item['nation'] = self.nation

翻页的时候判断下100页以上的不用爬取了,因为这个网站超过100页你去点下一页,它也不刷新数据了

            if page_number > 100:break

多爬一些数据,后续做旅游分析系统的时候数据多一点系统做出来就好看,我爬取的结果:

在这里插入图片描述

2 爬取评论数据 爬取思路

之前爬取的数据字段里有个comment_url ,就是为了爬取评论数据作的准备,通过这个字段就可以爬取每个景点的用户评论,例如东京迪士尼景区的用户评论是在这个地址:https://place.qyer.com/poi/V2EJalFnBzRTbQ/review/

通过浏览器的开发者模式可以大致如何爬取这个页面,其他也类似于景区列表,这个页面也是通过翻页来加载数据的。

下面用一张图来展示爬取流程:

在这里插入图片描述

首先需要遍历tb_tour表的comment_url字段,循环中去读取每个景点的评论页面, 而爬取评论页面的过程中需要翻页,这里面也涉及一个循环,爬取每页都会去调用一次pipeline进行数据的存储。

这次我们会有两个地方去读取mysql数据库,一个是爬虫,二是管道部分,因此先优化一下数据库的配置,把链接信息写到settings.py里


DB_HOST = 'localhost'
DB_USER = '******'
DB_PASS = '******'
DB_DATABASE = 'scrapy_demo'
DB_CHARSET  = 'utf8'

3 编写评论爬虫 初始化部分

首先新建一个爬虫QyCommentSpider ,整个整体的思路和之前爬取景点的类似,不同之处在于启动的Url需要从数据库里去获取,另外,需要一个专门的管道了处理数据。先编写部分爬虫

class QyCommentSpider(scrapy.Spider):name = 'cmt'custom_settings = {'ITEM_PIPELINES': {'tutorial2.pipelines.TourCommentPipeline': 300}}def __init__(self, *args, **kwargs):super(QyCommentSpider, 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 的实际路径def start_requests(self):# 连接 MySQL 数据库db = pymysql.connect(host=self.settings.get('DB_HOST'),user=self.settings.get('DB_USER'),password=self.settings.get('DB_PASS'),database=self.settings.get('DB_DATABASE'),charset=self.settings.get('DB_CHARSET'))cursor = db.cursor()cursor.execute("SELECT comment_url, id FROM tb_tour")start_urls = cursor.fetchall()cursor.close()db.close()for url in start_urls:yield scrapy.Request(url=url[0], callback=self.parse,meta={'tid': url[1]})

4 编写item 和 管道

class TourCommentItem(scrapy.Item):tid = scrapy.Field()username = scrapy.Field()avatar = scrapy.Field()comments = scrapy.Field()# 保存mysql 景点评论
class TourCommentPipeline:def process_item(self, item, spider):pass

在settings里也增加下新的管道

ITEM_PIPELINES = {'tutorial2.pipelines.TourPipeline': 300,'tutorial2.pipelines.TourCommentPipeline': 301,
}

5 解析代码 【补充】

做视频的时候发现漏了给出解析的代码了,下面补全

 def parse_page(self, page_source, tid):response = scrapy.Selector(text=page_source)# 生成指纹fingerprint = self.get_fingerprint(page_source)# 判断指纹是否存在if self.fingerprint_exists(fingerprint):self.logger.info('指纹已存在,跳过 %s', fingerprint)return# 保存指纹self.save_fingerprint(fingerprint)# print(response)comments = response.xpath('//ul[@id="commentlist"]/li')# print('comments=', comments)for comment in comments:item = TourCommentItem()item['tid'] = tiditem['username'] = comment.xpath('.//a/span/text()').get().strip()item['avatar'] = comment.xpath('.//a/img/@src').get().strip()item['comments'] = comment.xpath('.//div[@class="comment clearfix"]/p[@class="content"]').xpath('string(.)').extract()[0]print(f"\033[36m{item['tid']}\033[0m")print(f"\033[92m{item['username']}\033[0m")# print(f"\033[92m{item['avatar']}\033[0m")# print(f"\033[92m{item['comments']}\033[0m")yield item

6 开启debug

之前我们一直是用命令行来跑scrapy 的,可以在scrapy.cfg同级目录建一个run.py文件

# -*- coding:utf-8 -*-
from scrapy import cmdline
# cmt 对应的是爬虫名
# 在cmd运行 scrapy crawl cmt 同步
cmdline.execute("scrapy crawl cmt".split())

pycharm去执行这个文件,就可以debug运行了。

爬取结果:
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【LLM】-14-搭建问答系统
  • 天气曲线echarts
  • PHP常用函数
  • Opencv学习-LUT函数
  • 人工智能未来展望
  • 基于域名的虚拟主机、多虚拟主机的配置、基于ip的虚拟主机及上线静态的前端系统(商城系统)
  • jenkins服务器重启,构建记录消失
  • 结构型设计模式:适配器/代理
  • Qt——QTCreater ui界面如何统一设置字体
  • 设计用户登录与注册界面切换的HTML+CSS+JS代码
  • 达梦数据库的系统视图v$cachers
  • 智能语音转Markdown的神器
  • 系统架构设计师 - 知识产权与标准化
  • KubeSphere 部署的 Kubernetes 集群使用 GlusterFS 存储实战入门
  • 建筑业数据挖掘:Scala爬虫在大数据分析中的作用
  • [case10]使用RSQL实现端到端的动态查询
  • ComponentOne 2017 V2版本正式发布
  • Cookie 在前端中的实践
  • Effective Java 笔记(一)
  • EOS是什么
  • Github访问慢解决办法
  • HTML中设置input等文本框为不可操作
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Laravel 中的一个后期静态绑定
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • Vue 动态创建 component
  • vue-router的history模式发布配置
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 仿天猫超市收藏抛物线动画工具库
  • 删除表内多余的重复数据
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 首页查询功能的一次实现过程
  • 跳前端坑前,先看看这个!!
  • 微信小程序:实现悬浮返回和分享按钮
  • 异步
  • 再谈express与koa的对比
  • elasticsearch-head插件安装
  • 带你开发类似Pokemon Go的AR游戏
  • ​MySQL主从复制一致性检测
  • ​TypeScript都不会用,也敢说会前端?
  • ​ubuntu下安装kvm虚拟机
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • ###项目技术发展史
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #数学建模# 线性规划问题的Matlab求解
  • $ git push -u origin master 推送到远程库出错
  • (3)选择元素——(17)练习(Exercises)
  • (C++哈希表01)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (转)【Hibernate总结系列】使用举例
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .NET Core中Emit的使用
  • .net 调用php,php 调用.net com组件 --