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不同,因此该显式的参数无法或缺,否则数据请求将无法完成。