51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 15619|回复: 1
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
#
发表于 2019-2-25 17:29:09 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 歪小Y_02 于 2019-2-25 17:30 编辑

要看解决方式的直接跳到最后首先思路,分析网站,找规律,我感觉这个是重要的一步。

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


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




开始找规律爬取数据


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


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


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

  1. import requests
  2. import json


  3. class YuecaiSpider(object):
  4.     def __init__(self):
  5.         self.headers = {
  6.             'Content-Type': 'application/json',
  7.             'Host': 'iris.yuecai.com',
  8.             'Origin': 'http://www.yuecai.com',
  9.             # 'Referer': 'http://www.yuecai.com/purchase/?SiteID=21',
  10.             'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
  11.         }
  12.         self.data = {
  13.             "page": 0,
  14.             "size": 20,
  15.             "sort": None,
  16.             "teseData": 2,
  17.             "word": None,
  18.             "zone": None,
  19.         }

  20.     def start_requests(self):
  21.         url = "http://iris.yuecai.com/iris/v1/purchase/search"
  22.         res = requests.post(url, headers=self.headers, data=json.dumps(self.data))  # 这里要转换为json数据
  23.         print(res.status_code)
  24.         print(res.text)


  25. if __name__ == '__main__':
  26.     yuecai = YuecaiSpider()
  27.     yuecai.start_requests()
复制代码
  • 用requests写测试脚本的时候,一点问题没有,但是我改成scrapy后,一直没有数据。我不知道是为什么??
  1. import scrapy
  2. import json


  3. class YuecaiSpider(scrapy.Spider):
  4.     name = 'yuecai'
  5.     allowed_domains = ['yuecai.com']
  6.     start_urls = ['http://iris.yuecai.com/iris/v1/purchase/search']

  7.     site_name = '悦采网数据平台'
  8.     version = '1.0'

  9.     def __init__(self):
  10.         super(YuecaiSpider, self).__init__()
  11.         self.headers = {
  12.             # 'Accept': 'application/json, text/javascript, */*; q=0.01',
  13.             # 'Accept-Encoding': 'gzip, deflate',
  14.             # 'Accept-Language': 'zh-CN,zh;q=0.9',
  15.             # 'Connection': 'keep - alive',
  16.             # 'Content - Length': '69',
  17.             'Content-Type': 'application/json',
  18.             'Host': 'iris.yuecai.com',
  19.             'Origin': 'http://www.yuecai.com',
  20.             'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
  21.         }

  22.         self.data = {
  23.             'word': None,   # 'NULL'
  24.             'zone': None,    # 注意这边特别坑的  有的就是需要'null'这种数据
  25.             'page': '1',     # 参数该用字符用字符
  26.             'size': '20',    #
  27.             'sort': None,
  28.             'teseData': '2',
  29.         }

  30.     def start_requests(self):
  31.         url = "http://iris.yuecai.com/iris/v1/purchase/search"
  32.         yield scrapy.Request(
  33.             url,
  34.             method="POST",
  35.             headers=self.headers,
  36.             body=json.dumps(self.data),   # 这边数据也是要转换成json数据
  37.             dont_filter=True,
  38.             callback=self.parse,
  39.         )

  40.     def parse(self, response):
  41.         print("*" * 50)
  42.         print(response.status)
  43.         print(response.text)
  44.         print("*" * 50)
复制代码

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











本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-23 15:32 , Processed in 0.067483 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表