资讯专栏INFORMATION COLUMN

【Python爬虫】手把手带你爬下肯德基官网(ajax的post请求)

WelliJhon / 1791人阅读

摘要:准备工作查看肯德基官网的请求方法请求。判断得肯德基官网是请求通过这两个准备步骤,明确本次爬虫目标的请求肯德基官网获取上海肯德基地点前页。构造不难发现,肯德基官网的的一个共同点,我们把它保存为。

准备工作

查看肯德基官网的请求方法:post请求。
X-Requested-With: XMLHttpRequest 判断得肯德基官网是ajax请求

通过这两个准备步骤,明确本次爬虫目标:
ajax的post请求肯德基官网 获取上海肯德基地点前10页。

分析

获取上海肯德基地点前10页,那就需要先对每页的url进行分析。

第一页

# page1# http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname# POST# cname: 上海# pid:# pageIndex: 1# pageSize: 10

第二页

# page2# http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname# POST# cname: 上海# pid:# pageIndex: 2# pageSize: 10

第三页依次类推。

程序入口

首先回顾urllib爬取的基本操作:

# 使用urllib获取百度首页的源码import urllib.request# 1.定义一个url,就是你要访问的地址url = "http://www.baidu.com"# 2.模拟浏览器向服务器发送请求 response响应response = urllib.request.urlopen(url)# 3.获取响应中的页面的源码 content内容# read方法 返回的是字节形式的二进制数据# 将二进制数据转换为字符串# 二进制-->字符串  解码 decode方法content = response.read().decode("utf-8")# 4.打印数据print(content)
  1. 定义一个url,就是你要访问的地址
  2. 模拟浏览器向服务器发送请求 response响应
  3. 获取响应中的页面的源码 content内容
if __name__ == "__main__":    start_page = int(input("请输入起始页码: "))    end_page = int(input("请输入结束页码: "))    for page in range(start_page, end_page+1):        # 请求对象的定制        request = create_request(page)        # 获取网页源码        content = get_content(request)        # 下载数据        down_load(page, content)

对应的,我们在主函数中也类似声明方法。

url组成数据定位

爬虫的关键在于找接口。对于这个案例,在预览页可以找到页面对应的json数据,说明这是我们要的数据。

构造url

不难发现,肯德基官网的url的一个共同点,我们把它保存为base_url

base_url = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname"

参数

老样子,找规律,只有’pageIndex’和页码有关。

    data = {        "cname": "上海",        "pid": "",        "pageIndex": page,        "pageSize": "10"    }

post请求

  • post请求的参数 必须要进行编码

data = urllib.parse.urlencode(data).encode("utf-8")

  • 编码之后必须调用encode方法

  • 参数放在请求对象定制的方法中:post的请求的参数,是不会拼接在url后面的,而是放在请求对象定制的参数中

所以将data进行编码

data = urllib.parse.urlencode(data).encode("utf-8")

标头获取(防止反爬的一种手段)


即 响应头中UA部分。

User Agent,用户代理,特殊字符串头,使得服务器能够识别客户使用的操作系统及版本,CPU类型,浏览器及版本,浏览器内核,浏览器渲染引擎,浏览器语言,浏览器插件等。

 headers = {        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Edg/94.0.992.38"    }

请求对象定制

参数,base_url,请求头都准备得当后,就可以进行请求对象定制了。

 request = urllib.request.Request(base_url,  headers=headers, data=data)

获取网页源码

把request请求作为参数,模拟浏览器向服务器发送请求 获得response响应。

 response = urllib.request.urlopen(request)    content = response.read().decode("utf-8")

获取响应中的页面的源码,下载数据

使用 read()方法,得到字节形式的二进制数据,需要使用 decode进行解码,转换为字符串。

content = response.read().decode("utf-8")

然后我们将下载得到的数据写进文件,使用 with open() as fp 的语法,系统自动关闭文件。

def down_load(page, content):    with open("kfc_" + str(page) + ".json", "w", encoding="utf-8") as fp:        fp.write(content)

全部代码

# ajax的post请求肯德基官网 获取上海肯德基地点前10页# page1# http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname# POST# cname: 上海# pid:# pageIndex: 1# pageSize: 10# page2# http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname# POST# cname: 上海# pid:# pageIndex: 2# pageSize: 10import urllib.request, urllib.parsedef create_request(page):    base_url = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname"    data = {        "cname": "上海",        "pid": "",        "pageIndex": page,        "pageSize": "10"    }    data = urllib.parse.urlencode(data).encode("utf-8")    headers = {        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Edg/94.0.992.38"    }    request = urllib.request.Request(base_url, headers=headers, data=data)    return requestdef get_content(request):    response = urllib.request.urlopen(request)    content = response.read().decode("utf-8")    return contentdef down_load(page, content):    with open("kfc_" + str(page) + ".json", "w", encoding="utf-8") as fp:        fp.write(content)if __name__ == "__main__":    start_page = int(input("请输入起始页码: "))    end_page = int(input("请输入结束页码: "))    for page in range(start_page, end_page+1):        # 请求对象的定制        request = create_request(page)        # 获取网页源码        content = get_content(request)        # 下载数据        down_load(page, content)

爬取后结果


鞠躬!!!其实还爬过Lisa的照片,想看爬虫代码的欢迎留言 !!!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/122441.html

相关文章

  • python爬虫ajax请求

    摘要:爬虫之请求爬取豆瓣网的分页浏览请求请输入想要第几页的数据构建参数将字典转化为修改肯德基配送信息请求请输入要查询的城市请输入要查询第几页请输入要多少个 python爬虫之ajax请求 爬取豆瓣网的分页浏览get请求: import urllib.request import urllib.parse url = https://movie.douban.com/j/chart/top...

    崔晓明 评论0 收藏0
  • 【虫术】资深爬虫你爬取代理IP

    摘要:返回结果如下,接下来我们便开始爬取西刺代理,首先我们打开浏览器查看网页,并找到和端口元素的信息。爬取代理地址,代理的是西刺代理去掉可能重复的等待秒将要爬取页数的爬取好后存入数组,然后再对其中的逐一测试。 有时候在网站看小说,会莫名跳出来一个疑似机器恶意爬取,暂时无法访问这样类似的网站提示,需要刷新一下或者输入一个验证码才能重新进入,这样的情况偶有发生,相信大家都有遇到过。出现这个现象的...

    learning 评论0 收藏0
  • 【虫术】资深爬虫你爬取代理IP

    摘要:返回结果如下,接下来我们便开始爬取西刺代理,首先我们打开浏览器查看网页,并找到和端口元素的信息。爬取代理地址,代理的是西刺代理去掉可能重复的等待秒将要爬取页数的爬取好后存入数组,然后再对其中的逐一测试。 有时候在网站看小说,会莫名跳出来一个疑似机器恶意爬取,暂时无法访问这样类似的网站提示,需要刷新一下或者输入一个验证码才能重新进入,这样的情况偶有发生,相信大家都有遇到过。出现这个现象的...

    PiscesYE 评论0 收藏0
  • 把手教你写带登录NodeJS爬虫+数据展示

    摘要:可以通过传入待删除数组元素组成的数组进行一次性删除。如果后台返回的为表示登录的已失效,需要重新执行。等所有的异步执行完毕后,再执行回调函数。回调函数的参数是每个函数返回数据组成的数组。 其实在早之前,就做过立马理财的销售额统计,只不过是用前端js写的,需要在首页的console调试面板里粘贴一段代码执行,点击这里。主要是通过定时爬取https://www.lmlc.com/s/web/...

    cpupro 评论0 收藏0

发表评论

0条评论

WelliJhon

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<