爬虫post请求

爬虫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请求
代码:

# 所有商品的url
url = 'https://www.bkchina.cn/product/productList'
import requests
# 第1个参数:url 目标网址
# 第2个参数:data post请求的参数
# 一般post请求都需要带上参数,参数不会直接跟在url后面
# 从载荷中看post请求的参数:
# 表单数据:定义字典,保存参数
headers = {'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'
}
# 定义字典,保存参数
data = {'type':'snack'
}
res = requests.post(url,headers=headers,data=data)
# print(res.text)
# 获取响应的内容 交给res_data保存
res_data = res.json()
count = 1
for i in res_data['小食']:print(count,i['FName'])

结果:

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

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

我们还是一样, 打开开发者工具:
找到对应的请求叫detail

这个请求的url是https://www.bkchina.cn/product/detail
这个请求的载荷是proId: 23。那我们请求的时候就要加上data={“proId”: 23}。

代码:

# 所有商品的url
url = 'https://www.bkchina.cn/product/productList'
# 商品的详情页的url
d_url = 'https://www.bkchina.cn/product/detail'
import requests
# 第1个参数:url 目标网址
# 第2个参数:data post请求的参数
# 一般post请求都需要带上参数,参数不会直接跟在url后面
# 从载荷中看post请求的参数:
# 表单数据:定义字典,保存参数
headers = {'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'
}
# 定义字典,保存参数
data = {'type':'snack'
}
res = requests.post(url,headers=headers,data=data)
# print(res.text)
# 获取响应的内容 交给res_data保存
res_data = res.json()
count = 1
for i in res_data['小食']:print(count,i['FName'])count+=1# 基于每一个食物获取到它的介绍词?这个请求应该写在哪里?# 只能获取到编号为27的商品详情数据# d_data = {#     'proId':27# }# 每循环一次拿到一个商品,就需要额外获取当前循环的商品id# post请求的参数,浏览器的载荷d_data = {'proId': i['FId']}d_res = requests.post(d_url,data=d_data)# 详情页数据d_res_data = d_res.json()# 获取介绍词print(d_res_data['FDesc'])

结果:

我们来看下这串代码是怎么回事。

# post请求的参数,浏览器的载荷
d_data = {'proId': i['FId']
}

我们再打开之前请求的url

找到响应。发现里面每一个食品都有一个FId,正好我们要传入的data里面就有FId, 那我们的思路就是把每一个食品的FId全部取出来, 正好在前面一个请求的时候, 通过了一个循环, 全部取出来了。

实战:
1- 点击某个详细地址,获取当前详细地址下的所有麦当劳的餐厅
2- 完善:根据搜索的关键字获取所有详细地址下的所有麦当劳的餐厅
需要爬取的网页的网址:https://www.mcdonalds.com.cn/top/map(这是一个麦当劳餐厅)
先不要看答案, 自己尝试先做一做哦。

参考答案:

题1.
例:

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

爬取红色框里面的信息(也就是麦当劳的详细地址)。
代码:

import requestsurl = 'https://www.mcdonalds.com.cn/ajaxs/search_by_point'
header = {"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"
}
data = {"point": "30.183907,120.279628"
}
response = requests.post(url, headers=header, data=data)
print(response.json())
res_data = response.json()
for i in res_data['data']:print(i["address"])

结果:

题2:
在控制台输入关键字地区, 返回地址(这个地址相当于在网页搜索出来的全部详细地址, 一个关键字能够搜索10个地区, 每一个地区里面都有很多个麦当劳的详细地址)。
代码:

import requestsurl = "https://www.mcdonalds.com.cn/ajaxs/search_by_keywords"
d_url = 'https://www.mcdonalds.com.cn/ajaxs/search_by_point'
headers = {"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"
}
location = input("请输入关键字地址:")
data = {"keywords": location,"city": "杭州市","location[info]": "OK","location[position][lng]": 120.26457,"location[position][lat]": 30.18534
}
response = requests.post(url, headers=headers, data=data)
# print(response.json())
res_data = response.json()
print(f"{location}的麦当劳餐厅的地址:")
for i in res_data['data']:# 纬度lat = i['location']['lat']# 经度lng = i['location']['lng']d_data = {"point": f"{lat},{lng}"}response = requests.post(d_url, headers=headers, data=d_data)d_res_data = response.json()for i in d_res_data['data']:# 地址print(i['address'])

