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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 用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
相关文章
|
30天前
|
安全 关系型数据库 MySQL
如何将数据从MySQL同步到其他系统
【10月更文挑战第17天】如何将数据从MySQL同步到其他系统
168 0
|
1月前
|
SQL 前端开发 关系型数据库
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
49 0
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
|
12天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
119 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
12天前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
47 14
|
29天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
14天前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
46 9
|
14天前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
23 1
|
15天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
15天前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
26天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
下一篇
无影云桌面