Python爬虫入门 ~ 疯狂星期四报名地点收集

201 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情

肯德基餐厅位置爬取案例

1.定位接口

image.png

点击城市按钮之后,我们可以在控制台中看到一个请求,地址为:

www.kfc.com.cn/kfccda/ashx…

该请求的方式为post,下方还有Form Data请求参数:

cname: 深圳
pid:
pageIndex: 1
pageSize: 10

拿到第一页的请求地址以及参数之后,我们再点击下一页,看看有哪些地方不一样。

第二页的请求地址为:

www.kfc.com.cn/kfccda/ashx…

请求参数为:

cname: 深圳
pid:
pageIndex: 2
pageSize: 10

对比之后可以发现,请求地址没有发生任何改变,而请求参数中,pageIndex属性由1变成了2,只有这一个参数发生变化的话那就很舒服了,话不多说,撸起袖子加油干了!

2.创建请求对象

首先,我们定义一个函数用来创建request请求对象,其中包括: urldataheaders等信息,入参为我们想要查询的页数,将其构建成一个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')

image.png

从图中可以看出发出的请求都能正常的获取到数据,到这里,我们getpost两种请求方式的基本使用都已经学完了。