Python学习记录-项目案例实现:爬虫篇 03

项目来源

本项目来源B站UP主路飞学城视频:视频链接点这里

项目需求

利用爬虫爬取全国不同城市的肯德基餐厅信息

具体分析

1. 指定URL

项目用到的URL为肯德基餐厅地址查询,点击打开后跳转至该页面。通过抓包工具对整张页面发请求,查看拿到的响应数据发现没有任何信息,可见在本需求下,不再是对整张页面发请求,而是对局部数据的提取。随意输入一个城市名称进行查询,此处以’武汉’为例,观察上方URL没有发生变化且页面也没有跳转,初步估计获取的信息是ajax请求到的。打开抓包工具的ajax请求界面,拿到一个数据包如下:
通过抓包工具抓取的数据包
数据包中表明该请求为一个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=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 json


if __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=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”: “洛阳市”
}]
}

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值