python|Python学习记录-项目案例实现(爬虫篇 03)


项目案例实现|Python爬虫 03:爬取城市肯德基餐厅信息

  • 项目来源
  • 项目需求
  • 具体分析
    • 1. 指定URL
    • 2. UA伪装
    • 3. 发送请求
    • 4. 获取响应结果
    • 5. 持久化存储
    • 6. 个性化需求
  • 项目代码
  • 检验

项目来源 本项目来源B站UP主路飞学城视频:视频链接点这里
项目需求 利用爬虫爬取全国不同城市的肯德基餐厅信息
具体分析 1. 指定URL 项目用到的URL为肯德基餐厅地址查询,点击打开后跳转至该页面。通过抓包工具对整张页面发请求,查看拿到的响应数据发现没有任何信息,可见在本需求下,不再是对整张页面发请求,而是对局部数据的提取。随意输入一个城市名称进行查询,此处以’武汉’为例,观察上方URL没有发生变化且页面也没有跳转,初步估计获取的信息是ajax请求到的。打开抓包工具的ajax请求界面,拿到一个数据包如下:
python|Python学习记录-项目案例实现(爬虫篇 03)
文章图片

数据包中表明该请求为一个post请求,URL为http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword,此URL即为目标URL。
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'

2. UA伪装
header = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}

3. 发送请求 通过前面的分析,对该URL地址发送请求
params = {'cname': '', 'pid': '', 'keyword': '武汉', 'pageIndex': '1', 'pageSize': '10' } res = requests.post(url=url, data=https://www.it610.com/article/params, headers=header)

4. 获取响应结果 在抓包工具中查询得返回的响应结果的数据类型为text类型,故以text形式保存
text_obj = res.text

5. 持久化存储 json文件也能存储text内容,此处调用json模块进行存储
filename = '武汉' + '.json' fp = open(filename, 'w', encoding='utf-8') json.dump(text_obj, fp=fp, ensure_ascii=False)

6. 个性化需求 通过改变参数字典中keyword值以及pageIndex的值即可完成对不同城市的查询以及翻页操作。
项目代码
# -*- coding: utf-8 -*- # @author: QIN # @time: 2021/1/11 12:36 # @function : import requests import jsonif __name__ == '__main__': url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword' header = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'} keyword = input('输入查询城市名称:') params = {'cname': '', 'pid': '', 'keyword': keyword, 'pageIndex': '1', 'pageSize': '10' } res = requests.post(url=url, data=https://www.it610.com/article/params, headers=header) text_obj = res.text filename = keyword +'.json' fp = open(filename, 'w', encoding='utf-8') json.dump(text_obj, fp=fp, ensure_ascii=False) print('查询结果保存成功')

这里只做了不同城市的动态查询,下面对程序进行检验
检验 输入武汉,将保存的json文件通过json解析器解析
{
“Table”: [{
“rowcount”: 13
}],
“Table1”: [{
“rownum”: 1,
“storeName”: “武汉徐东”,
“addressDetail”: “徐东大街18号销品茂一层”,
“pro”: “Wi-Fi,点唱机,礼品卡,生日餐会”,
“provinceName”: “湖北省”,
“cityName”: “武汉市”
}, {
“rownum”: 2,
“storeName”: “光谷”,
“addressDetail”: “珞瑜路456号武汉光谷国际商会大厦1-2层”,
“pro”: “Wi-Fi,礼品卡”,
“provinceName”: “湖北省”,
“cityName”: “武汉市”
}, {
“rownum”: 3,
“storeName”: “武大”,
“addressDetail”: “珞珈山路19号武汉大学正门对面中商平价一楼”,
“pro”: “Wi-Fi,点唱机,礼品卡”,
“provinceName”: “湖北省”,
“cityName”: “武汉市”
}, {
“rownum”: 4,
“storeName”: “武展”,
“addressDetail”: “解放大道696号武汉国际会展中心负一楼西下沉式广场”,
“pro”: “Wi-Fi,点唱机,礼品卡”,
“provinceName”: “湖北省”,
“cityName”: “武汉市”
}, {
“rownum”: 5,
“storeName”: “武汉站”,
“addressDetail”: “武汉火车站东出站口”,
“pro”: “Wi-Fi,礼品卡”,
“provinceName”: “湖北省”,
“cityName”: “武汉市”
}, {
“rownum”: 6,
“storeName”: “武汉火车站二”,
“addressDetail”: “武汉火车站西站广场”,
“pro”: “Wi-Fi”,
“provinceName”: “湖北省”,
“cityName”: “武汉市”
}, {
“rownum”: 7,
“storeName”: “T3到达”,
“addressDetail”: “武汉天河机场3号航站楼到达层A出口”,
“pro”: “Wi-Fi,机场店”,
“provinceName”: “湖北省”,
“cityName”: “武汉市”
}, {
“rownum”: 8,
“storeName”: “T3出发”,
“addressDetail”: “武汉天河机场3号航站楼出发层(禁区内)”,
“pro”: “Wi-Fi,点唱机,机场店”,
“provinceName”: “湖北省”,
“cityName”: “武汉市”
}, {
“rownum”: 9,
“storeName”: “奥山甜品站”,
“addressDetail”: “青山区和平大道809号罗家港路口武汉奥山世纪广场一层G1053号商铺”,
“pro”: null,
“provinceName”: “湖北省”,
“cityName”: “武汉市”
}, {
“rownum”: 10,
“storeName”: “中弘”,
“addressDetail”: “涧西区武汉路以东、联盟路以北、康滇路以西、规划路以南中弘范特区一层”,
“pro”: “Wi-Fi,店内参观,生日餐会”,
“provinceName”: “河南省”,
“cityName”: “洛阳市”
}]
}
【python|Python学习记录-项目案例实现(爬虫篇 03)】python|Python学习记录-项目案例实现(爬虫篇 03)
文章图片

可见文件中的内容与网站查询到的结果相同,即本案例完成!
(这里大家可以看到出现了河南省洛阳市的字样,为什么会这样我也不清楚,如果有清楚的大佬欢迎指出!感激不尽!!)

    推荐阅读