热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Scrapy报400和415错误

今天用Scrapy框架爬取金融APP时出现了一些小问题,折腾了一天,记录一下。返回415状态码:请求包未加header首先用Charles抓取手机请求数据包,图如下:请求包这是一个

今天用Scrapy框架爬取金融APP时出现了一些小问题,折腾了一天,记录一下。

返回415状态码:请求包未加header

首先用Charles抓取手机请求数据包,图如下:

《Scrapy报400和415错误》 请求包

这是一个POST请求并需要提交表单数据,所以我用了scrapy.FormRequest构造数据包,具体spider代码:

class yilicai(Spider):
name = "yilicai"
urls = "http://api.yilicai.cn/product/all5"
base_url = "https://www.yilicai.cn"
DOWNLOAD_DELAY = 0
count = 0
appmc = "壹理财"
def start_requests(self):
formdata = {
'page': '1',
'sType': '0',
'sTerm': '0',
'sRate': '0',
'sRecover': '0',
'sStart': '0'
}
yield scrapy.FormRequest(self.urls, callback=self.parse, formdata=formdata)
def parse(self,response):
datas = json.loads(response.body)
print(json.dumps(datas, sort_keys=True, indent=2))

运行该爬虫出现415错误:

2018-05-07 17:00:20 [scrapy.core.engine] DEBUG: Crawled (415) (referer: None)
2018-05-07 17:00:20 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <415 http://api.yilicai.cn/product/all5>: HTTP status code is not handled or not allowed
2018-05-07 17:00:21 [scrapy.core.engine] INFO: Closing spider (finished)

去找了一下关于HTTP状态码415的解释:

415Unsupported Media Type服务器无法处理请求附带的媒体格式

后来发现是我没有添加header,添加了header的代码修改如下:

headers={
"Accept-Language":"zh-CN,zh;q=0.8",
"User-Agent ":"Mozilla/5.0 (Linux; U; Android 6.0; zh-cn; AOSP on HammerHead Build/MRA58K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
"Content-Type":"application/json;charset=utf-8",
"Host":"api.yilicai.cn",
"Accept-Encoding":"gzip",
}
...
...
yield scrapy.FormRequest(self.urls, headers=self.headers,callback=self.parse, formdata=formdata)

返回400状态码:未将提交数据转化为json格式

再次运行415状态码错误算是解决了,但是出现了一个新的错误,报错400:

2018-05-07 17:11:59 [scrapy.core.engine] DEBUG: Crawled (400) (referer: None)
2018-05-07 17:11:59 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <400 http://api.yilicai.cn/product/all5>: HTTP status code is not handled or not allowed
2018-05-07 17:11:59 [scrapy.core.engine] INFO: Closing spider (finished)

真的伤心,就是这个400错误卡了我一整天,我先去找了一下关于400状态码的解释

400bad request错误的请求

后来发现是这个请求严格要求提交的表单必须是json格式,所以在提交表单时候需要把formdata转换成json格式,然后进行提交。

由于使用scrapy.FormRequest在构造包时语句formdata=json.dumps(formdata)会报错,所以使用scrapy.Request来进行爬取:

class yilicai(Spider):
name = "yilicai"
urls = "http://api.yilicai.cn/product/all5"
base_url = "https://www.yilicai.cn"
DOWNLOAD_DELAY = 0
count = 0
appmc = "壹理财"
headers={
"Accept-Language":"zh-CN,zh;q=0.8",
"User-Agent ":"Mozilla/5.0 (Linux; U; Android 6.0; zh-cn; AOSP on HammerHead Build/MRA58K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
"Content-Type":"application/json;charset=utf-8",
"Host":"api.yilicai.cn",
"Accept-Encoding":"gzip",
}
def start_requests(self):
formdata = {
'page': '1',
'sType': '0',
'sTerm': '0',
'sRate': '0',
'sRecover': '0',
'sStart': '0'
}
temp=json.dumps(formdata)
yield scrapy.Request(self.urls,body=temp,headers=self.headers,callback=self.parse)
def parse(self,response):
datas = json.loads(response.body)
print(json.dumps(datas,sort_keys=True, indent=2))

最后终于成功抓到返回的数据包了,然后愉快的进行数据分析了

2018-05-07 17:47:16 [scrapy.core.engine] DEBUG: Crawled (200) (referer: None)
{
"base_url": "https://www.yilicai.cn",
"current_page": "1",
"new_hand": 1,
"pager": "1",
"pagerParam": {
"count": 16063,
"maxPage": 1607,
"perPage": 10
},
"product_list": [
{
......
}
],
"sid": null,
"status": "0"
}
2018-05-07 17:47:16 [scrapy.core.engine] INFO: Closing spider (finished)
2018-05-07 17:47:16 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
......

推荐阅读
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • 开发笔记:图像识别基于主成分分析算法实现人脸二维码识别
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了图像识别基于主成分分析算法实现人脸二维码识别相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
author-avatar
舍舍与你-6
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有