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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 用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. 运行结果


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
存储 JSON JavaScript
使用Python处理JSON格式数据
使用Python处理JSON格式数据
|
22小时前
|
API Python
使用Python获取HTTP请求头数据
在Python Web开发中,`requests`库用于发送HTTP请求,请求头是关键元素,包含客户端信息和请求详情。要查看请求头,先创建`Request`对象,打印其`headers`属性,然后使用`get`等方法发送请求并获取响应头。别忘了处理不同HTTP方法、内容类型以及异常。使用`Session`管理会话状态,并考虑日志记录以调试。通过控制请求头,能有效与服务器通信。
10 0
|
1天前
|
XML 前端开发 数据挖掘
Web数据提取:Python中BeautifulSoup与htmltab的结合使用
Web数据提取:Python中BeautifulSoup与htmltab的结合使用
|
1天前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之同步MySQL数据并EP(复杂事件处理)时,编译报错,如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
1天前
|
关系型数据库 MySQL API
实时计算 Flink版操作报错合集之同步MySQL数据到另一个MySQL数据库,第一次同步后源表数据发生变化时目标表没有相应更新,且Web UI中看不到运行的任务,该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
2天前
|
关系型数据库 MySQL Java
实时计算 Flink版产品使用问题之如何提高Flink从MySQL读取数据的速度并减少延迟
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
2天前
|
JSON 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在使用CDAS语法同步MySQL数据到Hologres时,如果开启了字段类型宽容模式,MySQL中的JSON类型会被转换为什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
2天前
|
canal 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在进行整库同步MySQL数据到StarRocks时,遇到全量数据可以同步,但增量数据无法同步,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
2天前
|
数据采集 存储 数据挖掘
Python网络爬虫实战:抓取并分析网页数据
使用Python的`requests`和`BeautifulSoup`,本文演示了一个简单的网络爬虫,抓取天气网站数据并进行分析。步骤包括发送HTTP请求获取HTML,解析HTML提取温度和湿度信息,以及计算平均温度。注意事项涉及遵守robots.txt、控制请求频率及处理动态内容。此基础爬虫展示了数据自动收集和初步分析的基础流程。【6月更文挑战第14天】
|
2天前
|
存储 安全 Java
在Python中,引用和赋值机制是理解变量和数据对象之间关系的关键
【6月更文挑战第16天】Python变量是对象引用,不存储数据,指向内存中的对象。赋值`=`创建引用,不复制对象。`b = a`时,a和b指向同一对象。引用计数管理对象生命周期,垃圾回收在引用数为0时回收对象。理解这些机制对优化内存使用关键。
23 7