爬虫post哀求

小小小幸运  金牌会员 | 2024-10-14 15:48:47 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 633|帖子 633|积分 1899

爬虫post哀求

这一篇文章, 我们开始学习爬虫当中的post哀求。
在讲post哀求之前, 我们先来回顾一下get哀求。
   get哀求:
get哀求的参数有三个, get(url, headers, params), 其中, params是可写可不写的。headers是哀求头, 这个哀求头在开辟者工具内里的网络, 找到相应的哀求, 然后在末了面有个user-agent, 那个就是哀求头内里的内容, 也称之为伪装。
  咱们正式进入正题, post哀求!
   post哀求:
post哀求, 和get哀求也相似, 哀求的参数也有三个, get(url, headers, data), 其中, data是必须写的。headers也是哀求头, 这个哀求头在开辟者工具内里的网络, 找到相应的哀求, 然后在末了面有个user-agent, 那个就是哀求头内里的内容, 也称之为伪装。
  我们举个案例:
url:https://www.bkchina.cn/product/hamburg.html
我们必要爬取这个网站的信息, 在小食栏内里爬取下面小食的名字。

起首我们照旧和往常一样, 去找到相应的哀求。

我们可以发现, 这个就是我们必要找到的哀求。
这个哀求的url是https://www.bkchina.cn/product/productList
好, 那我们就结合这个案例, 去讲解怎样使用post哀求
代码:
  1. # 所有商品的url
  2. url = 'https://www.bkchina.cn/product/productList'
  3. import requests
  4. # 第1个参数:url 目标网址
  5. # 第2个参数:data post请求的参数
  6. # 一般post请求都需要带上参数,参数不会直接跟在url后面
  7. # 从载荷中看post请求的参数:
  8. # 表单数据:定义字典,保存参数
  9. headers = {
  10.     'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'
  11. }
  12. # 定义字典,保存参数
  13. data = {
  14.     'type':'snack'
  15. }
  16. res = requests.post(url,headers=headers,data=data)
  17. # print(res.text)
  18. # 获取响应的内容 交给res_data保存
  19. res_data = res.json()
  20. count = 1
  21. for i in res_data['小食']:
  22.     print(count,i['FName'])
复制代码
结果:

我们乐成的爬取到了我们想要的数据。
表明一下那个data内里的参数是从那里来的?
答案: 我们在对应的哀求内里找到载荷, 内里就能够看到参数了。所有data = {“type”: “snack”}是这么来的。

我们完满一下上面的代码:
我们不但必要爬取到小食的名称, 我们还想爬取那个食物对应的简介。
我们点击洋葱圈, 然后再页面的右边有串文字, 就是对该食品的介绍。

我们照旧一样, 打开开辟者工具:
找到对应的哀求叫detail

这个哀求的url是https://www.bkchina.cn/product/detail
这个哀求的载荷是proId: 23。那我们哀求的时间就要加上data={“proId”: 23}。
代码:
  1. # 所有商品的url
  2. url = 'https://www.bkchina.cn/product/productList'
  3. # 商品的详情页的url
  4. d_url = 'https://www.bkchina.cn/product/detail'
  5. import requests
  6. # 第1个参数:url 目标网址
  7. # 第2个参数:data post请求的参数
  8. # 一般post请求都需要带上参数,参数不会直接跟在url后面
  9. # 从载荷中看post请求的参数:
  10. # 表单数据:定义字典,保存参数
  11. headers = {
  12.     'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'
  13. }
  14. # 定义字典,保存参数
  15. data = {
  16.     'type':'snack'
  17. }
  18. res = requests.post(url,headers=headers,data=data)
  19. # print(res.text)
  20. # 获取响应的内容 交给res_data保存
  21. res_data = res.json()
  22. count = 1
  23. for i in res_data['小食']:
  24.     print(count,i['FName'])
  25.     count+=1
  26.     # 基于每一个食物获取到它的介绍词?这个请求应该写在哪里?
  27.     # 只能获取到编号为27的商品详情数据
  28.     # d_data = {
  29.     #     'proId':27
  30.     # }
  31.     # 每循环一次拿到一个商品,就需要额外获取当前循环的商品id
  32.     # post请求的参数,浏览器的载荷
  33.     d_data = {
  34.         'proId': i['FId']
  35.     }
  36.     d_res = requests.post(d_url,data=d_data)
  37.     # 详情页数据
  38.     d_res_data = d_res.json()
  39.     # 获取介绍词
  40.     print(d_res_data['FDesc'])
