Python爬取肯德基官网ajax的post请求实现过程

作者:Bitdancing 时间:2021-03-31 13:54:00 

Python爬取肯德基官网ajax的post请求实现过程

准备工作

查看肯德基官网的请求方法:post请求。

Python爬取肯德基官网ajax的post请求实现过程

X-Requested-With: XMLHttpRequest 判断得肯德基官网是ajax请求

Python爬取肯德基官网ajax的post请求实现过程

通过这两个准备步骤,明确本次爬虫目标:
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组成数据定位

Python爬取肯德基官网ajax的post请求实现过程

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

Python爬取肯德基官网ajax的post请求实现过程

构造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')

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

Python爬取肯德基官网ajax的post请求实现过程

Python爬取肯德基官网ajax的post请求实现过程

即 响应头中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: 10
import urllib.request, urllib.parse
def 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 request

def get_content(request):
   response = urllib.request.urlopen(request)
   content = response.read().decode('utf-8')
   return content

def 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)

爬取后结果

Python爬取肯德基官网ajax的post请求实现过程

来源:https://blog.csdn.net/Joy_Cheung666/article/details/120710070

标签:ajax,post,爬取,肯德基
0
投稿

猜你喜欢

  • python中用Scrapy实现定时爬虫的实例讲解

    2023-07-26 05:47:01
  • Python多线程正确用法实例解析

    2022-03-22 14:31:58
  • 基于Go语言实现选择排序算法及优化

    2024-04-26 17:36:34
  • python解决OpenCV在读取显示图片的时候闪退的问题

    2022-04-16 16:29:48
  • Python实现PS滤镜特效之扇形变换效果示例

    2021-05-08 17:58:03
  • 在Internet Explorer中正确使用MSXML

    2009-02-22 18:41:00
  • 使用Pandas修改DataFrame中某一列的值

    2021-04-14 14:52:21
  • PHP的mysqli_stat()函数讲解

    2023-06-12 08:11:33
  • appium+python adb常用命令分享

    2022-12-27 09:16:24
  • Access中的模糊查询

    2007-11-18 14:57:00
  • String 的扩展方法

    2008-05-12 22:36:00
  • 网站如何使用黄金分割布局

    2010-11-05 18:34:00
  • seatunnel 2.3.1全流程部署使用教程

    2022-02-01 02:38:51
  • Python sklearn中的K-Means聚类使用方法浅析

    2022-03-16 22:01:16
  • python中的bisect模块与二分查找详情

    2021-07-23 05:17:56
  • python中is与双等于号“==”的区别示例详解

    2023-07-09 22:40:19
  • Python中plt.imshow(image)无法显示图片的解决

    2022-01-12 15:33:04
  • sqlserver 2000中创建用户的图文方法

    2012-03-26 18:26:39
  • 解决SQL SERVER数据库备份时出现“操作系统错误5(拒绝访问)。BACKUP DATABASE 正在异常终止。”错误的解决办法

    2024-01-22 08:24:14
  • 利用pandas向一个csv文件追加写入数据的实现示例

    2022-04-09 14:51:56
  • asp之家 网络编程 m.aspxhome.com