Scrapy学习笔记(9)---Requests and Responses
来源:互联网 发布:淘宝让朋友刷有风险吗 编辑:程序博客网 时间:2024/06/08 06:17
通常情况下,Request对象在爬行器中生成,并传递到系统中,直到它们到达Downloader,后者执行请求,并返回一个Response对象,该对象返回到发出请求的爬行器。
Request对象表示一个HTTP请求,通常是在爬行器中生成,然后由Downloader执行,从而生成一个Response。
Request objects
class scrapy.http.Request(url[, callback, method=’GET’, headers, body, cookies, meta, encoding=’utf-8’, priority=0, dont_filter=False, errback, flags])
参数:
url(string)—请求的URL。
callback(callable)—该函数将被调用,它的第一个参数是该请求的响应。如果一个Request没有指定一个回调,那么将使用爬行器的parse()方法。如果在处理过程中出现异常,则会调用errback。
method(string)—请求的HTTP方法,默认为’GET’。
meta(dict)—Request.meta的初始值。如果给定,该参数中传递的字典将被复制。
body(str or unicode)—请求主体。
headers(dict)—请求的头部。这个值可以是字符串(对于单个值的头)或列表(对于多值的头)。
cookies(dict or list)—后一种形式允许定制cookie的域和路径属性。只有当cookie被保存为以后的请求时才有用。当某个站点返回cookie(在响应中),这些cookie将存储在该域中的cookie中,并将在以后的请求中再次发送。
encoding(string)—默认为’utf-8’。
priority(int)—默认为0。
dont_filter(boolean)—表示该请求不应被调度器过滤。当您想要多次执行相同的请求时,可以忽略重复的过滤器。
errback(callable)—在处理请求时,出现异常,该函数将被调用。
flags(list)—发送到请求的标志可以用于日志记录或类似的目的。
属性和方法:
url:包含该请求的URL的字符串。请记住,这个属性包含了转义的URL,因此它可以与构造函数中传递的URL不同。这个属性是只读的。要更改请求的URL使用replace()。
method:一个表示请求中的HTTP方法的字符串。这肯定是大写的。
body:一个包含请求体的str对象。这个属性是只读的。要更改请求的URL使用replace()。
meta:一个包含该请求的任意元数据的字典。这个对于新请求来说是空的,通常由不同的Scrapy组件(扩展、中间件等)填充。因此,这个字典中包含的数据依赖于您所启用的扩展。
copy():返回一个新请求,该请求是该请求的副本。
replace([url, method, headers, body, cookies, meta, encoding, dont_filter, callback, errback]):用相同的成员返回一个请求对象,除了那些通过指定的关键字参数给出新值的成员。
将附加数据传递给回调函数
请求的回调是一个函数,当该请求的响应被下载时将被调用。回调函数将以下载的Response对象作为第一个参数来调用。
在某些情况下,您可能感兴趣的是将参数传递给那些回调函数,以便稍后在第二个回调函数中接收到参数。您可以使用Request.meta属性。
在请求处理中使用errback来捕获异常
Request.meta特殊键
- dont_redirect
- dont_retry
- handle_httpstatus_list
- handle_httpstatus_all
- dont_merge_cookies (see cookies parameter of Request constructor)
- cookiejar
- dont_cache
- redirect_urls
- bindaddress
- dont_obey_robotstxt
- download_timeout
- download_maxsize
- download_latency
- download_fail_on_dataloss
- proxy
- ftp_user (See FTP_USER for more info)
- ftp_password (See FTP_PASSWORD for more info)
- referrer_policy
- max_retry_times
FormRequest objects
class scrapy.http.FormRequest(url[, formdata, …])
参数:formdata(dict or iterable of tuples)—是一个字典(或可迭代的(键值)元组)包含HTML表单数据,这些数据将被url编码并分配给请求的主体。
classmethod from_response(response[, formname=None, formid=None, formnumber=0, formdata=None, formxpath=None, formcss=None, clickdata=None, dont_click=False, …])
返回一个新的FormRequest对象,它的表单字段值是预先填充的,这些值是在给定响应中包含的HTML的元素中找到的。
该策略是在默认情况下自动模拟单击,在任何形式的控件中,都是可点击的。
使用FormRequest通过HTTP POST发送数据
return [FormRequest(url="http://www.example.com/post/action", formdata={'name': 'John Doe', 'age': '27'}, callback=self.after_post)]
使用FormRequest.from_response()来模拟用户登录
对于web站点来说,通过元素,提供预先填充的表单字段是很常见的,例如会话相关数据或身份验证令牌(用于登录页面)。
import scrapyclass LoginSpider(scrapy.Spider): name = 'example.com' start_urls = ['http://www.example.com/users/login.php'] def parse(self, response): return scrapy.FormRequest.from_response( response, formdata={'username': 'john', 'password': 'secret'}, callback=self.after_login ) def after_login(self, response): # check login succeed before going on if "authentication failed" in response.body: self.logger.error("Login failed") return # continue scraping with authenticated session...
Response objects
class scrapy.http.Response(url[, status=200, headers=None, body=b”, flags=None, request=None])
属性和方法:
url—包含响应的URL的字符串。只读。
status—表示响应的HTTP状态的整数。
headers—一个类似于字典的对象,它包含响应头。可以使用get()来访问值,用指定的名称返回第一个头值,或getlist()以返回带有指定名称的所有头值。
body—这个Response的主体。body总是一个字节对象。
request—生成此响应的请求对象。这个属性是在响应和请求已经通过了所有的Downloader Middlewares之后在Scrapy引擎中分配的。
HTTP重定向将导致原始请求(在重定向之前的URL)被分配给重定向响应(在重定向后使用最终的URL)。
Response.request.url 不总是等于Response.url。
这个属性只在爬虫代码中可用,在爬行器中间件中,但不是在Downloader中间件中(尽管您可以通过其他方式获得请求)和响应下载信号的处理程序。
meta
flags
copy()
replace([url, status, headers, body, request, flags, cls])
urljoin(url)—通过将响应的url与可能的相对url相结合,构造一个绝对url。
follow(url, callback=None, method=’GET’, headers=None, body=None, cookies=None, meta=None, encoding=’utf-8’, priority=0, dont_filter=False, errback=None)
TextResponse objects
class scrapy.http.TextResponse(url[, encoding[, …]])
属性和方法:
text
encoding—编码是通过以下机制来解决的:
1.在构造函数编码参数中传递的编码;
2.在content-type HTTP头中声明的编码。如果这个编码是无效的,它被忽略,下一个解析机制被尝试。
3.响应体中声明的编码。TextResponse类没有提供任何特殊的功能。
4.通过观察响应体来推断编码。这是一种更脆弱的方法,但也是最后一种方法。
selector
xpath(query)
css(query)
follow(url, callback=None, method=’GET’, headers=None, body=None, cookies=None, meta=None, encoding=None, priority=0, dont_filter=False, errback=None)
body_as_unicode()—为了兼容
HtmlResponse objects
class scrapy.http.HtmlResponse(url[, …])
XmlResponse objects
class scrapy.http.XmlResponse(url[, …])
- Scrapy学习笔记(9)---Requests and Responses
- UNDERSTANDING HTTP REQUESTS AND RESPONSES
- scrapy的重要对象Requests,Responses的使用
- django-rest-framework指南(2):Requests and Responses
- The Java EE 6 Tutorial Filtering Requests and Responses
- Django REST framework-教程02-Requests and Responses原创翻译
- 掌握 Ajax,第 3 部分: Advanced requests and responses in Ajax
- Scrapy学习笔记九--Downloading and processing files and images
- Python Requests 学习笔记
- Requests 源码学习笔记
- Requests库学习笔记
- 学习Requests笔记
- scrapy学习笔记--scrapy命令
- Linux_Pip(Requests, Selenium, Scrapy等) 安装笔记
- Python requests模块学习笔记
- Scrapy 学习笔记(一)
- scrapy学习笔记--Items
- Scrapy框架学习笔记
- linux用户切换与权限设置
- CTAssetsPickerController 选中图片不显示对号的问题解决
- 基于canal实现mysql、oracle的数据库实时同步
- Jenkins + svn + Maven+ tomcat搭建
- COM原理与应用学习之章节预览
- Scrapy学习笔记(9)---Requests and Responses
- 为何选择Dubbox
- Python中argparse模块简单使用
- PowerShell因为在此系统中禁止执行脚本解决方法
- P1001 A+B Problem
- android sdk | API level 24 | Manifest.permission_group
- JavaScript 的函数如何定义
- 使用if语句来判断最大值
- 在函数调用/子函数中进行动态内存的分配