Request< titlesplit >Web爬虫框架详解Scrapy简介Request类是一个http请求类,对于爬虫来说是一个非常重要的类。通常这样的请求在Spider中创建,在Downloader中执行。同时,还有一个继承自它的子类FormRequest,用于post请求。Spider中常见的用法:yieldscrapy.Request(url='zarten.com')类属性和方法是:urlmethodheadersbodymetacopy()replace([url,method,headers,body,cookies,meta,encoding,dont_filter,callback,errback])请求类scrapy.http.Request(url[,callback,method='GET',headers,body,cookies,meta,encoding='utf-8',priority=0,dont_filter=False,errback,flags])参数说明:url请求的urlcallback回调函数,用于接收到请求后返回信息。如果不指定,默认为http请求的parse()functionmethod方法,默认为GET请求,一般不需要指定。如果需要POST请求,可以使用FormRequest请求header信息,一般在settings中设置,也可以在middlewares中设置bodystr类型,即请求body,一般不需要set(get和post其实都可以通过body来)传参,但一般不用)cookiesdict或list类型,请求的cookiedict方法(name和value的键值对):cookies={'name1':'value1','name2':'value2'}列表方法:cookies=[{'name':'Zarten','value':'mynameisZarten','domain':'example.com','path':'/currency'}]encoding请求的编码方式,默认为'utf-8'priorityint类型,指定请求的优先级,数字越大优先级越高,可以为负数,默认为0dont_filter默认为False,如果设置为True,这个请求将不会被过滤(不会被添加到去重队列中),同一个请求errback可以执行多次抛出错误回调函数,错误包括404、超时、DNS错误等,第一个参数是来自scrapy.spidermiddlewares.httperrorimportHttpErrorfromtwisted.internet.errorimportDNSLookupErrorfromtwisted的TwistedFailure实例。internet.errorimportTimeoutError,TCPTimedOutErrorclassToScrapeCSSSpider(scrapy.Spider):name="toscrape-css"#start_urls=[#'http://quotes.toscrape.com/',#]start_urls=["http://www.httpbin.org/",#HTTP200expected"http://www.httpbin.org/status/404",#Notfounderror"http://www.httpbin.org/status/500",#serverissue"http://www.httpbin.org:12345/",#non-respondinghost,timeoutexpected"http://www.httphttpbinbin.org/",#DNSerrorexpected]defstart_requests(self):foruinself.start_urls:yieldscrapy.Request(u,callback=self.parse_httpbin,errback=self.errback_httpbin,dont_filter=True)defparse_httpbin(self,response):self.logger.info('Gotsuccessfulresponsefrom{}'。格式(response.url))#dosomethingusefulhere...deferrback_httpbin(自我,失败):#logallfailuresself.logger.info(repr(失败))#incaseyouwanttodosomethingspecialforsomeerrors,#youmayneedthefailure'stype:iffailure.check(HttpError):#theseexceptionscomefromHttpErrorspidermiddleware#youcangetthenon-200responseresponse=failure.value.responseself.logger.info('HttpError错误on%s',response.url)eliffailure.check(DNSLookupError):#thisistheoriginalrequestrequest=failure.requestself.logger.info('DNSLookupError错误on%s',request.url)eliffailure.check(TimeoutError,TCPTimedOutError):request=failure.requestself.logger.info('TimeoutErrorerroron%s',request.url)flags列表类型,一般不用,发送请求的flags,一般用于loggingmeta可以自定义从Request传递参数对于Response,这个参数一般可以在中间件处理yieldscrapy.Request(url='zarten.com',meta={'name':'Zarten'})inResponse:my_name=response.meta['name']但是,scrapy中也内置了特殊的key,也很好用。分别是:proxy设置代理,一般在middlewares中设置http或https代理request.meta['proxy']='https://'+'ip:port'downloadtimeout设置请求超时等待时间(秒),通常在设置里设置DOWNLOADTIMEOUT,默认180秒(3分钟)maxretrytimes***重试次数(***下载除外),默认2次,通常在设置RETRY_TIMES设置中dont_redirect设置为True,Request会notredirectdont_retry设置为True,请求将不再重试请求http链接错误或超时请求handlehttpstatuslisthttp返回码在200-300之间成功返回,超出这个范围的都是失败返回。Scrapy默认过滤这些返回,不会收到这些错误的返回进行处理不过可以自定义返回哪些错误:yieldscrapy.Request(url='https://httpbin.org/get/zarten',meta={'handle_httpstatus_list':[404]})可以看到404的处理parse函数Error:defparse(self,response):print('Thereturninformationis:',response.text)handlehttpstatusall设置为True后,Response会接收并处理任何状态码的返回信息dontmergecookiesscrapy会自动保存为它返回的cookies对于下一个请求,当我们指定自定义cookies时,如果我们不需要将返回的cookies组合起来使用我们指定的cookies,我们可以设置为Truecookiejar可以在单个spider中跟踪多个cookies,它不粘,你需要在每个请求中带上defstart_requests(self):urls=['http://quotes.toscrape.com/page/1','http://quotes.toscrape.com/page/3','http://quotes.toscrape.com/page/5',]fori,urlinenumerate(urls):yieldscrapy.Request(urlurl=url,meta={'cookiejar':i})defparse(self,response):next_page_url=response.css("li.next>a::attr(href)").extract_first()ifnext_page_urlisnotNone:yieldscrapy.Request(response.urljoin(next_page_url),meta={'cookiejar':response.meta['cookiejar']},callback=self.parse_next)defparse_next(self,response):print('cookiejar:',response.meta['cookiejar'])如果dont_cache设置为True,redirect_urls将不会被缓存。具体功能我还不知道。知道的欢迎在评论中留言。服务器的最大下载大小(字节),通常在设置中设置DOWNLOADMAXSIZE,默认为1073741824(1024MB=1G),如果不设置最大下载限制,设置为0download_latency只读属性,得到请求的响应时间(秒)defstart_requests(self):headers={'user-agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/67.0.3396.99Safari/537.36'}yieldscrapy.Request(url='https://www.amazon.com',headersheaders=headers)defparse(self,response):print('响应时间:',response.meta['download_latency'])downloadfailon_dataloss很少用到这里,详见referrer_policy。将ReferrerPolicyFormRequestFormRequest类设置为Request的子类。此类用于POST请求。此类中添加了一个新参数formdata。其他参数同Request。详情请参考以上说明。一般用法是:yieldscrapy.FormRequest(url="http://www.example.com/post/action",formdata={'name':'Zarten','age':'27'},callback=self.after_post)
