Ps : 參考博文 https://blog.csdn.net/qq_38330148/article/details/113930949
一、需求分析
- 需求 :通過輸入關鍵字對肯德基餐廳信息進行爬取
- 分析 :
1、如圖所示,搜索肯德基網站的首頁,會發現最下面的功能欄中有餐廳查詢一欄,點擊進入會出現圖2中的頁面,我們可以在搜索欄中輸入想要查詢信息的城市名稱,即可出現該城市的KFC餐廳相關信息
2、比如說,我們輸入北京進行搜素,該頁面便會出現大量在北京的KFC餐廳信息,包括名稱、地址、餐廳詳情等等;我們的需求就是通過輸入城市關鍵字,搜索該城市的相關KFC餐廳信息。在這里,細心的小伙伴會發現,當我們在搜索欄輸入城市進行查詢時,會發現其實地址欄的url並未改變,那應該很快反應到,這個信息頁面應該就是ajax響應了。
3、於是F12打開開發者模式,就可以發現在根據城市搜索信息時確實會有XHR的請求響應,並且發現這是個POST請求,並且其中有5個請求參數,其中有個keyword的參數,很明顯這就是用戶搜索的城市關鍵字,在代碼實現時我們只需將此參數進行封裝請求即可,同時pageIndex和pageSize表示信息展示的起始頁和頁面數,這個可以自行控制。
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不同,因此該顯式的參數無法或缺,否則數據請求將無法完成。