網絡爬蟲框架Scrapy詳解之Request

2021-03-02 Python中文社區

 作者:zarten,網際網路一線工作者。

地址:zhihu.com/people/zarten

介紹

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)

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

在Response中:

my_name = response.meta['name']

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

可以設置http或https代理

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

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

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

dont_redirect 設為True後,Request將不會重定向

dont_retry 設為True後,對於http連結錯誤或超時的請求將不再重試請求

handlehttpstatuslist 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)

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

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

cookiejar 可以在單個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'])

dont_cache 設為True後,不會緩存

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

bindaddress 綁定輸出IP

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

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

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

   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'])

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)

Python中文社區作為一個去中心化的全球技術社區,以成為全球20萬Python中文開發者的精神部落為願景,目前覆蓋各大主流媒體和協作平臺,與阿里、騰訊、百度、微軟、亞馬遜、開源中國、CSDN等業界知名公司和技術社區建立了廣泛的聯繫,擁有來自十多個國家和地區數萬名登記會員,會員來自以公安部、工信部、清華大學、北京大學、北京郵電大學、中國人民銀行、中科院、中金、華為、BAT、谷歌、微軟等為代表的政府機關、科研單位、金融機構以及海內外知名公司,全平臺近20萬開發者關注。

點擊閱讀原文,從零開始學習Python網絡爬蟲

