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

打印 上一主题 下一主题

主题 863|帖子 863|积分 2589



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

只爬取一个城市的数据对于做数据可视化系统大概是不敷的,因为数据样本量少嘛,本期来爬取其他城市的景点数据,前面四期已经打好的精良基础,本期内容非常简单,只需要对项目稍加修改,就可以完成,废话不多说,let’s go。
首先改一下爬虫,把城市作为一个参数,好比如今改为横滨:
  1. start_urls = ['https://place.qyer.com/yokohama/sight/']
  2. city = '横滨'
  3. nation = '日本'
复制代码
item部分如许写:
  1. item['city'] = self.city
  2. item['nation'] = self.nation
复制代码
翻页的时候判断下100页以上的不消爬取了,因为这个网站凌驾100页你去点下一页,它也不刷新数据了
  1.             if page_number > 100:
  2.                 break
复制代码
多爬一些数据,后续做旅游分析系统的时候数据多一点系统做出来就好看,我爬取的结果:

2 爬取批评数据 爬取思绪

之前爬取的数据字段里有个comment_url ,就是为了爬取批评数据作的准备,通过这个字段就可以爬取每个景点的用户批评,例如东京迪士尼景区的用户批评是在这个地址:https://place.qyer.com/poi/V2EJalFnBzRTbQ/review/
通过欣赏器的开发者模式可以大致如何爬取这个页面,其他也类似于景区列表,这个页面也是通过翻页来加载数据的。
下面用一张图来展示爬取流程:

首先需要遍历tb_tour表的comment_url字段,循环中去读取每个景点的批评页面, 而爬取批评页面的过程中需要翻页,这内里也涉及一个循环,爬取每页都会去调用一次pipeline进行数据的存储。
这次我们会有两个地方去读取mysql数据库,一个是爬虫,二是管道部分,因此先优化一下数据库的设置,把链接信息写到settings.py里
  1. DB_HOST = 'localhost'
  2. DB_USER = '******'
  3. DB_PASS = '******'
  4. DB_DATABASE = 'scrapy_demo'
  5. DB_CHARSET  = 'utf8'
复制代码
3 编写批评爬虫 初始化部分

首先新建一个爬虫QyCommentSpider ,整个整体的思绪和之前爬取景点的类似,差别之处在于启动的Url需要从数据库里去获取,另外,需要一个专门的管道了处置惩罚数据。先编写部分爬虫
  1. class QyCommentSpider(scrapy.Spider):
  2.     name = 'cmt'
  3.     custom_settings = {
  4.         'ITEM_PIPELINES': {'tutorial2.pipelines.TourCommentPipeline': 300}
  5.     }
  6.     def __init__(self, *args, **kwargs):
  7.         super(QyCommentSpider, self).__init__(*args, **kwargs)
  8.         options = webdriver.ChromeOptions()
  9.         # 这行代码是用于设置 Chrome 浏览器的选项。--headless 参数表示以无头模式(无 GUI 界面)运行 Chrome 浏览器。
  10.         # 无头模式下,浏览器运行在后台,不会显示任何图形界面,从而能够提高爬取效率和性能。这在服务器环境中非常有用,因为服务器通常没有图形界面。
  11.         options.add_argument('--headless')
  12.         LOGGER.setLevel(logging.WARNING)
  13.         # 这行代码是用于指定 ChromeDriver 的路径。ChromeDriver 是 Selenium 用于控制 Chrome 浏览器的驱动程序。
  14.         service = Service('/usr/local/bin/chromedriver')
  15.         self.driver = webdriver.Chrome(options=options, service=service)  # 替换为 ChromeDriver 的实际路径
  16.     def start_requests(self):
  17.         # 连接 MySQL 数据库
  18.         db = pymysql.connect(
  19.             host=self.settings.get('DB_HOST'),
  20.             user=self.settings.get('DB_USER'),
  21.             password=self.settings.get('DB_PASS'),
  22.             database=self.settings.get('DB_DATABASE'),
  23.             charset=self.settings.get('DB_CHARSET')
  24.         )
  25.         cursor = db.cursor()
  26.         cursor.execute("SELECT comment_url, id FROM tb_tour")
  27.         start_urls = cursor.fetchall()
  28.         cursor.close()
  29.         db.close()
  30.         for url in start_urls:
  31.             yield scrapy.Request(url=url[0], callback=self.parse,
  32.                                  meta={'tid': url[1]})
复制代码
4 编写item 和 管道

  1. class TourCommentItem(scrapy.Item):
  2.     tid = scrapy.Field()
  3.     username = scrapy.Field()
  4.     avatar = scrapy.Field()
  5.     comments = scrapy.Field()
  6.    
  7. # 保存mysql 景点评论
  8. class TourCommentPipeline:
  9.     def process_item(self, item, spider):
  10.         pass
复制代码
在settings里也增加下新的管道
  1. ITEM_PIPELINES = {
  2.    'tutorial2.pipelines.TourPipeline': 300,
  3.    'tutorial2.pipelines.TourCommentPipeline': 301,
  4. }
复制代码
5 分析代码 【增补】

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


  1. def parse_page(self, page_source, tid):
  2.         response = scrapy.Selector(text=page_source)
  3.         # 生成指纹
  4.         fingerprint = self.get_fingerprint(page_source)
  5.         # 判断指纹是否存在
  6.         if self.fingerprint_exists(fingerprint):
  7.             self.logger.info('指纹已存在,跳过 %s', fingerprint)
  8.             return
  9.         # 保存指纹
  10.         self.save_fingerprint(fingerprint)
  11.         # print(response)
  12.         comments = response.xpath('//ul[@id="commentlist"]/li')
  13.         # print('comments=', comments)
  14.         for comment in comments:
  15.             item = TourCommentItem()
  16.             item['tid'] = tid
  17.             item['username'] = comment.xpath('.//a/span/text()').get().strip()
  18.             item['avatar'] = comment.xpath('.//a/img/@src').get().strip()
  19.             item['comments'] = comment.xpath('.//div[@class="comment clearfix"]/p[@class="content"]').xpath('string(.)').extract()[0]
  20.             print(f"\033[36m{item['tid']}\033[0m")
  21.             print(f"\033[92m{item['username']}\033[0m")
  22.             # print(f"\033[92m{item['avatar']}\033[0m")
  23.             # print(f"\033[92m{item['comments']}\033[0m")
  24.             yield item
复制代码
6 开启debug

之前我们一直是用命令行来跑scrapy 的,可以在scrapy.cfg同级目录建一个run.py文件
  1. # -*- coding:utf-8 -*-
  2. from scrapy import cmdline
  3. # cmt 对应的是爬虫名
  4. # 在cmd运行 scrapy crawl cmt 同步
  5. cmdline.execute("scrapy crawl cmt".split())
复制代码
pycharm去执行这个文件,就可以debug运行了。
爬取结果:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宝塔山

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表