scrapy post payload的坑及相关知识的补充【POST传参方式的说明及scrapy和requests实现】
一、问题及解决:
在用scrapy发送post请求时,把发送方式弄错了。
本来应该是 application/x-www-form-urlencoded 弄成了application/json。
但需要改两部分:body传入字典的构造方式和header的Content-Type内容
请求截图:

代码部分:(红色部分是原来错误的代码,绿色的是修改正确的,黄色是修改的地方)

二、POST传参方式的说明及scrapy和requests实现:
1、application/x-www-form-urlencoded
如果不设置Content-type,默认为该方式,提交的数据按照 key1=val1&key2=val2 的方式进行编码。
- requests :
# -*- encoding:UTF-8 -*-
import requests
import sys # 根据python版本,引入包
if sys.version_info[0] > 2:
from urllib.parse import urlencode
else:
from urllib import urlencode url = "http://xxxx.com"
payload_dict = {'aaa': ''}
data = urlencode(payload_dict)
headers = {'Content-Type': "application/x-www-form-urlencoded"} response = requests.request("POST", url, data=payload_dict, headers=headers)
print(response.text)
- scrapy:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sysif sys.version_info[0] > 2:
from urllib.parse import urlencode
else:
from urllib import urlencode payload_dict = {'page': 1} # 使用普通request方法,需要将数据的字典进行url编码,传入body
yield scrapy.Request(url=url,
method='POST',
body=urlencode(payload_dict),
headers={'Content-Type': 'application/x-www-form-urlencoded'},
callback=self.parse,
dont_filter=True) # 使用scrapy自带的post请求方法,将字典直接传入formdata,默认会对其进行编码
yield scrapy.FormRequest(url=i,
method='POST',
formdata=payload_dict,
headers={'Content-Type': 'application/x-www-form-urlencoded'},
callback=self.parse)
2、application/json:
请求所需参数以json的数据格式写入body中,后台也以json格式进行解析。
- requests
# -*- encoding:UTF-8 -*-
import requests
import json url = "https://xxxx.com"
# 需要发送的参数
payload = {'page': 1, 'branch': 'guide'}
headers = {'Content-Type': "application/json"} # 将参数转为json格式传入
response = requests.request("POST", url, data=json.dumps(payload_dict), headers=headers)
print(response.json())
- scrapy
# -*- coding: utf-8 -*-
import json
import scrapy data_raw = {
"query": "coronavirus ",
"queryExpression": "",
"filters": [
"Y>=1978",
"Y<=1978"
],
"orderBy": 0,
"skip": 0,
"sortAscending": 'true',
"take": 10,
"includeCitationContexts": 'true',
"profileId": ""
} url = 'https://academic.microsoft.com/api/search' # body传入json格式参数
yield Request(url, method="POST", body=json.dumps(data_raw),
headers={'Content-Type': 'application/json'},
callback=self.parse)
3、multipart/form-data:用于上传表单位文件。
4、text/xml:现在基本不用( 因为XML 结构过于臃肿,一般场景用 JSON 会更灵活方便)。
scrapy post payload的坑及相关知识的补充【POST传参方式的说明及scrapy和requests实现】的更多相关文章
- 爬虫scrapy组件 请求传参,post请求,中间件
post请求 在scrapy组件使用post请求需要调用 def start_requests(self): 进行传参再回到 yield scrapy.FormRequest(url=url,form ...
- body传参?parameter传参?Request Payload?Query String Parameter?
今天,是有委屈的一天:今天,是有小情绪的一天.所以,我们要对今天进行小结,跟它做一个了断! 今天,后端来一个接口,告诉我"要用post请求,parameter形式传参".over. ...
- JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识
JAVA WEB快速入门系列之前的相关文章如下:(文章全部本人[梦在旅途原创],文中内容可能部份图片.代码参照网上资源) 第一篇:JAVA WEB快速入门之环境搭建 第二篇:JAVA WEB快速入门之 ...
- 二、python框架相关知识体系
Django框架 1.django框架.flask框架和Tornado框架的区别? django框架,内置组件多,自身功能强大,是一个大而全的框架,ORM.Admin.中间件.Form.ModelFr ...
- 一张思维导图带你梳理HashMap相关知识
HashMap可以说是java中最常见也是最重要的key-value存储结构类,很多程序员可能经常用,但是不一定清楚这个类背后的数据结构和相关操作原理,为了复习HashMap相关的知识,今天花了一天的 ...
- 微信小程序必知相关知识
微信小程序必知相关知识 1 请谈谈微信小程序主要目录和文件的作用? project.config.json 项目配置文件,用得最多的就是配置是否开启https校验: App.js 设置一些全局的基础数 ...
- 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸
类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...
- 移动WEB像素相关知识
了解移动web像素的知识,主要是为了切图时心中有数.本文主要围绕一个问题:怎样根据设备厂商提供的屏幕尺寸和物理像素得到我们切图需要的逻辑像素?围绕这个问题以iphone5为例讲解涉及到的web像素相关 ...
- listener监听器的相关知识
从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...
随机推荐
- java代码实现数据源切换(连接池简单粗暴)
--最佳实践配置(.yml) gs.oracle: #driverClassName: oracle.jdbc.driver.OracleDriver driverClassName: oracle. ...
- E. Alice and the Unfair Game(推导线段树)
题:https://codeforces.com/contest/1236/problem/E 粗自:https://www.cnblogs.com/YSFAC/p/11715522.html #in ...
- 混合欧拉回路poj 1637 Sightseeing tour
把该图的无向边随便定向,计算每个点的入度和出度.如果有某个点出入度之差为奇数,那么肯定不存在欧拉回路.因为欧拉回路要求每点入度 = 出度,也就是总度数为偶数,存在奇数度点必不能有欧拉回路: 好了,现在 ...
- day25-网络基础
# 一.子网掩码: # 1. 作用是划分子网,就是将某个ip地址划分成网络地址和主机地址两部分. # 形式上等同于ip地址,也是一个32位二进制数, # 如果它的网络部分(前24位)全为1,主机部分( ...
- .net core ioc
-------------------------------------- 2. ---------------------------- -----------aop
- 感叹号在Linux bash中使用技巧
1. 重复执行上一条指令 !! [root@iZ23t6nzr7dZ python]# ls /usr/local/ aegis bin etc games include lib lib64 li ...
- n的m划分
n的m划分: dp[i][j]表示j的i划分,也就是将j颗球放入i个袋子里面,最后的答案是dp[m][n] 状态转移方程为dp[i][j]=dp[i-1][j]+dp[i][j-i]; 划分方法有两种 ...
- CentOS-SendMail服务
title date tags layout music-id CentOS6.5 SendMail服务安装与配置 2018-09-04 Centos6.5服务器搭建 post 456272749 一 ...
- 64)PHP,变量的生命周期
在20day 05 假如我目前在的地址是上面的那个index.php?p=back&c=Admin&a=check 这个请求里面申请的所有事 或者是你申请的所有变量或者是全局变量都 ...
- RHCE考试(Linux7)
博主本人平和谦逊,热爱学习,读者阅读过程中发现错误的地方,请帮忙指出,感激不尽 一.环境模拟 * server0.example.com :172.25.0.11 * desktop0.example ...