爬取肯德基门店地址

一、流程分析

1、请求分析
请求 URL: http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
请求方法: POST
data = {'cname': cname, 'pid': '', 'pageIndex': 页码, 'pageSize': 10}

2、响应分析
{
    "Table":[
        {
            "rowcount":188
        }
    ],
    "Table1":[
        {
            "rownum":1,
            "storeName":"华达(高升桥)",
            "addressDetail":"武侯大街266号华达商厦一楼,二楼",
            "pro":"24小时,24小时,礼品卡,手机点餐,手机点餐",
            "provinceName":"四川省",
            "cityName":"成都市"
        },
 # 响应内容是json格式字符串
 # rowcount是总数据条数
 # Table1列表包含了10个门店数据
 
 3、爬取流程
 # 第一步:拼接data数据,朝第一页发post请求--->获取到rowcount--->计算出总页数
 # 第二步:for循环所有页,每页爬取,解析出需要的字段
 
 4、存储数据
 本例以文件存储,文件不能直接存入字典,需要把字典的value取出来,格式化字符串,进行拼接

二、代码实现

View Code
 # 爬取肯德基门店地址
# http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname&pageindex=1&pagesize=10

import requests
import json

# 从代理池服务中随机获取一个代理
def get_proxy():
    return requests.get('http://127.0.0.1:8000/get/').text

# 获取总的页数
def get_page(input_name):
    url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?'
    cname = input_name   # 输入的城市名称
    data = {'cname': cname, 'pid': '', 'pageIndex': 1, 'pageSize': 10}
    try:
        html_1 = requests.post(url, params={'op': 'cname'}, data=data, )
        data_dic = html_1.json()
        rowcount = data_dic.get('Table')[0]['rowcount']

        page_num = divmod(rowcount, 10)[0]
        if divmod(rowcount, 10)[1]:   # 如果divmod函数有余数,页数加1
            page_num += 1
        return page_num
    except Exception as e:
        print(str(e))

# 爬取每页信息
def get_html(page, input_name):
    url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?'
    cname = input_name
    proxy = get_proxy()

    # 文件不能直接存入字典,只能存入字符串,需要把字典的value取出来,格式化字符串,进行拼接
    # 转义符:\t 横向空格, \n 换行
    file_content = '序号\t省份\t\t城市\t\t店名\t\t地址\t\t\t详情\n'
    for i in range(1, page + 1):
        data = {'cname': cname, 'pid': '', 'pageIndex': '%s' % i, 'pageSize': 10}

        try:
            html = requests.post(url, proxies={"http": "http://{}".format(proxy)}, params={'op': 'cname'}, data=data)
            data_dic = html.json()
            table_list = data_dic.get('Table1')  # Tablie1是一个列表,里面包含10个门店数据

            for row_data in table_list:
                pk = row_data.get('rownum')
                province = row_data.get('provinceName')
                city = row_data.get('cityName')
                store = row_data.get('storeName')
                addr = row_data.get('addressDetail')
                detail = row_data.get('pro')

                data_str = str(pk)+'\t' + province+'\t' + city+'\t' + store+'\t' + addr+'\t' + detail+'\n'
                file_content += data_str
        except Exception as e:
            pass

    with open('kfcDate/kfc-%s.txt' % cname, 'at', encoding='utf-8') as f:
        for line in file_content:
            f.write(line)


if __name__ == '__main__':
    city_name = input('输入查询的城市名:').strip()
    get_html(page=get_page(city_name), input_name=city_name)

 

posted @ 2022-09-30 14:03  不会钓鱼的猫  阅读(191)  评论(0编辑  收藏  举报