肯德基餐厅地址查询
前面我们学习了破解百度翻译,知道了 AJAX 的工作原理和爬取,那么我们今天就来巩固我们的学习成果吧。
首先我们打开肯德基的官网,点击 “餐厅查询”
然后是没有地址的网页,然后我们输入地址

我们发现不论有没有搜索,网址都没有发生变化,这说明肯德基官网的地址查询是通过 AJAX 实现的,知道了这样一点我们就可以使用抓包工具进行分析了。
我们可以从抓包工具中找到请求的 url 和相对应的请求命令和数据类型。


我们发现这是一个 json 串,我们还需要像上次破解百度翻译一样先把 json 串爬取下来,再在线解析吗?答案当然是否定的,我们可以在抓包工具的 response 中得到目前的 json,然后在线解析。


欧克,那么我就可以开始写爬取肯德基餐厅地址的代码了
import requests
if __name__ == "__main__":
    # 指定 URL
    url = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword"
    # UA 伪装
    header = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"
        }
    
    # 数据
    kd = input("需要查询的地点:")
    data = {
        "cname": "",
        "pid": "", 
        "keyword": kd , # 要搜索的地址
        "pageIndex": "1" , # 要爬取的网页的页码
        "pageSize": "10" # 每一页的数量
        }
    # 发送请求
    for i in range(1, 3): # 爬取两页
        data["pageIndex"] = str(i)
        response = requests.post(url = url, data = data, headers = header).json()
        page = response["Table1"]
        # 存储
        for detail in page:
            with open("./肯德基地址.txt", "a", encoding = "utf-8") as fp:
                fp.write("storeName:" + detail["storeName"] + "\n" + "addressDetail:" + detail["addressDetail"] + "\n" + "\n")
    print("over!!!")
打开保存的文件如下

说明爬取成功