爬取肯德基门店地址
一、流程分析
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)