Request对象和Response对象是必须熟悉的。
Request对象负责请求的构造和处理
Response对象负责返回资源的解析和处理

一、Request对象参数

Request(url[, callback, method='GET', headers, body, cookies, meta, encoding='utf-8', priority=0, dont_filter=False, errback])

参数默认值是否必须说明url无Y请求的urlcallbackself.parseY下载器完成后的回调函数methodGETN请求类型: 支持GET、POST、PUT...headers{}N默认无, 但是有中间件会构造默认的请求头bodyb''N请求体, 只支持string, 内部会转换成bytecookies{}N附加cookie信息meta{}N元数据priority0N请求优先级, 数字越大, 优先级越高dont_filterFalseN是否过滤重复请求, True: 不过滤, False: 过滤, 默认会过滤重复请求errbackN发生错误时的回调函数, 部分中间件中的错误也会传送给这个方法flags[]N可以在中间件针对性的处理每个requestcb_kwargs{}N传递给callback方法的参数

1. 发起一般请求

# -*- coding: utf-8 -*-
import scrapy
from ccidcom.items import DocumentItemclass CcidcomSpider(scrapy.Spider):name = 'ccidcomSpider'allowed_domains = ['www.ccidcom.com']def start_requests(self):yield scrapy.Request('http://www.ccidcom.com/yaowen/index.html',callback=self.parse,headers={  # 指定请求头'Content-Type': 'text',},cookies={'test_cookie': 'aaa'},meta={'column': 'yaowen'},dont_filter=True,errback=self.parse_error,cb_kwargs={'column': 'yaowen'})def parse(self, response, column):request = response.requestprint('自定义参数: ', column)print('请求头: ', request.headers)print('请求Cookies: ', request.cookies)print('元数据: ', response.meta)def parse_error(self, response):pass

运行scrapy crawl ccidcomSpider

# 输出
...
自定义参数:  yaowen
请求头:  {b'Content-Type': [b'text'], b'Accept': [b'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'], b'Accept-Language': [b'en'], b'User-Agent': [b'Scrapy/1.7.3 (+https://scrapy.org)'], b'Accept-Encoding': [b'gzip,deflate'], b'Cookie': [b'test_cookie=aaa']}
请求Cookies:  {'test_cookie': 'aaa'}
元数据:  {'column': 'yaowen', 'download_timeout': 180.0, 'download_slot': 'www.ccidcom.com', 'download_latency': 0.19195008277893066}
...

我们可以看到, 除了我们自己添加的headers, scrapy也会添加一些其他headers选项cookies会添加我们指定的cookie信息meta 可以将请求的所需要的数据从request传递到response中, 这样我们就可以在parse方法中直接读取到了, 在这里也要注意一点, 禁止meta里传递request对象

而且在meta中也附加了一些数据, download_timeout是指下载超时时间, download_slot: 跟踪的下载器插槽, 也就是调度器用来区分到底是哪个下载器, 根据主域名进行区分, download_latency: 下载器花费掉的时间, 单位是s

# 下面这种写法是完全禁止的
_req = scrapy.Request('http://www.baidu.com')
yield scrapy.Request('http://www.baidu.com', meta={'request': _req})

2. meta详解

  1. meta里的指定的key, 不能再用做业务, 否则会出错
  2. meta里禁止传递对象等, 防止无法销毁掉

key说明dont_redirectTrue/False, 禁止301,302跳转dont_retryTrue/False, 禁止失败重试handle_httpstatus_list允许的http状态码 [200, 400]handle_httpstatus_allTrue/False, 所有的状态码都是正常请求dont_merge_cookiesTrue/False禁止合并cookies, 当设置cookies参数的时候, 默认scrapy的cookie中间件可能覆盖掉你设置的cookies(key一样), 设置为False,则使用你设置的cookiescookiejar指定传递的cookiejar版本, scrapy中cookie不会自动传递, 所以必须指定一个cookiejar来传递, 稍后会详解dont_cacheTrue/False, 禁止缓存此请求redirect_reasons保存重定向的理由, [301,302, 'meta refresh']redirect_urls保存经过重定向的urlbindaddress设置请求的源ip, 有时候不起作用dont_obey_robotstxt是否遵守robot.txt协议download_timeout下载超时时间设置, 默认是设置里的DOWNLOAD_TIMEOUTdownload_maxsize下载的最大资源限制download_latency只读, 从开始请求到请求完成的时间download_fail_on_dataloss是否在响应中断是抛出错误, True/Falseproxy设置代理ipftp_userftp请求的用户ftp_passwordftp请求的密码referrer_policyheader头中的Referrer-Policy的值max_retry_times最大重试次数

这里的参数, 在稍后会详细讲解

二、FormRequest对象

FormRequest对象用来模拟post表单请求

FormRequest对象的参数和Request基本都是一样的, 但是多了一个formdataformdata是一个dict或者可迭代的元组, 包含form表单请求的具体内容

1. 发起表单请求

def start_requests(self):yield scrapy.FormRequest(url='http://www.ccidcom.com/user/dologin.do',formdata={'username': '你的账号','password': '你的登录密码'},callback=self.after_login)

运行爬虫scrapy crawl CcidcomFormSpider
查看输出:

2019-08-16 14:54:41 [scrapy.core.engine] DEBUG: Crawled (200) <POST http://www.ccidcom.com/user/dologin.do> (referer: None)
返回的数据: {"code":1}
2019-08-16 14:54:41 [scrapy.core.engine] INFO: Closing spider (finished)

2. 从资源中获取表单数据提交, form_response

这种方法, 会读取到form标签中的所有元素的信息, 并且填入你指定的表单的值, 然后发起请求
目的在于, 很多表单中有一些隐藏的元素等, 或者表单唯一值, 来防止表单被重复提交, 这个方法就可以自动去获取到表单中的元素的值来提交

具体的方法:classmethod from_response(response[, formname=None, formid=None, formnumber=0, formdata=None, formxpath=None, formcss=None, clickdata=None, dont_click=False, …])

key默认值是否必须说明responseY上一页请求拿到的response对象formnameNoneN如果给出, 则解析form标签中含有name=value的表单formidNoneN同上, 解析id=给定值的表单formxpathNoneN同上, 解析指定的xpath的表单formcssNoneN同上, 解析给定的css的表单formnumber0N如果解析出来, 包含多个表单, 指定具体哪个表单, 默认0formdata{}N要提交的表单信息clickdataNoneN给定可点击的元素dont_clickFalseN如果是True, 则表单会在不包含点击按钮的情况下提交

优势:

  1. 不用去手动看表单中的隐藏元素, 也不用再代码中指定了, scrapy会自动帮你做到
  2. 不用在代码里指定表单的提交地址, scrapy会从标签自动获取

缺点:

  1. 现在绝大部分网站都是js模拟表单请求的, 根本没有标签, 这种情况不适用的
  2. 页面是渲染出来的, 也无法使用这个方法

现在我们来看一个例子

def start_requests(self):# 先访问表单所在的页面yield scrapy.Request('http://www.dcic-china.com/login/index.html',callback=self.parse)def parse(self, response):# 这个方法会将上一个表单页面的资源传入, 并且自动解析表单元素# 然后补足你提供的表单的值(你自定义的值可能会覆盖表单页面的值)yield scrapy.FormRequest.from_response(response,formdata={'username': '你的账号','password': '你的密码','code': '1111'},callback=self.after_login)def after_login(self, response):print('返回的数据: {}'.format(response.css('p.error::text').get()))

运行爬虫

...
2019-08-16 15:11:12 [scrapy.core.engine] DEBUG: Crawled (200) <POST http://www.dcic-china.com/login/index.html> (referer: http://www.dcic-china.com/login/index.html)
返回的数据: 验证码不正确
2019-08-16 15:11:12 [scrapy.core.engine] INFO: Closing spider (finished)
...

欢迎关注Python开发之路(微信号: python-developer)

最新文章

  1. win运行pycharm找不到要加载的model.pkl文件是workingspace设置路径与文件路径位置不对应
  2. Java中finally和return执行顺序
  3. 渗透知识-编译器漏洞
  4. 网站编程手册 服务器端,Peergine-P2P服务器端开发手册-v1.3.doc
  5. JDBC驱动的动态加载
  6. 利用注解 + 反射消除重复代码,妙!
  7. apicloud手机查看效果
  8. [html] 页面上的登录表单记住了密码(显示星号),但我又忘了密码,如何找回这个密码呢?
  9. 第四章 虚拟机的安装和使用
  10. linux 管道 top,linux IPC总结——管道
  11. 【学习笔记】单例模式(枚举、校验锁、volatile、反射破坏)
  12. 中南大学12月13日考c语言,中南大学2010级C语言试卷
  13. 图论——最长路(洛谷 P1807)
  14. JQuery LazyLoad实现图片延迟加载-探究
  15. 华为开发者大会2020(Together)精彩集锦
  16. 汇编语言 王爽 【第四版】 第一章 检测点1.1
  17. 【能量检测】基于认知无线电的能量检测算法的matlab仿真
  18. Manjaro安装Nvidia显卡驱动失败或者启动黑屏卡死的原因以及Nvidia Prime与Intel核显切换方法
  19. tomcat启动过程报the JDBC Driver has been forcibly unregistered问题的修复过程
  20. 直播技术——流媒体协议

热门文章

  1. Javascript模式阅读笔记 · 简介
  2. 测试DeltaCopy
  3. freetextbox文本编辑器
  4. Nebula3的Input系统
  5. 计算机组成 面试 ---杂货铺
  6. C++中list的使用方法及常用list操作总结
  7. VC++ MFC DLL动态链接库编写详解
  8. html表单和输入方法,HTML 表单和输入
  9. linux下的科学软件下载,十分科学app-十分科学官网版下载v1.4.3-Linux公社
  10. 红帽linux7注册,redhat7.2 解决注册问题 yum