Python - ajax的post请求爬取方法

184 阅读2分钟

代码示例

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、请求头等)提取到常量或配置文件中,增强代码的灵活性。

  • 增强代码可读性:简化复杂的逻辑,减少冗余的代码,增强可维护性。

  • 处理异常:添加异常处理,确保程序在出现网络问题或文件写入失败时不会崩溃。