说明
Scrapy可以使用请求和响应对象抓取网站.请求对象通过系统传递,使用蜘蛛执行请求并在返回响应对象时返回请求.
请求对象
请求对象是生成响应的HTTP请求.它有以下类 :
class scrapy.http.Request(url[, callback, method = 'GET', headers, body, cookies, meta, encoding = 'utf-8', priority = 0, dont_filter = False, errback])
下表显示参数Request对象 :
Sr.否 | 参数&说明 |
---|---|
1 | url 这是一个指定URL请求的字符串. |
2 | 回拨 它是一个可调用的函数,它使用请求的响应作为第一个参数. |
3 | 方法 这是一个指定HTTP方法请求的字符串. |
4 | 标题 这是一个包含请求标题的字典. |
5 | body 这是一个包含请求正文的字符串或unicode. |
6 | cookies 这是一个包含请求cookie的列表. |
7 | meta 这是一个包含请求元数据值的字典. |
8 | 编码 这是一个包含用于编码URL的utf-8编码的字符串. |
9 | 优先级 这是一个整数,其中scheduler使用优先级来定义处理请求的顺序. |
10 | dont_filter 这是一个布尔值,指定调度程序不应过滤请求. |
11 | 错误 当处理请求时出现异常时,它是一个可调用的函数. |
将附加数据传递给回调函数
当请求的回调函数被调用时那里下载赞助作为其第一个参数.
例如 :
def parse_page1(self, response): return scrapy.Request("http://www.something.com/some_page.html", callback = self.parse_page2) def parse_page2(self, response): self.logger.info("%s page visited", response.url)
您可以使用请求. meta 属性,如果要将参数传递给可调用函数并在第二个回调中接收这些参数,如以下示例所示 :
def parse_page1(self, response): item = DemoItem() item['foremost_link'] = response.url request = scrapy.Request("http://www.something.com/some_page.html", callback = self.parse_page2) request.meta['item'] = item return request def parse_page2(self, response): item = response.meta['item'] item['other_link'] = response.url return item
使用errbacks来捕获请求处理中的异常
当引发处理请求时发生异常时,errback是一个可调用的函数.
以下示例演示了这一点 :
import scrapy from scrapy.spidermiddlewares.httperror import HttpError from twisted.internet.error import DNSLookupError from twisted.internet.error import TimeoutError, TCPTimedOutError class DemoSpider(scrapy.Spider): name = "demo" start_urls = [ "http://www.httpbin.org/", # HTTP 200 expected "http://www.httpbin.org/status/404", # Webpage not found "http://www.httpbin.org/status/500", # Internal server error "http://www.httpbin.org:12345/", # timeout expected "http://www.httphttpbinbin.org/", # DNS error expected ] def start_requests(self): for u in self.start_urls: yield scrapy.Request(u, callback = self.parse_httpbin, errback = self.errback_httpbin, dont_filter=True) def parse_httpbin(self, response): self.logger.info('Recieved response from {}'.format(response.url)) # ... def errback_httpbin(self, failure): # logs failures self.logger.error(repr(failure)) if failure.check(HttpError): response = failure.value.response self.logger.error("HttpError occurred on %s", response.url) elif failure.check(DNSLookupError): request = failure.request self.logger.error("DNSLookupError occurred on %s", request.url) elif failure.check(TimeoutError, TCPTimedOutError): request = failure.request self.logger.error("TimeoutError occurred on %s", request.url)
Request.meta特殊键
request.meta特殊键是由Scrapy识别的特殊元键列表.
下表显示了Request.meta : 的一些键;
Sr.No | Key&说明 |
---|---|
1 | dont_redirect 设置为true时为密钥,不会根据响应状态重定向请求. |
2 | dont_retry 设置为true时它是一个键,不会重试失败的请求,中间件会忽略它. |
3 | handle_httpstatus_list 这是一个键,用于定义允许每个请求的响应代码. |
4 | handle_httpstatus_all 这是一个key用于通过将请求设置为 true 来允许任何响应代码. |
5 | dont_merge_cookies 这是一把钥匙用于避免通过设置与现有cookie合并它是 true . |
6 | cookiejar 这是用于为每个蜘蛛保留多个cookie会话的密钥. |
7 | dont_cache 这是一个用于避免缓存每个策略的HTTP请求和响应的密钥. |
8 | redirect_urls 这是一个包含请求通过的URL的密钥. |
9 | bindaddress 这是IP可用于执行请求的传出IP地址. |
10 | dont_obey_robotstxt 设置为true时它是一个键,不会过滤请求robots.txt排除标准禁止,即使已启用ROBOTSTXT_OBEY. |
11 | download_timeout 它用于设置下载器在超时之前等待的每个蜘蛛的超时(以秒为单位). |
12 | download_maxsize 它用于设置每个蜘蛛的最大大小(以字节为单位),下载程序将下载. |
13 | 代理 可以设置代理for Request对象设置HTTP代理以使用请求. |
请求子类
您可以通过继承请求类来实现自己的自定义功能.内置请求子类如下 :
FormRequest对象
FormRequest类通过扩展基本请求来处理HTML表单.它有以下类 :
class scrapy.http.FormRequest(url[,formdata, callback, method = 'GET', headers, body, cookies, meta, encoding = 'utf-8', priority = 0, dont_filter = False, errback])
以下是参数 :
formdata : 它是一个包含HTML表单数据的字典,分配给请求正文.
注意 : 剩余参数与请求类相同,并在请求对象部分中进行了解释.
FormRequest 对象支持以下类方法除了请求方法 :
class scrapy.http.FormRequest(url[,formdata, callback, method = 'GET', headers, body, cookies, meta, encoding = 'utf-8', priority = 0, dont_filter = False, errback])
下表显示了上述类的参数和减号;
Sr.No | 参数&说明 |
---|---|
1 | 回复 这是一个用于使用HTML形式的回复预填充表单字段的对象. |
2 | formname 这是一个字符串,如果指定,将使用具有name属性的表单. |
3 | formnumber 这是一个当响应中有多个表单时要使用的整数形式. |
4 | formdata 这是用于表单数据的字段字典覆盖. |
5 | formxpath 指定时是字符串,使用与xpath匹配的表格. |
6 | formcss 指定时是一个字符串,使用与css选择器匹配的表单. |
7 | clickdata 这是用于观察点击的属性字典控制. |
8 | dont_click 当设置为true时,表单中的数据将在不单击任何元素的情况下提交. |
示例
以下是一些请求用法示例 :
使用FormRequest通过HTTP POST发送数据
以下代码演示了如何返回 FormRequest 当你想要在你的蜘蛛中复制HTML表单POST时的对象 :
return [FormRequest(url = "http://www.something.com/post/action", formdata = {'firstname': 'John', 'lastname': 'dave'}, callback = self.after_post)]
使用FormRequest.from_response()模拟用户登录
通常,网站使用元素来提供预先填充的表单字段.
当您需要这些字段时,可以使用 FormRequest.form_response()方法在抓取时自动填充.
以下示例演示了这一点.
import scrapy class DemoSpider(scrapy.Spider): name = 'demo' start_urls = ['http://www.something.com/users/login.php'] def parse(self, response): return scrapy.FormRequest.from_response( response, formdata = {'username': 'admin', 'password': 'confidential'}, callback = self.after_login ) def after_login(self, response): if "authentication failed" in response.body: self.logger.error("Login failed") return # You can continue scraping here
响应对象
这是一个对象,表示HTTP响应被提供给要处理的蜘蛛.它有以下类 :
class scrapy.http.Response(url[, status = 200, headers, body, flags])
下表显示了Response对象的参数 :
Sr.No | 参数&安培;说明 |
---|---|
1 | url 这是一个字符串,用于指定URL响应. |
2 | 状态 它是一个包含HTTP状态响应的整数. |
3 | 标题 这是一个包含响应标题的字典. |
4 | body 这是一个带有响应体的字符串. |
5 | 标志 这是一个包含标志的列表响应. |
响应子类
您可以通过继承响应类来实现自己的自定义功能.内置的响应子类如下 :
TextResponse对象
TextResponse对象用于二进制数据,如作为图像,声音等,它具有编码基本Response类的能力.它有以下类 :
class scrapy.http.TextResponse(url[, encoding[,status = 200, headers, body, flags]])
以下是参数 :
编码 : 它是一个带编码的字符串,用于编码响应.
注意 : 剩余参数与响应类相同,并在响应对象部分中进行了解释.
下表显示了TextResponse对象支持的属性以及响应方法 :
Sr.No | 属性&说明 |
---|---|
1 | text 这是一个响应主体,可以多次访问response.text. |
2 | encoding 这是一个包含响应编码的字符串. |
3 | selector 这是在首次访问时实例化的属性,并将响应用作目标. |
下表显示 TextResponse支持的方法除了响应方法之外的对象 :
Sr.No | 方法&说明 |
---|---|
1 | xpath(query) 它是TextResponse.selector.xpath(查询)的快捷方式. |
2 | css(query) 它是TextResponse.selector.css(查询)的快捷方式. |
3 | body_as_unicode() 它是作为方法可用的响应主体,其中response.text可以被多次访问. |
HtmlResponse对象
这是一个通过查看HTML的 meta httpequiv 属性来支持编码和自动发现的对象.其参数与响应类相同,并在"响应对象"部分中进行了说明.它有以下类 :
class scrapy.http.HtmlResponse(url [,status = 200,headers,body,flags])
XmlResponse对象
这是一个通过查看XML行来支持编码和自动发现的对象.其参数与响应类相同,并在"响应对象"部分中进行了说明.它有以下类 :
class scrapy.http.XmlResponse(url [,status = 200,headers,body,flags])