python——scrapy中Request參數


原文:https://zhuanlan.zhihu.com/p/40290931

介紹

Request類是一個http請求的類,對於爬蟲而言是一個很重要的類。通常在Spider中創建這樣的一個請求,在Downloader中執行這樣的一個請求。同時也有一個子類FormRequest繼承於它,用於post請求。

在Spider中通常用法: yield scrapy.Request(url = 'zarten.com')

類屬性和方法有:

url

method

headers

body

meta

copy()

replace([url, method, headers, body, cookies, meta, encoding, dont_filter, callback, errback])

 

Request

class scrapy.http.Request(url[, callback, method='GET', headers, body, cookies, meta, encoding='utf-8', priority=0, dont_filter=False, errback, flags])

參數說明:

  • url

請求的url

 

  • callback

回調函數,用於接收請求后的返回信息,若沒指定,則默認為parse()函數

 

  • method

http請求的方式,默認為GET請求,一般不需要指定。若需要POST請求,用FormRequest即可

 

  • headers

請求頭信息,一般在settings中設置即可,也可在middlewares中設置

 

  • body

str類型,為請求體,一般不需要設置(get和post其實都可以通過body來傳遞參數,不過一般不用)

 

  • cookies

dict或list類型,請求的cookie

dict方式(name和value的鍵值對):

cookies = {'name1' : 'value1' , 'name2' : 'value2'}

list方式:

cookies = [ {'name': 'Zarten', 'value': 'my name is Zarten', 'domain': 'example.com', 'path': '/currency'} ]

 

  • encoding

請求的編碼方式,默認為'utf-8'

 

  • priority

int類型,指定請求的優先級,數字越大優先級越高,可以為負數,默認為0

 

  • dont_filter

默認為False,若設置為True,這次請求將不會過濾(不會加入到去重隊列中),可以多次執行相同的請求

 

  • errback

拋出錯誤的回調函數,錯誤包括404,超時,DNS錯誤等,第一個參數為Twisted Failure實例

from scrapy.spidermiddlewares.httperror import HttpError from twisted.internet.error import DNSLookupError from twisted.internet.error import TimeoutError, TCPTimedOutError class ToScrapeCSSSpider(scrapy.Spider): name = "toscrape-css" # start_urls = [ # 'http://quotes.toscrape.com/', # ] 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.info(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.info('HttpError錯誤 on %s', response.url) elif failure.check(DNSLookupError): # this is the original request request = failure.request self.logger.info('DNSLookupError錯誤 on %s', request.url) elif failure.check(TimeoutError, TCPTimedOutError): request = failure.request self.logger.info('TimeoutError錯誤 on %s', request.url) 

 

  • flags

list類型,一般不會用到,發送請求的標志,一般用於日志記錄

 

  • meta

可用戶自定義從Request到Response傳遞參數,這個參數一般也可在middlewares中處理

yield scrapy.Request(url = 'zarten.com', meta = {'name' : 'Zarten'})

在Response中:

my_name = response.meta['name']

不過也有scrapy內置的特殊key,也非常有用,它們如下:

 

  • proxy

設置代理,一般在middlewares中設置

可以設置http或https代理

request.meta['proxy'] = 'https://' + 'ip:port'

 

  • download_timeout

設置請求超時等待時間(秒),通常在settings中設置DOWNLOAD_TIMEOUT,默認是180秒(3分鍾)

 

最大重試次數(除去第一次下載),默認為2次,通常在settings中 RETRY_TIMES設置

 

  • dont_redirect

設為True后,Request將不會重定向

 

  • dont_retry

設為True后,對於http鏈接錯誤或超時的請求將不再重試請求

 

http返回碼200-300之間都是成功的返回,超出這個范圍的都是失敗返回,scrapy默認是過濾了這些返回,不會接收這些錯誤的返回進行處理。不過可以自定義處理哪些錯誤返回:

yield scrapy.Request(url= 'https://httpbin.org/get/zarten', meta= {'handle_httpstatus_list' : [404]})

在parse函數中可以看到處理404錯誤:

 def parse(self, response): print('返回信息為:',response.text)

 

設為True后,Response將接收處理任意狀態碼的返回信息

 

scrapy會自動保存返回的cookies,用於它的下次請求,當我們指定了自定義cookies時,如果我們不需要合並返回的cookies而使用自己指定的cookies,可以設為True

 

可以在單個spider中追蹤多個cookie,它不是粘性的,需要在每次請求時都帶上

 def start_requests(self): urls = ['http://quotes.toscrape.com/page/1', 'http://quotes.toscrape.com/page/3', 'http://quotes.toscrape.com/page/5', ] for i ,url in enumerate(urls): yield scrapy.Request(url= url, meta= {'cookiejar' : i}) def parse(self, response): next_page_url = response.css("li.next > a::attr(href)").extract_first() if next_page_url is not None: yield scrapy.Request(response.urljoin(next_page_url), meta= {'cookiejar' : response.meta['cookiejar']}, callback= self.parse_next) def parse_next(self, response): print('cookiejar:', response.meta['cookiejar']) 

 

設為True后,不會緩存

 

暫時還不清楚具體的作用,知道的小伙伴們歡迎在評論留言

 

綁定輸出IP

 

設為True,不遵守robots協議,通常在settings中設置

 

設置下載器最大下載的大小(字節),通常在settings中設置DOWNLOAD_MAXSIZE,默認為1073741824 (1024MB=1G),若不設置最大的下載限制,設為0

 

只讀屬性,獲取請求的響應時間(秒)

 def start_requests(self): headers = { 'user-agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' } yield scrapy.Request(url= 'https://www.amazon.com', headers= headers) def parse(self, response): print('響應時間為:', response.meta['download_latency']) 

 

很少用到,詳情看這里

 

設置Referrer Policy

 

FormRequest

FormRequest 類為Request的子類,用於POST請求

這個類新增了一個參數 formdata,其他參數與Request一樣,詳細可參考上面的講述

一般用法為:

yield scrapy.FormRequest(url="http://www.example.com/post/action", formdata={'name': 'Zarten', 'age': '27'}, callback=self.after_post)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM