本期内容:(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 开启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运行了。
爬取结果: