用Python一键艺龙酒店各个城市数据存入mysql

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 用Python一键艺龙酒店各个城市数据存入mysql

用Python一键艺龙酒店各个城市数据存入mysql

前言:

在这篇文章中,我将分享如何利用Python轻松爬取易龙API中的酒店数据。易龙是一家知名的中国酒店预订平台,他们的API提供了丰富的酒店信息,包括价格、评论等。我们将使用Python以及Requests库进行HTTP请求,BeautifulSoup库用于解析HTML。


准备工作:

Python基础知识

HTTP请求和API的基本了解

在你的系统上安装Python

安装Requests库 (pip install requests)

脚本编写:


首先,让我们设置Python环境。创建一个新的Python文件(例如 yilong_scraper.py)并导入必要的库:

import json
import time
import requests

抓取酒店数据:

现在,让我们深入代码。我们首先定义一个名为 YiLongList 的类来处理抓取过程。这个类将有方法来从API获取酒店数据和解析JSON响应。

class YiLongList:
    def __init__(self, inDate, outDate, city):
        # 初始化类变量
        self.inDate, self.outDate = inDate, outDate
        self.city = city
        self.session = requests.Session()
        self.hotels_data = []

    def jxList(self, hotelList):
        # 从酒店列表中提取数据的方法
        for h in hotelList:
            # 从每个酒店中提取相关信息
            hotelName = h.get("hotelName")
            starLevelDes = h.get("starLevelDes")
            commentScore = h.get("commentScore")
            # 以此类推提取其他字段

            # 构建一个包含提取数据的字典
            data = {
                'hotelName': hotelName,
                'starLevelDes': starLevelDes,
                'commentScore': commentScore,
                # 类似地添加其他字段
            }

            # 将数据添加到列表中
            self.hotels_data.append(data)

            # 打印提取的数据(可选)
            print(hotelName, starLevelDes, commentScore)
    
    def getList(self, page, traceToken):
        url = "https://hotel.elong.com/tapi/v2/list"

        if page == 0:
            params = {
                "city": self.city,
                "inDate": self.inDate,
                "outDate": self.outDate,
                "filterList": "8888_1",
                "pageIndex": str(page),
                "pageSize": "20",
                "sugActInfo": ""
            }
        else:
            params = {
                "city": self.city,
                "inDate": self.inDate,
                "outDate": self.outDate,
                "filterList": "8888_1",
                "pageIndex": str(page),
                "pageSize": "20",
                "sugActInfo": "",
                "traceToken":traceToken
            }
        try:
            response = requests.get(url, headers=headers, params=params)
            time.sleep(1)
            resqJson = response.json()
            print(resqJson)
            hotelList = resqJson["data"]["hotelList"]
            traceToken = resqJson["data"]["traceToken"]
            if hotelList:
                # print(hotelList)
                self.jxList(hotelList)
                return traceToken
            else:
                return "have_slide"
        except:
            return None

    def main(self):
        # 控制抓取过程的主方法
        traceToken = ""
        page = 0
        while page < 5:
            # 遍历页面
            traceToken = self.getList(page, traceToken)
            if traceToken == "have_slide":
                pass
            if traceToken and traceToken != "have_slide":
                page += 1

        # 抓取完成后,调用一个函数将数据保存到MySQL数据库中
        # request_data2mysql(self.hotels_data, self.city)

        # 清空数据列表以备下次使用
        self.hotels_data.clear()
  1. 运行脚本:

要运行脚本,我们需要为每个城市创建一个 YiLongList 实例并调用 main() 方法。

if __name__ == "__main__":
    # 定义城市和日期
    inDate = "2024-03-09"
    outDate = "2022-03-10"
    city_dict = {
        "1701": "郑州", "0801": "大连", "2010": "惠州",
        # 如果需要,可以添加更多城市
    }

    # 遍历城市
    for city_code, city_name in city_dict.items():
        print(f"正在抓取 {city_name} 的数据...")
        yi = YiLongList(inDate, outDate, city_code)
        yi.main()
  1. 写入数据库代码
 