复制代码
结果:

我们来看下这串代码是怎么回事。
  1. # post请求的参数,浏览器的载荷
  2. d_data = {
  3.   'proId': i['FId']
  4. }
复制代码
我们再打开之前哀求的url

找到相应。发现内里每一个食品都有一个FId,正好我们要传入的data内里就有FId, 那我们的思路就是把每一个食品的FId全部取出来, 正幸亏前面一个哀求的时间, 通过了一个循环, 全部取出来了。
实战:
1- 点击某个详细地点,获取当前详细地点下的所有麦当劳的餐厅
2- 完满:根据搜索的关键字获取所有详细地点下的所有麦当劳的餐厅
必要爬取的网页的网址:https://www.mcdonalds.com.cn/top/map(这是一个麦当劳餐厅)
先不要看答案, 自己实验先做一做哦。
参考答案:
题1.
例:

输入浙江, 浙江萧山医院点进去

爬取红色框内里的信息(也就是麦当劳的详细地点)。
代码:
  1. import requests
  2. url = 'https://www.mcdonalds.com.cn/ajaxs/search_by_point'
  3. header = {
  4.     "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
  5. }
  6. data = {
  7.     "point": "30.183907,120.279628"
  8. }
  9. response = requests.post(url, headers=header, data=data)
  10. print(response.json())
  11. res_data = response.json()
  12. for i in res_data['data']:
  13.     print(i["address"])
复制代码
结果:

题2:
在控制台输入关键字地区, 返回地点(这个地点相当于在网页搜索出来的全部详细地点, 一个关键字能够搜索10个地区, 每一个地区内里都有很多个麦当劳的详细地点)。
代码:
  1. import requests
  2. url = "https://www.mcdonalds.com.cn/ajaxs/search_by_keywords"
  3. d_url = 'https://www.mcdonalds.com.cn/ajaxs/search_by_point'
  4. headers = {
  5.     "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
  6. }
  7. location = input("请输入关键字地址:")
  8. data = {
  9.     "keywords": location,
  10.     "city": "杭州市",
  11.     "location[info]": "OK",
  12.     "location[position][lng]": 120.26457,
  13.     "location[position][lat]": 30.18534
  14. }
  15. response = requests.post(url, headers=headers, data=data)
  16. # print(response.json())
  17. res_data = response.json()
  18. print(f"{location}的麦当劳餐厅的地址:")
  19. for i in res_data['data']:
  20.     # 纬度
  21.     lat = i['location']['lat']
  22.     # 经度
  23.     lng = i['location']['lng']
  24.     d_data = {
  25.         "point": f"{lat},{lng}"
  26.     }
  27.     response = requests.post(d_url, headers=headers, data=d_data)
  28.     d_res_data = response.json()
  29.     for i in d_res_data['data']:
  30.         # 地址
  31.         print(i['address'])
复制代码
结果:

我们去对比一下, 和搜索框搜出来的所有地区以及地区所对应的详细地点是一样的, 这就说明我们乐成的爬取到了每一个地区内里的麦当劳的详细地点。
对照一下网页上面搜索的详细地点信息(部门数据对比):

我们发现, 是逐一对应的, 这就能够证明, 我们爬虫爬取到的信息是正确的。
这个实战题你写出来了吗?假如写出来的话, 给自己一个掌声哦。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小小小幸运

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表