代码示例
import urllib.request
import urllib.parse
# 配置常量
BASE_URL = 'https://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/130.0.0.0 Safari/537.36'
}
DEFAULT_CITY = '长沙' # 默认城市
DEFAULT_PAGE_SIZE = 10 # 每页数据数量
def create_request(page, city=DEFAULT_CITY, page_size=DEFAULT_PAGE_SIZE):
"""
创建并返回一个HTTP请求对象
:param page: 页码
:param city: 城市名称
:param page_size: 每页数据数量
:return: 请求对象
"""
data = {
'cname': city,
'pid': None,
'pageIndex': page,
'pageSize': page_size
}
# URL编码并将数据转换为字节
data = urllib.parse.urlencode(data).encode('utf-8')
# 创建并返回请求对象
request = urllib.request.Request(url=BASE_URL, headers=HEADERS, data=data)
return request
def get_content(request):
"""
获取HTTP响应内容
:param request: HTTP请求对象
:return: 解码后的网页内容
"""
try:
response = urllib.request.urlopen(request)
return response.read().decode('utf-8')
except urllib.error.URLError as e:
print(f"请求失败: {e}")
return None
def download_content(page, content):
"""
将爬取的内容保存为JSON文件
:param page: 页码
:param content: 网页内容
"""
try:
with open(f'kfc_{page}.json', 'w', encoding='utf-8') as file:
file.write(content)
except IOError as e:
print(f"文件写入失败: {e}")
def main():
"""
主程序,爬取并保存指定范围内的页面内容
"""
try:
start_page = int(input('输入起始页码: '))
end_page = int(input('输入结束页码: '))
# 爬取并保存每一页的数据
for page in range(start_page, end_page + 1):
print(f"正在爬取第 {page} 页...")
request = create_request(page)
content = get_content(request)
if content:
download_content(page, content)
else:
print(f"第 {page} 页爬取失败。")
except ValueError:
print("无效的输入,请输入有效的页码范围。")
if __name__ == '__main__':
main()
代码规范
-
函数命名和注释:确保函数名清晰且符合 PEP 8 标准,使用文档字符串对每个函数进行详细说明。
-
避免硬编码:将配置项(如 URL、请求头等)提取到常量或配置文件中,增强代码的灵活性。
-
增强代码可读性:简化复杂的逻辑,减少冗余的代码,增强可维护性。
-
处理异常:添加异常处理,确保程序在出现网络问题或文件写入失败时不会崩溃。