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对象的方法调用或属性改变,当被监听对象发生上 ...
随机推荐
- win10下使用UEFI安装Linux Mint18
基本的配置: 型号:HP G4-2045TX CPU:i3-2370 硬盘:一块120G的SSD装了win10,efi引导:另外一块500G的HDD没有装系统,GPT格式,分了4个区 内存:6G 想法 ...
- nmon监控指标
一.NMON中的各项参数指标: SYS_SUMM:显示当前服务器的总体性能情况 Total System I/OStatistics: Avg tps during an interval:显示采集间 ...
- Python--继承、封装、多态
大概每个人在学生时代开始就使用Java了,我们一直在学习Java,但Java中总有一些概念含混不清,不论是对初级还是高级程序员都是如此.所以,这篇文章的目的就是弄清楚这些概念. 读完本文你会对这些概念 ...
- 双因子方差分析|adjusted R|强度|SSA|SSE|SST|
应用统计学 方差分析的基本假设: 组间组平均与总平均的不同是由treatment引发的.单个值与组平均的不同是由组内error引发的. 如果没有处理误差SSA=SSE,所以右尾假设如果F>1则处 ...
- 源码中TODO、FIXME和XXX的含义
前言: 今天在阅读Qt Creator的源代码时,发现一些注释中有FIXME英文单词,用英文词典居然查不到其意义! 实际上,在阅读一些开源代码时,我们常会碰到诸如:TODO.FIXME和XXX的单词 ...
- HDU-1061-Rightmost Digit(快速幂)
快速幂(本代码中的^表示次幂不是异或) Accepted 1061 0MS 1368K 679 B G++ #include "bits/stdc++.h" using names ...
- 【Java集合】试读ArrayList源码
ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAccess, ...
- python3多线程爬虫(第一卷)
多进程虽然使用方便,可以充分利用CPU,但是由于个进程之间是并行且各自有自己的数据存储,所以很难进行数据间的通信,需要接入第三方模块,现在我依旧用糗事百科讲解下多线程的应用,举个例子之前用4个进程同时 ...
- awk使用和详解
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...
- 吴裕雄--天生自然HTML学习笔记:HTML <div> 和<span>
HTML <div> 和<span> HTML 可以通过 <div> 和 <span>将元素组合起来. HTML 区块元素 大多数 HTML 元素被定义 ...