搜索
您的当前位置:首页正文

爬取某市KFC餐厅信息(POST请求+PYMYSQL)

来源:易榕旅网

#

简介

本教程将指导您如何使用Python爬取石家庄市的KFC门店信息,并将这些信息存储到MySQL数据库中。我们将使用requests库来发送网络请求,pymysql库来操作MySQL数据库。

环境准备

在开始之前,请确保您已经安装了以下Python库:

  • requests
  • pymysql

如果尚未安装,可以使用pip进行安装:

pip install requests pymysql

同时,请确保您的MySQL服务正在运行,并且您有权限创建数据库和表。

步骤1:创建MySQL数据库和表

首先,我们需要创建一个数据库和表来存储KFC门店信息。以下是创建表的SQL语句:

CREATE TABLE IF NOT EXISTS kfc_restaurants (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    address TEXT NOT NULL,
    details TEXT
);

您可以在MySQL客户端或使用任何数据库管理工具执行此SQL语句。

步骤2:编写Python脚本

接下来,我们将编写Python脚本来爬取数据并将其插入到MySQL数据库中。(示例脚本,涉及到数据库连接的部分结合自己的实际情况修改)

import requests
import pymysql
from pymysql import Error

# 创建数据库表的 SQL 语句
CREATE_TABLE_SQL = """
CREATE TABLE IF NOT EXISTS kfc_restaurants (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    address TEXT NOT NULL,
    details TEXT
);
"""

def create_table_if_not_exists(host, user, password, database):
    try:
        # 连接数据库
        connection = pymysql.connect(
            host=host,
            user=user,
            password=password,
            database=database,
            charset='utf8mb4'
        )
        cursor = connection.cursor()
        # 执行创建表的 SQL 语句
        cursor.execute(CREATE_TABLE_SQL)
        connection.commit()
        print("Table 'kfc_restaurants' has been created successfully or already exists.")
    except Error as e:
        print(f"Error while connecting to MySQL: {e}")
    finally:
        if connection:
            cursor.close()
            connection.close()
            print("MySQL connection is closed")

def fetch_kfc_store_data(cname, page_index, page_size):
    get_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0'
    }

    data = {
        'cname': cname,
        'pid': '',
        'pageindex': page_index,
        'pagesize': page_size
    }

    response = requests.post(url=get_url, data=data, headers=headers)

    if response.status_code == 200:
        return response.json()
    else:
        print(f"Failed to fetch data: {response.status_code}")
        return None

def save_to_mysql(all_data, cname):
    try:
        connection = pymysql.connect(
            host='localhost',
            user='your_user',
            password='your_password',
            database='your_database',
            charset='utf8mb4'
        )
        cursor = connection.cursor()

        for item in all_data:
            restaurant_name = item['storeName']
            restaurant_address = item['addressDetail']
            details = item['pro']
            query = "INSERT INTO kfc_restaurants (name, address, details) VALUES (%s, %s, %s)"
            cursor.execute(query, (restaurant_name, restaurant_address, details))

        connection.commit()
        print(f"Data for {cname} has been inserted successfully.")
    except Error as e:
        print(f"Error while connecting to MySQL: {e}")
    finally:
        if connection:
            cursor.close()
            connection.close()
            print("MySQL connection is closed")

if __name__ == '__main__':
    # 创建表
    create_table_if_not_exists('localhost', 'user', 'password', 'database')

    # 获取数据并保存到数据库
    cname = "石家庄"
    all_data = []
    for page_index in range(1, 11):  # 有10页数据
        page_size = '10'
        page_data = fetch_kfc_store_data(cname, str(page_index), page_size)
        if page_data:
            all_data.extend(page_data['Table1'])  # 将每页的数据添加到总数据列表中

    # 将所有数据保存到 MySQL 数据库
    save_to_mysql(all_data, cname)

步骤3:运行脚本

如果一切顺利,您将看到石家庄市的KFC门店信息被成功插入到MySQL数据库中。

爬取石家庄市KFC信息的爬虫部分详细描述

以下是肯德基餐厅信息查询的页面示例

目标

爬虫步骤

1.页面分析

该页面可以通过IP或者手动选择进行要查询的城市KFC信息

2. 定义请求URL和参数

我们需要定义请求的URL和参数。URL是KFC官网提供的API接口,用于获取门店信息。参数包括城市名称(cname)、页码(pageindex)和每页显示的门店数量(pagesize)。

def fetch_kfc_store_data(cname, page_index, page_size):
    get_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0'
    }

    data = {
        'cname': cname,
        'pid': '',
        'pageindex': page_index,
        'pagesize': page_size
    }

请求头:在发送请求时,我们设置了User-Agent请求头,这是模拟浏览器行为的一种方式,有助于防止被服务器识别为爬虫。

3. 发送请求并获取响应

使用requests.post方法发送POST请求,传入URL、headers和data参数。如果响应状态码为200,表示请求成功,然后解析响应内容为JSON格式。

    response = requests.post(url=get_url, data=data, headers=headers)

    if response.status_code == 200:
        return response.json()
    else:
        print(f"Failed to fetch data: {response.status_code}")
        return None
4. 解析JSON数据

响应内容是一个JSON对象,其中包含了门店信息。我们需要解析这个JSON对象,提取出有用的信息。

# 响应的JSON结构如下:

	"Table1":[{"rownum":1,
			"storeName":"中山",
			"addressDetail":"北国商城对面燕春饭店一层底商",
			"pro":"24小时,Wi-Fi,点唱机,礼品卡",
			"provinceName":"河北省",
			"cityName":"石家庄市"
			}

5. 提取门店信息
if __name__ == '__main__':
    cname = "石家庄"
    all_data = []
    for page_index in range(1, 11):  # 有10页数据
        page_size = '10'
        page_data = fetch_kfc_store_data(cname, str(page_index), page_size)
        if page_data:
            all_data.extend(page_data['Table1'])  # 将每页的数据添加到总数据列表中

上面的代码是已知该城市的KFC数量(页数),如果我们要爬取一个未知数目则采用如下代码 while循环解决

if __name__ == '__main__':
    # 创建表
    create_table_if_not_exists('localhost', 'user', 'password', 'database')

    # 获取数据并保存到数据库
    cname = "石家庄"
    all_data = []
    page_index = 1  # 初始化页面索引
    has_more_pages = True  # 标记是否还有更多页面

    while has_more_pages:  # 当还有更多页面时继续循环
        page_size = '10'
        page_data = fetch_kfc_store_data(cname, str(page_index), page_size)

        if page_data:
            if page_data['Table1']:  # 检查当前页是否有数据
                all_data.extend(page_data['Table1'])  # 将当前页的数据添加到总数据列表中
                page_index += 1  # 准备获取下一页数据
            else:
                has_more_pages = False  # 如果当前页没有数据,表示没有更多页面了
        else:
            has_more_pages = False  # 如果请求失败或没有返回数据,也停止循环

    # 将所有数据保存到 MySQL 数据库
    save_to_mysql(all_data, cname)

注意事项

希望这个教程能帮助您成功爬取城市的KFC门店信息并存储到MySQL数据库中。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top