requests模块之KFC餐厅信息查询

Ps : 参考博文 https://blog.csdn.net/qq_38330148/article/details/113930949

一、需求分析

  • 需求 :通过输入关键字对肯德基餐厅信息进行爬取
  • 分析 :
    1、如图所示,搜索肯德基网站的首页,会发现最下面的功能栏中有餐厅查询一栏,点击进入会出现图2中的页面,我们可以在搜索栏中输入想要查询信息的城市名称,即可出现该城市的KFC餐厅相关信息
    image
    image
    2、比如说,我们输入北京进行搜素,该页面便会出现大量在北京的KFC餐厅信息,包括名称、地址、餐厅详情等等;我们的需求就是通过输入城市关键字,搜索该城市的相关KFC餐厅信息。在这里,细心的小伙伴会发现,当我们在搜索栏输入城市进行查询时,会发现其实地址栏的url并未改变,那应该很快反应到,这个信息页面应该就是ajax响应了。
    image
    3、于是F12打开开发者模式,就可以发现在根据城市搜索信息时确实会有XHR的请求响应,并且发现这是个POST请求,并且其中有5个请求参数,其中有个keyword的参数,很明显这就是用户搜索的城市关键字,在代码实现时我们只需将此参数进行封装请求即可,同时pageIndex和pageSize表示信息展示的起始页和页面数,这个可以自行控制。
    image
    image
    4、该请求的response响应结果正是指定城市的餐厅信息,只不过是json格式,我们将其进行提取标准化即可打印显示,或者也可持久化存储(这个供读者自行完成)。
    5、基础的流程已经分析清楚,接下来便可动手编码了。

二、关键字对肯德基餐厅进行爬取编码

  • 编码
# coding  : utf-8
import requests
import json

def KFC_spider(url=None, keyword='北京'):
    """
    根据关键字爬取KFC餐厅信息
    :param url: url链接
    :param keyword: 地址关键字
    :return:
    """
    if url is None:
        print("url should not be None!")
        return
    # 1.指定url
    url = url
    # 2.UA伪装
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
    }
    # 3.设置请求参数
    params = {
        'cname': '',
        'pid': '',
        'keyword': keyword,
        'pageIndex': '1',
        'pageSize': '10'
    }
    # 4.发送请求
    response = requests.post(url=url, data=params, headers=headers)
    # 5.获取响应数据
    page_text = response.json()
    # 持久化存储
    fileName = keyword + ".json"
    fp = open(fileName, 'w', encoding='utf-8')
    json.dump(page_text, fp=fp, ensure_ascii=False)
    for data in page_text["Table1"]:
        print("序号:{}, 店名:{}, 地址:{}, 信息:{}".format(data["rownum"], data["storeName"], data["addressDetail"], data["pro"]))
    print("{}KFC餐厅信息爬取成功!".format(keyword))

if __name__ == '__main__':
    # 指定url
    url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
    # 输入地址关键字
    keyword = input("enter your address want to search:")
    # 爬取餐厅信息
    KFC_spider(url, keyword)
  • 执行结果
enter your address want to search:乐亭
序号:1, 店名:乐亭大东方, 地址:乐亭县城区中心社区金融街以北、发展大道以西大东方购物广场一层101号, 信息:Wi-Fi,店内参观
序号:2, 店名:乐亭大东方, 地址:乐亭县城区中心社区金融街以北、发展大道以西大东方购物广场一层101号, 信息:Wi-Fi,店内参观
乐亭KFC餐厅信息爬取成功!
  • 注意项 :
    如图所示,该异步加载页面的请求中,虽然已经包含请求参数,但是url中仍然有一个显式的参数,与之前的get()方法是不同的:如果将请求参数封装到params中,url中即可省略;但是这里的POST不同,因此该显式的参数无法或缺,否则数据请求将无法完成。
    image
posted @ 2021-05-03 14:07  SRE运维充电站  阅读(959)  评论(0编辑  收藏  举报