#
本教程将指导您如何使用Python爬取石家庄市的KFC门店信息,并将这些信息存储到MySQL数据库中。我们将使用requests
库来发送网络请求,pymysql
库来操作MySQL数据库。
在开始之前,请确保您已经安装了以下Python库:
如果尚未安装,可以使用pip进行安装:
pip install requests pymysql
同时,请确保您的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语句。
接下来,我们将编写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)
如果一切顺利,您将看到石家庄市的KFC门店信息被成功插入到MySQL数据库中。
以下是肯德基餐厅信息查询的页面示例
该页面可以通过IP或者手动选择进行要查询的城市KFC信息
我们需要定义请求的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
请求头,这是模拟浏览器行为的一种方式,有助于防止被服务器识别为爬虫。
使用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
响应内容是一个JSON对象,其中包含了门店信息。我们需要解析这个JSON对象,提取出有用的信息。
# 响应的JSON结构如下:
"Table1":[{"rownum":1,
"storeName":"中山",
"addressDetail":"北国商城对面燕春饭店一层底商",
"pro":"24小时,Wi-Fi,点唱机,礼品卡",
"provinceName":"河北省",
"cityName":"石家庄市"
}
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数据库中。
因篇幅问题不能全部显示,请点此查看更多更全内容