开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情
肯德基餐厅位置爬取案例
1.定位接口
点击城市按钮之后,我们可以在控制台中看到一个请求,地址为:
该请求的方式为post,下方还有Form Data请求参数:
cname: 深圳
pid:
pageIndex: 1
pageSize: 10
拿到第一页的请求地址以及参数之后,我们再点击下一页,看看有哪些地方不一样。
第二页的请求地址为:
请求参数为:
cname: 深圳
pid:
pageIndex: 2
pageSize: 10
对比之后可以发现,请求地址没有发生任何改变,而请求参数中,pageIndex属性由1变成了2,只有这一个参数发生变化的话那就很舒服了,话不多说,撸起袖子加油干了!
2.创建请求对象
首先,我们定义一个函数用来创建request请求对象,其中包括: url、data、headers等信息,入参为我们想要查询的页数,将其构建成一个request对象并返回。
def create_request(page):
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'
data = urllib.parse.urlencode({
'cname': '深圳',
'pid': '',
'pageIndex': page,
'pageSize': 10
}).encode('utf-8')
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Length': '53',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': 'route-cell=ksa; ASP.NET_SessionId=jumvd2xq1o5wkj0tzbsafzji; Hm_lvt_1039f1218e57655b6677f30913227148=1670639605; Hm_lpvt_1039f1218e57655b6677f30913227148=1670647577; SERVERID=891dda8157e24744f56aa53dc4ec1dc1|1670647776|1670647575',
'Host': 'www.kfc.com.cn',
'Origin': 'http://www.kfc.com.cn',
'Referer': 'http://www.kfc.com.cn/kfccda/storelist/index.aspx',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.116 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
return urllib.request.Request(url, data, headers)
2.发起请求,获取响应
跟进传入的request对象,发出请求,拿到响应结果,记得要设置编码utf-8。
def getResponseData(request):
response = urllib.request.urlopen(request)
return response.read().decode('utf-8')
3.保存数据
将数据保存到本地
def download(data, name, type):
movies = open(name + '.' + type, 'a', encoding='utf-8')
movies.write(data)
4.效果测试
函数都定义好了之后,写一个入口方法来跑一下看吧。
if __name__ == '__main__':
startPage = int(input('请输入起始页:'))
endPage = int(input('请输入结束页:'))
for page in range(startPage, endPage + 1):
request = create_request(page)
result = getResponseData(request)
download(result, 'kfc', 'json')
从图中可以看出发出的请求都能正常的获取到数据,到这里,我们get和post两种请求方式的基本使用都已经学完了。