结果:

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

我们发现, 是一一对应的, 这就能够证明, 我们爬虫爬取到的信息是正确的。

这个实战题你写出来了吗?如果写出来的话, 给自己一个掌声哦。👏

以上就是爬虫post请求的所有内容了, 如果有哪里不懂的地方,可以把问题打在评论区, 欢迎大家在评论区交流!!!
如果我有写错的地方, 望大家指正, 也可以联系我, 让我们一起努力, 继续不断的进步.
学习是个漫长的过程, 需要我们不断的去学习并掌握消化知识点, 有不懂或概念模糊不理解的情况下,一定要赶紧的解决问题, 否则问题只会越来越多, 漏洞也就越老越大.
人生路漫漫, 白鹭常相伴!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/448215.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

merlion的dashboard打开方法

安装好merlion包后,在anaconda prompt中进行如下图操作: 先进入创建好的虚拟环境:conda activate merlion再执行命令:python -m merlion.dashboard在浏览器中手动打开图中的地址: http://127.0.0.1:8050 打开后的界面…

Qt- QSS风格选择器常用属性选择器样式表盒子

1. 风格设置 Qt 提供了 3 种整体风格,使用 QStyleFactory::keys() 来获取 (windowsvista 、Windows 、Fusion) 可以在 main.cpp 中调用 setStyle 方法对应用程序进行全局风格的设置 int main(int argc, char *argv[]) {QApplication a(arg…

ElasticSearch+Kibana 8.1.0安装部署

Windows环境 通过百度网盘分享的文件:ElasticSearchKibanaik 链接:https://pan.baidu.com/s/14Bf9AkRjf5igaa10e18OWA?pwd1rmh 提取码:1rmh 下载后解压 命令都在bin目录下用cmd执行 一、ElasticSearch 注意:8.1.0自带jdk17&…

2024版51单片机教程

一、教程简介 前置基础

Linux云计算 |【第五阶段】ARCHITECTURE-DAY1

主要内容: 了解ELK分布式日志分析系统、Elasticsearch分布式集群搭建、Kibana搭建、使用kibana展示数据; 一、日志分析系统ELK概述 ELK 是 Elasticsearch、Logstash 和 Kibana 的缩写,是三款软件都是开源软件,通常是配合使用&am…

CentOS7安装Mysql5.7(ARM64架构)

1.第一步:下载 arm 版本离线 mysql 5.7 安装包 arm 版本离线 mysql 5.7 安装包 2.第二步:查询并卸载 CentOS 自带的数据库 Mariadb 找到数据库 mariadb,如果有会给出一个结果,结果是 mariadb 名称 rpm -qa | grep mariadb 如果…

64页精品PPT | 汽车经销商数据应用解决方案

汽车经销商正面临前所未有的盈利能力挑战。从18年起 ,传统燃油车汽车行业开始步入低速增长阶段 ,卖车已经挣不到钱 ,利润往往来自任务完成的厂家返利;新兴的直营模式的出现 ,冲击了传统授权经销的方式 ,疫情…

matlab生成任意长度余弦波coe文件以及vivado仿真

一、matlab生成任意长度余弦波coe文件 clear clc close all width32; %rom的位宽 depth3600; %rom的深度 xlinspace(0,2*pi,depth); %在一个周期内产生3600个采样点 y_coscos(x); %生成余弦数据 y_cosround(y_cos*(2^(width-1)-1))2^(width-1)-1; %将余弦数据全部转换为…

用Eclipse运行第一个Java程序

1.左键双击在桌面“软件 (文件夹)”,打开该文件夹 2.左键双击“eclipse (文件夹)”,打开该文件夹 3.左键双击“eclipse (文件夹)”,打开该文件夹 4.左键双击“eclipse.exe”,运行这个可执行程序 5.左键单击“Ok(按下按…

MySQL学习笔记(持续更新,目前到十一章锁)

1、Mysql概述 1.1 数据库相关概念 三个概念:数据库、数据库管理系统、SQL 名称全称简称数据库存储数据的仓库,数据是有组织的进行存储DataBase(DB)数据库管理系统操纵和管理数据库的大型软件DataBase Mangement System&#xf…

使用npm i报错node-sass失败问题解决

node 版本:v14.15.4 解决方法: npm config set sass_binary_sitehttps://npmmirror.com/mirrors/node-sass设置完之后,再npm i 就可以下载成功 亲测有效

视频汇聚平台EasyCVR支持云端录像丨监控存储丨录像回看丨录像计划丨录像配置

EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。平台以其强大的视频处理、汇聚与融合能力,在构建视频监控系统中展现出了独特的优势。 EasyCVR视频汇聚平台可接入传统监控行业中高清网络摄像机的RTSP…

C++ | Leetcode C++题解之第475题供暖器

题目&#xff1a; 题解&#xff1a; class Solution { public:int findRadius(vector<int>& houses, vector<int>& heaters) {sort(houses.begin(), houses.end());sort(heaters.begin(), heaters.end());int ans 0;for (int i 0, j 0; i < houses.…

【Vue】Vue3.0 (十二)、watch对ref定义的基本类型、对象类型;reactive定义的对象类型的监视使用

上篇文章&#xff1a;【Vue】Vue3.0&#xff08;十一&#xff09;Vue 3.0 中 computed 计算属性概念、使用及示例 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年10月16日12点45分 文章…

施磊C++ | 进阶学习笔记 | 5.设计模式

五、设计模式 文章目录 五、设计模式1.设计模式三大类型概述一、创建型设计模式二、结构型设计模式三、行为型设计模式 2.设计模式三大原则3.单例模式1.饿汉单例模式2.懒汉单例模式 4.线程安全的懒汉单例模式1.锁双重判断2.简洁的线程安全懒汉单例模式 5.简单工厂(Simple Facto…

2024-10-15 学习人工智能的Day7

在简单的了解完学习人工智能所需的高数、线代、概率论后&#xff0c;我们又重新开始了国庆的学习&#xff0c;因为已经有十余天没有接触python&#xff0c;所以今天的内容主要是对之前学习的python的回顾与总结&#xff0c;然后对各个部分进行了简单的实践&#xff0c;在最后学…

【无线技术】Wireless Technologies and Techniques——Antenna and Propagation

一、 天线基础 Introduction to Antenna 天线&#xff08;Antenna&#xff09;是一种设备&#xff0c;用于将电信号转换为无线电波进行传输&#xff0c;反之亦然&#xff08;用于接收&#xff09;。天线是所有无线系统的 “ 眼睛和耳朵 ” &#xff0c;负责电磁波的发射和接收。…

性能测试工具JMeter

1. JMeter介绍 环境要求&#xff1a;要求java&#xff0c;jdk版本大于8&#xff1b; Apache JMeter 是 Apache 组织基于 Java 开发的压⼒测试⼯具&#xff0c;⽤于对软件做性能测试&#xff1b; 1.1 安装JMeter 1.下载tar包&#xff0c;解压即可。 解压完成后&#xff1a; 1.2…

查缺补漏----扩展操作码

变长操作码&#xff0c;即全部指令的操作码字段的位数不固定&#xff0c;且分散地放在指令字的不同位置上。最常见的变长操作码方法是扩展操作码&#xff0c;操作码的长度随地址码的减少而增加&#xff0c;不同地址数的指令可以具有不同长度的操作码&#xff0c;从而在满足需要…

AI 编译器学习笔记之七四 -- cann接口使用

1、安装昇腾依赖 # CANN发布件地址 https://cmc.rnd.huawei.com/cmcversion/index/releaseView?deltaId10274626629404288&isSelectSoftware&url_datarun Ascend-cann-toolkit_8.0.T15_linux-aarch64.run Ascend-cann-nnal_8.0.T15_linux-aarch64.run Ascend-cann-ker…