相關焦點

  • scrapy爬蟲框架的運用
    # scrapy# 爬蟲框架- 框架- 爬蟲框架- scrapy- pyspider- crawley- scrapy框架介紹- https://doc.scrapy.org/en/latest/- http://scrapy-chs.readthedocs.io
  • Scrapy爬蟲框架結構介紹(各部分組件功能,常用命令)
    Python之srcapy介紹Scrapy是一個健壯的爬蟲框架,可以從網站中提取需要的數據。是一個快速、簡單、並且可擴展的方法。Scrapy使用了異步網絡框架來處理網絡通訊,可以獲得較快的下載速度,因此,我們不需要去自己實現異步框架。並且,Scrapy包含了各種中間件接口,可以靈活的完成各種需求。
  • python爬蟲-- Scrapy入門
    前言轉行做python程式設計師已經有三個月了,這三個月用Scrapy爬蟲框架寫了兩百多個爬蟲,不能說精通了Scrapy,但是已經對Scrapy有了一定的熟悉
  • python scrapy框架爬蟲當當網
    最近在複習scrapy框架,就隨便找了個網站做了一下爬蟲,當當網,說實話這種網站還是比較好做爬蟲的,我沒加代理,也沒限速,沒寫多線程,就直接搞下來了,
  • 使用Scrapy網絡爬蟲框架小試牛刀
    前言這次咱們來玩一個在Python中很牛叉的爬蟲框架——Scrapy。scrapy 介紹標準介紹Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架,非常出名,非常強悍。所謂的框架就是一個已經被集成了各種功能(高性能異步下載,隊列,分布式,解析,持久化等)的具有很強通用性的項目模板。
  • 爬蟲大殺器 | Python學習之Scrapy-Redis實戰京東圖書
    redis-based components for scrapyscrapy-Redis就是結合了分布式資料庫redis,重寫了scrapy一些比較關鍵的代碼,將scrapy變成一個可以在多個主機上同時運行的分布式爬蟲。
  • 【Scrapy】走進成熟的爬蟲框架
    前幾天有小夥伴留言說能不能介紹推薦一下爬蟲框架
  • Python之初識Scrapy框架
    今天帶大家了解下 Scrapy 框架,先解答三個問題:什麼是 Scrapy 框架呢?它有什麼作用呢?為什麼需要使用它?Scrapy 是一個寫好的框架,不用重複造輪子,scapy 底層是異步框架 twisted ,吞吐量高,並發是最大優勢。Scrapy 安裝我電腦上同時裝了 py2 和 py3,在 py3 環境裡安裝 Scrapy,使用以下命令。
  • 第7天|10天搞定Python網絡爬蟲,Scrapy爬更快
    說了好幾天用requests進行網絡爬蟲編程了,是時候換成專業,高效率的爬蟲庫--Scrapy了。我之所以一開始用requests,就想告訴你,網絡爬蟲,方法挺多的,合適就行。還有在之前說的各種解析庫,在Scrapy中,也會經常用到,特別是Lxml的XPath。如果之前不說,留到現在還得說。
  • Python程式語言:如何建立爬蟲框架
    建立爬蟲框架,首先學習scrapy爬蟲框架!這個爬蟲框架是一個快速且功能強大的網絡爬蟲框架!scrapy爬蟲框架安裝如下:在Windows平臺上,以管理員身份運行cmd,執行pip install scrapy 進行安裝這個框架,安裝好了之後,進行檢測一下,執行scrapy —h就好了!
  • scrapy中最為重要的兩個對象Request、Response
    此dict對於新請求為空,通常由不同的Scrapy組件(擴展程序,中間件等)填充,內置關鍵詞為如下dont_redirect:如果 Request.meta 包含 dont_redirect 鍵,則該request將會被RedirectMiddleware忽略dont_retry:如果 Request.meta 包含 dont_retry 鍵, 該request
  • 小白程式設計師-運用Scrapy-splash爬取動態js頁面
    Scapy框架相關的內容,這裡不在搬磚,官方給出的中文文檔,已經足夠詳盡清晰。Scrapy框架上手非常簡單,跟著教程一步步走就可以了,爬取一些靜態資源是毫無問題的,但現如今,大部分網站為了封禁爬蟲,都會採取一些防爬策略,最典型的是通過ajax動態渲染界面,以爬取圖片為例,網頁用js加載圖片使得scrapy.request url時獲得的response中不暴露圖片url,而是一大段js函數,為解決這個問題,可以結合使用Python scrapy-splash
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    資料庫 20爬蟲scrapy框架及案例 21數據分析 22機器學習 23深度學習 24數據結構和算法 25python網絡爬蟲 26機器學習入門篇 27機器學習入門篇2 28機器學習提升篇 29數據挖掘篇 30深度學習必備原理與實戰
  • 大數據開發神器——Scrapy Spider框架
    說到Python,估計很多同學跟我一樣都是從學習Python的爬蟲開始的。當然你可以使用lxml、BeautifulSoup、Request等第三方庫來編寫自己的爬蟲。但是當需要爬取海量數據,特別是大數據的實際應用中,若自己編寫爬蟲,是一件特別困難的事情。
  • 神一般的Scrapy框架,Python中Scrap的基本結構和去重原理
    1.scrapy的基本結構(五個部分都是什麼,請求發出去的整個流程)2.scrapy的去重原理(指紋去重到底是什麼原理)看來大家都發現了標題中Scrapy掉了一個y,以後小編會改正的,謝謝大家的提醒一、Scrapy
  • Python的scrapy之爬取6毛小說網的聖墟!
    (scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() novel_biaoti=scrapy.Field() novel_neirong=scrapy.Field() passstartsixmao.py,直接右鍵這個運行
  • 微信公眾號文章爬蟲,這個就夠了
    那麼有沒有這樣的爬蟲,可以將公眾號的文章全部爬到本地,並提供便捷的搜索功能,這樣當我想查找某類文章的時候會非常方便,同時文章都在本地,也不用擔心被人刪除。最近正好看到一個牛逼的 Python 爬蟲項目,就是爬取微信公眾號的文章的,看了一下功能介紹,真是想見恨晚啊,作者水平真的是牛逼,我已經獻出了自己的崇拜,特分享出來,你可以使用它的功能,也可以研究它的技術,請拿走不謝。
  • 推薦一條高效的Python爬蟲學習路徑!
    1.學習Python包並實現基本的爬蟲過程2.掌握各種技巧,應對特殊網站的反爬措施3.學習scrapy,搭建工程化爬蟲4.學習資料庫知識,應對大規模數據存儲與提取5.分布式爬蟲,實現大規模並發採集遇到這些反爬蟲的手段,當然還需要一些高級的技巧來應對,常規的比如訪問頻率控制、使用代理IP池、字體反加密、抓包、驗證碼的OCR處理等等。往往網站在高效開發和反爬蟲之間會偏向前者,這也為爬蟲提供了空間,掌握這些應對反爬蟲的技巧,絕大部分的網站已經難不到你了。
  • Python爬蟲推薦用什麼框架呢?
    那麼,Python爬蟲一般用什麼框架比較好呢?一般來講,只有在遇到比較大型的需求時,才會使用Python爬蟲框架。這樣的做的主要目的,是為了方便管理以及擴展。本文神龍代理IP將向大家推薦十個Python爬蟲框架。
  • Scrapy源碼剖析:Scrapy有哪些核心組件?
    然後 SpiderLoader 會掃描這些代碼文件,並找到父類是 scrapy.Spider 爬蟲類,然後根據爬蟲類中的 name 屬性(在編寫爬蟲時,這個屬性是必填的),生成一個 {spider_name: spider_cls} 的字典,最後根據 scrapy crawl <spider_name> 命令中的 spider_name 找到我們寫的爬蟲類,然後實例化它,在這裡就是調用了