#
简介
本教程将指导您如何使用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 Nonedef 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信息的爬虫部分详细描述
以下是肯德基餐厅信息查询的页面示例
肯德基餐厅信息查询
目标
爬取石家庄市的KFC门店信息,包括门店名称、地址和提供的服务(如Wi-Fi、点唱机、礼品卡等)。
爬虫步骤
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. 提取门店信息
从解析后的JSON对象中提取门店名称、地址和提供的服务,并将这些信息存储到列表中。
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)
注意事项
- 请确保您的MySQL用户名、密码和数据库名称是正确的。
- 如果您在运行脚本时遇到网络问题,可能是由于KFC网站的限制或网络连接问题。请检查您的网络连接,并确保您的请求头和数据格式正确。
- 本教程仅供学习和研究使用,如有相关侵权内容请联系博主删除
希望这个教程能帮助您成功爬取城市的KFC门店信息并存储到MySQL数据库中。