Scrapy框架第一发送POST请求遇到的小坑

前言: 爬取一个数据开发平台 悦采 网, 爬取上面的招标_采购信息。


小坑:requests能获取到内容,改成scrapy却不能获取到内容,而且请求信息之类的条件都一摸一样?

解决方式:

问题就出在headers上面:去掉 headers里面的 Content-Length 这一栏
具体原因如下:
https://stackoverflow.com/questions/42248903/scrapy-post-request-not-working-400-bad-request

首先思路,分析网站,找规律,我感觉这个是重要的一步。

1.先看看网页结构,找规律。

我们发现只要找到这个url然后请求,进入详细页面,就找到想要的数据了。


开始找规律爬取数据

我们找到了别人的api接口,里面有公司的一些相关信息,可以拼接id访问每个公司url

但是这里的url是一个post请求,而且需要Payload,我一开始没注意, 就当成普通的POST请求去使用,一直没有成功报400

这是我爬取拉钩招聘信息的时候模拟POST请求发送的数据,也成功了, 我琢磨了好久为什么,才发现POST请求 需要的是Payload 有效载荷
我百度发现要把数据转换为json数据发送

import requests
import jsonclass YuecaiSpider(object):def __init__(self):self.headers = {'Content-Type': 'application/json','Host': 'iris.yuecai.com','Origin': 'http://www.yuecai.com',# 'Referer': 'http://www.yuecai.com/purchase/?SiteID=21','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',}self.data = {"page": 0,"size": 20,"sort": None,"teseData": 2,"word": None,"zone": None,}def start_requests(self):url = "http://iris.yuecai.com/iris/v1/purchase/search"res = requests.post(url, headers=self.headers, data=json.dumps(self.data))  # 这里要转换为json数据print(res.status_code)print(res.text)if __name__ == '__main__':yuecai = YuecaiSpider()yuecai.start_requests()
  • 用requests写测试脚本的时候,一点问题没有,但是我改成scrapy后,一直没有数据。我不知道是为什么??
import scrapy
import jsonclass YuecaiSpider(scrapy.Spider):name = 'yuecai'allowed_domains = ['yuecai.com']start_urls = ['http://iris.yuecai.com/iris/v1/purchase/search']site_name = '悦采网数据平台'version = '1.0'def __init__(self):super(YuecaiSpider, self).__init__()self.headers = {# 'Accept': 'application/json, text/javascript, */*; q=0.01',# 'Accept-Encoding': 'gzip, deflate',# 'Accept-Language': 'zh-CN,zh;q=0.9',# 'Connection': 'keep - alive',# 'Content - Length': '69','Content-Type': 'application/json','Host': 'iris.yuecai.com','Origin': 'http://www.yuecai.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',}self.data = {'word': None,   # 'NULL''zone': None,    # 注意这边特别坑的  有的就是需要'null'这种数据'page': '1',     # 参数该用字符用字符'size': '20',    # 'sort': None,'teseData': '2',}def start_requests(self):url = "http://iris.yuecai.com/iris/v1/purchase/search"yield scrapy.Request(url,method="POST",headers=self.headers,body=json.dumps(self.data),   # 这边数据也是要转换成json数据dont_filter=True,callback=self.parse,)def parse(self, response):print("*" * 50)print(response.status)print(response.text)print("*" * 50)

Scrapy 关于headers参数注意

# 有时候明明 requests 或者 postman 请求都是正常的, 但是改成scrapy就不行了,
# 原因往往出在headers里面,我不确定是不是scrapy做了过滤之类的操作,但是把不必要的参数注释就好了
# 写爬虫的话一定要对http协议有了解,知道headers里面那些参数什么意思,
# 比如referer (其实历史拼错的单词) 意思是从那个链接跳转来的,常用于图片等媒体资源防盗链,推荐一本名叫《图解http》的书
headers = {'Accept': 'application/json, text/javascript, */*; q=0.01',# 'Accept-Encoding': 'gzip, deflate',     #  注释# 'Accept-Language': 'zh-CN,zh;q=0.9',  # 注释# 'Connection': 'keep - alive',     # 注释# 'Content - Length': '69',   #  务必要注释掉 'Content-Type': 'application/json',   'Host': 'iris.yuecai.com','Origin': 'http://www.yuecai.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',}

把上面的请求的参数加了引号, 需要’null’的改成None(但是有的网站POST请求参数就是’null’)
好吧看看我运行的结果把。

2018/11/29 更新

评论那位小哥! 我在我电脑上测试 没有问题, 由于评论下面贴代码,格式很乱,我就贴在文章里面了,效果图如下。

测试代码如下:

# -*- coding:utf-8 -*-
# @Author: wg
# @Time: 2018/11/29 15:02
# @Desc:
""""""
import scrapyclass TestCnSpider(scrapy.Spider):name = 'test_cn'allowed_domains = ['org.cn']start_urls = ['http://gs.amac.org.cn/amac-infodisc/api/pof/fund?rand=0.8266535799537897&page=0&size=20']"""POST http://gs.amac.org.cn/amac-infodisc/api/pof/fund?rand=0.4768735209349304&page=0&size=20 HTTP/1.1Host: gs.amac.org.cnProxy-Connection: keep-aliveContent-Length: 2Accept: application/json, text/javascript, */*; q=0.01Origin: http://gs.amac.org.cnX-Requested-With: XMLHttpRequestUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36Content-Type: application/jsonReferer: http://gs.amac.org.cn/amac-infodisc/res/pof/fund/index.htmlAccept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9"""headers = {"Host": "gs.amac.org.cn","Accept": "application/json, text/javascript, */*; q=0.01","Origin": "http://gs.amac.org.cn","X-Requested-With": "XMLHttpRequest","User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36","Content-Type": "application/json","Referer": "http://gs.amac.org.cn/amac-infodisc/res/pof/fund/index.html","Accept-Language": "zh-CN,zh;q=0.9",}def start_requests(self):yield scrapy.Request(self.start_urls[0],method="POST",headers=self.headers,body="{}",callback=self.parse,dont_filter=True)def parse(self, response):print(response.text)

Scrapy 遇到的小坑_关于payload参数_scrapy第一次发送POST请求相关推荐

  1. java 小坑_关于Java子父类关系的小坑

    原标题:关于Java子父类关系的小坑 学过JavaSE的都知道java类在初始化的时候,如果存在直接父类,是先初始化父类,然后才初始化子类. 子类拥有父类所有的非私有化成员,非私有的成员不仅仅包括pu ...

  2. 小坑记录:get_cmap参数区分大小写

    小坑记录: plt.cm.get_cmap('spectral', 10) File "C:\Users\sanye\AppData\Local\Programs\Python\Python ...

  3. cmap参数 plt_小坑记录:get_cmap参数区分大小写-阿里云开发者社区

    小坑记录: plt.cm.get_cmap('spectral', 10) File "C:\Users\sanye\AppData\Local\Programs\Python\Python ...

  4. python requests是什么_如何基于Python + requests实现发送HTTP请求

    这篇文章主要介绍了如何基于Python + requests实现发送HTTP请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.在接口自动化测试 ...

  5. jquery发送ajax请求_复习之Vue用axios发送ajax请求

    Axios是一个基于promise的HTTP库. 浏览器支持情况:Chrome.Firefox.Safari.Opera.Edge.IE8+. 官网:https://github.com/axios/ ...

  6. 实木地板被机器人弄成坑_木地板砸出小坑怎么办

    最近,小班体验了一回地板维修师傅的工作,怎么说呢?这真的是耗体力的细致活,从事这一行业的师傅真的很不容易.接下来,小班就为大家分享下体验期间木地板砸了个坑维修办法以及一些木地板修复小技巧. 一.木地板 ...

  7. python使用scrapy_python使用scrapy发送post请求的坑

    标签: 使用 requests 发送 post 请求 先来看看使用requests来发送post请求是多少好用,发送请求 Requests 简便的 API 意味着所有 HTTP 请求类型都是显而易见的 ...

  8. Python scrapy 命令行传参 以及发送post请求payload参数

    class SciencedirectspiderSpider(scrapy.Spider):name = 'sciencedirectspider'allowed_domains = ['scien ...

  9. Python 使用 Scrapy 发送 post 请求的坑

    From:https://www.jb51.net/article/146769.htm 使用 requests 发送 post 请求 先来看看使用requests来发送post请求是多少好用,发送请 ...

最新文章

  1. CSS教你玩转背景background-position(1)
  2. 写一篇Hook Driver.
  3. [转帖]int main(int argc,char * argv[]) windows 下的使用
  4. html5 area 获取坐标,HTML 5
  5. php支付宝授权登录,PHP实现支付宝登录
  6. vkt中使用OBJImporter导入模型并进行贴图
  7. 向死而生的微信视频号,逆风翻盘的2020
  8. ios-GET和POST
  9. 如何判断车与路边线距离_靠边停车如何判断车轮与马路牙子的距离?一个办法真的很简单...
  10. Ubuntu界面显示不全的解决方法
  11. 苹果手机备忘录内容怎么发送给好友
  12. 手机连接电脑不读手机的终极解决方案
  13. 记一次微信公众号开发过程
  14. 计算机网络配置ospf协议,OSPF路由协议配置(计算机网络实验)
  15. 有感而发20210216
  16. 推荐系统3--FM和FFM
  17. c# 向Excel文件写入数据(Workbook 和Worksheet )
  18. 【Visio】利用visio2010宏画中文流程图
  19. ISP——LSC(Lens Shading Correction)
  20. 软件开发-BS与CS架构

热门文章

  1. 视频教程-Docker虚拟化容器-区块链
  2. Ubuntu20静态IP配置
  3. 图的遍历之深度优先(头歌教学实践平台)
  4. 使用Vertx编写HTTP客户端
  5. java的logger_java.util.logging.Logger 使用详解
  6. Sentinel-流控效果
  7. warnings.warn(“Estimator fit failed. The score on this train-test“posx and posy should be finite va
  8. Vue2官方文档学习笔记一
  9. 三马论道互联网金融 众上市公司布局大数据
  10. SurfaceTexture 详解