import pymysql

config = {
    'host': 'localhost',
    'port': 3306,
    'user': 'root',
    'password': '12345678',
    'db': 'mydb',
    'charset': 'utf8mb4',
    'cursorclass': pymysql.cursors.DictCursor
}


def request_data2mysql(datas,city):
    connection = pymysql.connect(**config)
    try:
        with connection.cursor() as cursor:
            # 构建插入语句

            for data in datas:
                try:
                    data['city']=city
                    insert_query = """
                        INSERT INTO hotels (
                            hotelName, starLevelDes, commentCount, price, commentScore, commentScoreDes,
                            areaName, hotelTags, themeList, recallReason, commentMainTag, hotelAddress, trafficInfo,city
                        ) VALUES (
                            %(hotelName)s, %(starLevelDes)s, %(commentCount)s, %(price)s, %(commentScore)s, %(commentScoreDes)s,
                            %(areaName)s, %(hotelTags)s, %(themeList)s, %(recallReason)s, %(commentMainTag)s, %(hotelAddress)s, %(trafficInfo)s,%(city)s
                        )
                    """
                    # 执行插入操作
                    cursor.execute(insert_query, data)
                except Exception as e:
                    print(data)
                    pass
            # 提交事务
            connection.commit()

            print("Data inserted successfully!")
    except Exception as e:
        raise e
    finally:
        # 关闭数据库连接
        if connection.open:
            connection.close()
            print("Connection closed.")

if __name__ == '__main__':
    # 准备插入的数据
    data = [{
        'hotelName': 'Example Hotel',
        'starLevelDes': '5 Star Luxury',
        'commentCount': 100,
        'price': 200.0,
        'commentScore': 4.5,
        'commentScoreDes': 'Excellent',
        'areaName': 'Downtown',
        'hotelTags': 'Luxury, Spa, Pool',
        'themeList': 'Modern, Business',
        'recallReason': 'Great service and location',
        'commentMainTag': 'Cleanliness',
        'hotelAddress': '123 Example Street',
        'trafficInfo': 'Close to subway station',
        'city':'beijing'
    }]
    request_data2mysql(data)

在本文中,我们学习了如何使用Python从易龙API中抓取酒店数据。我们创建了一个抓取器类,从API获取数据并提取相关信息。这些数据可以进一步处理或存储在数据库中进行分析或其他用途。

  1. 运行结果


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
关系型数据库 MySQL
【mysql技巧】如何在这个mysql语句执行前加个前提,也就是只有表里没有相同数据才进行添加插入操作
【mysql技巧】如何在这个mysql语句执行前加个前提,也就是只有表里没有相同数据才进行添加插入操作
9 1
|
1天前
|
关系型数据库 MySQL 数据库
关系型数据库mysql数据增量恢复
【7月更文挑战第3天】
10 2
|
1天前
|
关系型数据库 MySQL Shell
关系型数据库mysql数据完全恢复
【7月更文挑战第3天】
10 2
|
4天前
|
缓存 DataWorks 关系型数据库
DataWorks产品使用合集之如何抽取MySQL视图数据
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
20 4
|
2天前
|
存储 SQL 关系型数据库
|
2天前
|
存储 关系型数据库 MySQL
|
3天前
|
SQL 关系型数据库 MySQL
MySQL数据库—DQL查询语句(一篇教会你快速找到想要的数据)
MySQL数据库—DQL查询语句(一篇教会你快速找到想要的数据)
|
6天前
|
数据采集 JSON 数据可视化
【Python实战】Python对中国500强排行榜数据进行可视化分析
【Python实战】Python对中国500强排行榜数据进行可视化分析
|
5天前
|
数据采集 DataWorks 监控
DataWorks产品使用合集之mysql-cdc读取数据写入到datahub中,datahub如何转换时区
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
17 1
|
6天前
|
JSON 数据可视化 API
技术心得:如何用Python和API收集与分析网络数据?
技术心得:如何用Python和API收集与分析网络数据?
13 2