scrapy 请求和响应
scrapy Request类的一些参数意义
url: 就是需要请求,并进行下一步处理的url callback: 指定该请求返回的Response,由那个函数来处理。 method: 一般不需要指定,使用默认GET方法请求即可 headers: 请求时,包含的头文件。一般不需要。内容一般如下:使用 urllib2 自己写过爬虫的肯定知道 Host: media.readthedocs.org User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0 Accept: text/css,*/*;q=0.1 Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Referer: http://scrapy-chs.readthedocs.org/zh_CN/0.24/ Cookie: _ga=GA1.2.1612165614.1415584110; Connection: keep-alive If-Modified-Since: Mon, 25 Aug 2014 21:59:35 GMT Cache-Control: max-age=0 meta: 比较常用,在不同的请求之间传递数据使用的。字典dict型 request_with_cookies = Request(url="http://www.example.com", cookies={‘currency‘: ‘USD‘, ‘country‘: ‘UY‘}, meta={‘dont_merge_cookies‘: True}) encoding: 使用默认的 ‘utf-8‘ 就行。 dont_filter: 页面是否去重 默认是Falsse 不去重
indicates that this request should not be filtered by the scheduler. This is used when you want to perform an identical request multiple times, to ignore the duplicates filter. Use it with care, or you will get into crawling loops. Default to False. errback: 指定错误处理函数priority(int)
- 此请求的优先级(默认为0)。调度器使用优先级来定义用于处理请求的顺序。具有较高优先级值的请求将较早执行。允许负值以指示相对低优先级。
flags(list) - 是一个包含属性初始值的Response.flags
列表。如果给定,列表将被浅复制。
Request.meta特殊键
该Request.meta
属性可以包含任何任意数据,但有一些特殊的键由Scrapy及其内置扩展识别。
那些是:
dont_redirect
dont_retry
handle_httpstatus_list
handle_httpstatus_all
dont_merge_cookies(参见cookies构造函数的Request参数)
cookiejar
dont_cache
redirect_urls
bindaddress
dont_obey_robotstxt
download_timeout
download_maxsize
download_latency
proxy
当某些网站返回Cookie(在响应中)时,这些Cookie会存储在该域的Cookie中,并在将来的请求中再次发送。这是任何常规网络浏览器的典型行为。但是,如果由于某种原因,您想要避免与现有Cookie合并,您可以通过将dont_merge_cookies关键字设置为True 来指示Scrapy如此操作 Request.meta。
不合并Cookie的请求示例:
request_with_cookies = Request(url="http://www.example.com", cookies={'currency': 'USD', 'country': 'UY'}, meta={'dont_merge_cookies': True})
请求使用示例
使用FormRequest通过HTTP POST发送数据
如果你想在你的爬虫中模拟HTML表单POST并发送几个键值字段,你可以返回一个FormRequest对象(从你的爬虫)像这样:
return [FormRequest(url="http://www.example.com/post/action", formdata={'name': 'John Doe', 'age': '27'}, # 一定是标准json格式 callback=self.after_post, )]
scrapy使用post方式提交json参数
yield Request( url=post_url, method='POST', body=json.dumps(data), headers={'Content-Type': 'application/json'}, callback=self.parse_kline )
使用FormRequest.from_response()来模拟用户登录
网站通常通过元素(例如会话相关数据或认证令牌(用于登录页面))提供预填充的表单字段。进行剪贴时,您需要自动预填充这些字段,并且只覆盖其中的一些,例如用户名和密码。您可以使用 此作业的方法。这里有一个使用它的爬虫示例:<input type="hidden"> FormRequest.from_response()
import scrapy class 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...
响应对象
class scrapy.http.Response(url[, status=200, headers=None, body=b'', flags=None, request=None])
一个Response对象表示的HTTP响应,这通常是下载(由下载),并供给到爬虫进行处理。
参数:
- url(string) - 此响应的URL
- status(integer) - 响应的HTTP状态。默认为200。
- headers(dict) - 这个响应的头。dict值可以是字符串(对于单值标头)或列表(对于多值标头)。
- body(str) - 响应体。它必须是str,而不是unicode,除非你使用一个编码感知响应子类,如
TextResponse
。 - flags(list) - 是一个包含属性初始值的
Response.flags
列表。如果给定,列表将被浅复制。 - request(Requestobject) - 属性的初始值
Response.request
。这代表Request生成此响应。
url
包含响应的URL的字符串。
此属性为只读。更改响应使用的URL replace()。
status
表示响应的HTTP状态的整数。示例:200, 404。
headers
包含响应标题的类字典对象。可以使用get()返回具有指定名称的第一个标头值或getlist()返回具有指定名称的所有标头值来访问值。例如,此调用会为您提供标题中的所有Cookie:
response.headers.getlist('Set-Cookie')
body
本回复的正文。记住Response.body总是一个字节对象。如果你想unicode版本使用 TextResponse.text(只在TextResponse 和子类中可用)。
此属性为只读。更改响应使用的主体 replace()。
request
Request生成此响应的对象。在响应和请求通过所有下载中间件后,此属性在Scrapy引擎中分配。特别地,这意味着:
HTTP重定向将导致将原始请求(重定向之前的URL)分配给重定向响应(重定向后具有最终URL)。
Response.request.url并不总是等于Response.url
此属性仅在爬虫程序代码和 Spider Middleware中可用,但不能在Downloader Middleware中使用(尽管您有通过其他方式可用的请求)和处理程序response_downloaded。
meta
的快捷方式Request.meta的属性 Response.request对象(即self.request.meta)。
与Response.request属性不同,Response.meta 属性沿重定向和重试传播,因此您将获得Request.meta从您的爬虫发送的原始属性。
也可以看看
Request.meta 属性
flags
包含此响应的标志的列表。标志是用于标记响应的标签。例如:'cached','redirected '等等。它们显示在Response( str 方法)的字符串表示上,它被引擎用于日志记录。
copy()
返回一个新的响应,它是此响应的副本。
replace([ url,status,headers,body,request,flags,cls ] )
返回具有相同成员的Response对象,但通过指定的任何关键字参数赋予新值的成员除外。该属性Response.meta是默认复制。
urljoin(url )
通过将响应url与可能的相对URL 组合构造绝对url。
这是一个包装在urlparse.urljoin,它只是一个别名,使这个调用:
urlparse.urljoin(response.url, url)