Request和Response对象用于爬取网站
Request对象代表HTTP请求,通常由Spider生成,由Downloader执行发送,然后由Downloader生成返回Response对象
__init__:构造函数,常用参数:
request_with_cookies = Request(url="http://www.example.com",
cookies={'currency': 'USD', 'country': 'UY'})
request_with_cookies = Request(url="http://www.example.com",
cookies=[{'name': 'currency',
'value': 'USD',
'domain': 'example.com',
'path': '/currency'}])
当响应返回时,相应的cookie会合并到旧的cookie中,Scrapy通过CookiesMiddleware跟踪cookie,添加到现有的cookie中,在发送请求的时候附着上cookie,即Scrapy可以自动管理cookie
copy()函数
replace([url,method,headers,body,cookies,meta,encoding,dont_filter,callback,errback])
属性:
url:Request对象的url,这个属性的url是经过url编码的,是只读的,如果想更改,请使用replace函数
method:HTTP请求的方法(GET、POST等)
headers:请求头部
body:请求body部分,只读,需要更改,请使用replace()
meta:请求的元数据,当使用copy()和replace()时,都是浅拷贝,下面会讲请求的特殊元数据有哪些
有时候我们想把页面一的某些内容传递给处理页面二的callback函数,这个时候可以使用Request.meta:
def parse_page1(self, response):
item = MyItem()
item['main_url'] = response.url
request = scrapy.Request("http://www.example.com/some_page.html",
callback=self.parse_page2)
request.meta['item'] = item
yield request
def parse_page2(self, response):
item = response.meta['item']
item['other_url'] = response.url
yield item
当发生异常时,将会使用errbacks指定的函数
它会接收到一个Twisted Failure类型的实例,该实例记录了错误信息,可用于查看超时、DNS错误等
下面是一个实例:
import scrapy
from scrapy.spidermiddlewares.httperror import HttpError
from twisted.internet.error import DNSLookupError
from twisted.internet.error import TimeoutError, TCPTimedOutError
class ErrbackSpider(scrapy.Spider):
name = "errback_example"
start_urls = [
"http://www.httpbin.org/", # HTTP 200 expected
"http://www.httpbin.org/status/404", # Not found error
"http://www.httpbin.org/status/500", # server issue
"http://www.httpbin.org:12345/", # non-responding host, 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('Got successful response from {}'.format(response.url))
# do something useful here...
def errback_httpbin(self, failure):
# log all failures
self.logger.error(repr(failure))
# in case you want to do something special for some errors,
# you may need the failure's type:
if failure.check(HttpError):
# these exceptions come from HttpError spider middleware
# you can get the non-200 response
response = failure.value.response
self.logger.error('HttpError on %s', response.url)
elif failure.check(DNSLookupError):
# this is the original request
request = failure.request
self.logger.error('DNSLookupError on %s', request.url)
elif failure.check(TimeoutError, TCPTimedOutError):
request = failure.request
self.logger.error('TimeoutError on %s', request.url)
由于时间关系,这里就不总结了,在需要的时候在查看:
dont_redirect
dont_retry
handle_httpstatus_list
handle_httpstatus_all
dont_merge_cookies
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
bindaddress:request请求发往的IP地址
download_timeout:dowmloader等待响应的最长时间,超过这个时间,将被视为超时,单位为秒
download_latency:只读,发送请求到接收到响应所花费的时间,这个属性只有在接收到响应以后才有效
max_retry_times:最大重试次数,这个值比RETRY_TIMES具有更高的优先级
Scrapy提供了一些request类的子类
1、FormRequest类:
用于处理HTML表单
__init__函数的参数多了个formdata参数(dict类型),定义了HTML表单的键值对,会被编码并填充到request的boy部分
form_response(response[, formname=None, formid=None, formnumber=0, formdata=None, formxpath=None, formcss=None, clickdata=None, dont_click=False, ...])函数,返回一个新的FormRequest对象,这个对象包含表单需要填写区域的键值对,使用这个对象进行表单的提交处理有时会出现一些难以发现的bug,例如当表单的填充或是提交需要经过js处理时,使用这个对象就不太合适
参数:
FormRequest使用方式举例:
1、使用FormRequest发送HTTP的POST请求:
return [FormRequest(url="http://www.example.com/post/action",
formdata={'name': 'John Doe', 'age': '27'},
callback=self.after_post)]
2、使用FormRequest模拟用户登录:
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
Response对象代表了HTTP响应
__init__函数:
除了构造函数参数对用的属性以外,还有下列属性:
meta:与最初的Requets的meta属性的值一致,即使发生请求重发或是重定向,meta的值仍然与最初的Request的meta属性一致
常用函数:
copy():返回当前Response对象的拷贝
replace([url,status,headers,body,request,flags,cls]):用于更改当前reponse对象的部分属性的值
urljoin(url):用Response的url属性与提供的url参数构造绝对URL
follow(url,callback=None,method='GET',headers=None,body=None,cookies=None,meta=None,encoding='utf8', priority=0, dont_filter=False, errback=None):返回一个request对象,可以将相对url变为绝对url,url参数可以相对url也可以是scrapy.link.Link对象(link extractor的结果),不仅仅是绝对url
这里主要介绍TextResponse
scrapy.http.
TextResponse
(url[, encoding[, ...]])
TextResponse主要用于处理二进制数据(例如图像)
TextResponse的构造函数多了一个参数:encoding(string):解码响应用到的编码,如果没有指定,默认使用响应头部或是body部分指定的编码
TextResponse支持下列属性:
TextResponse包含下列函数:
xpath(query):使用xpath进行选择
css(query):使用css选择器进行选择
follow(url,callback=None,method='GET',headers=None,body=None,cookies=None,meta=None,encoding='utf8', priority=0, dont_filter=False, errback=None):返回一个request对象,可以将相对url变为绝对url,url参数可以相对url也可以是scrapy.link.Link对象(link extractor的结果),不仅仅是绝对url
body_as_unicode():与text属性一样,对body进行解码