爬虫入门—requests模块基础之KFC餐厅信息查询
Author: Labyrinthine Leo
Init_time: 2021.02.22
Key Words: Spider
、requests库
公众号:Leo的博客城堡
1、需求分析
需求:在上一节中,我们已经巩固了ajax
页面数据的分析方法,并通过修改参数对指定类型的豆瓣排行榜影片信息进行爬取;这一节,使用同样的原理,通过输入关键字对肯德基餐厅信息进行爬取。
分析:
- 如图所示,搜索肯德基网站的首页,会发现最下面的功能栏中有餐厅查询一栏,点击进入会出现图2中的页面,我们可以在搜索栏中输入想要查询信息的城市名称,即可出现该城市的KFC餐厅相关信息。
- 比如说,我们输入
北京
进行搜素,该页面便会出现大量在北京的KFC餐厅信息,包括名称、地址、餐厅详情等等;我们的需求就是通过输入城市关键字,搜索该城市的相关KFC餐厅信息。在这里,细心的小伙伴会发现,当我们在搜索栏输入城市进行查询时,会发现其实地址栏的url
并未改变,那应该很快反应到,这个信息页面应该就是ajax
响应了。
- 于是
F12
打开开发者模式,就可以发现在根据城市搜索信息时确实会有XHR
的请求响应,并且发现这是个POST
请求,并且其中有5个请求参数,其中有个keyword
的参数,很明显这就是用户搜索的城市关键字,在代码实现时我们只需将此参数进行封装请求即可,同时pageIndex
和pageSize
表示信息展示的起始页和页面数,这个可以自行控制。
- 该请求的
response
响应结果正是指定城市的餐厅信息,只不过是json
格式,我们将其进行提取标准化即可打印显示,或者也可持久化存储(这个供读者自行完成)。 - 基础的流程已经分析清楚,接下来便可动手编码了。
2、编码
# coding : utf-8
# fun : 爬取肯德基餐厅信息
# @Author : Labyrinthine Leo
# @Time : 2021.01.30
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)
运行结果:
3、注意点
其中有几个小坑,如果不太了解会导致出现错误(当然是指按照博主分析的步骤自行编码而非直接使用源码,源码是可以直接出结果的),这里稍作解释:
- 如图所示,该异步加载页面的请求中,虽然已经包含请求参数,但是
url
中仍然有一个显式的参数,与之前的get()
方法是不同的:如果将请求参数封装到params
中,url
中即可省略;但是这里的POST
不同,因此该显式的参数无法或缺,否则数据请求将无法完成。
临渊羡鱼不如退而结网
创作不易,如果您觉得这篇文章对你有用,可以点个赞,算是对笔者的支持和激励!这里是Leo的博客城堡,以Python为核,ML&DL为主,泛之形形色色,输寥寥拙见,摄浮光掠影,讲三两故事。临渊羡鱼,不如退而结网,持续干货输出,有趣的灵魂值得你的关注!
原文可以去笔者的github
主页:https://github.com/LabyrinthineLeo/Yxs_Git_Learning_repos
查看(如果可以,点个star
也无妨呀,嘿嘿)。