Scrapy爬蟲框架結構介紹(各部分組件功能,常用命令)

2021-01-08 鱷魚君Ba

Python之srcapy介紹

Scrapy是一個健壯的爬蟲框架,可以從網站中提取需要的數據。是一個快速、簡單、並且可擴展的方法。Scrapy使用了異步網絡框架來處理網絡通訊,可以獲得較快的下載速度,因此,我們不需要去自己實現異步框架。並且,Scrapy包含了各種中間件接口,可以靈活的完成各種需求。所以我們只需要定製開發幾個模塊就可以輕鬆的實現一個爬蟲,用來抓取網頁上的各種內容。

Scrapy爬蟲的優點很多:

內建的css選擇器和xpath表達式。基於IPython交互shell,方便編寫爬蟲和debug。健壯的編碼支持。擴展性強,可使用signals和api(中間件,插件,管道)添加自定義功能。多用於session,cookies,http認證,user-agent,robots.txt,抓取深度限制的中間件和插件。scrapy內建teinet console,可用於debug。一張圖解釋Scrapy爬蟲的工作原理:

Scrapy爬蟲分為以下幾個部分來協同工作:

引擎(Scrapy Engine):用來處理整個系統的數據流, 觸發事務,是整個框架的核心。通過他的處理,來實現整個框架的正常工作。調度器(Scheduler):用來接受引擎發過來的請求, 傳入隊列中, 並在引擎再次請求的時候返回. 可以想像成一個URL(抓取網頁的網址或者說是連結)的優先隊列, 由它來決定下一個要抓取的網址是什麼, 同時比較強大的功能就是:可以對以前已經抓取過得連結進去重。下載器(Downloader):用於下載網頁內容, 並將網頁內容返回給Spider(Scrapy下載器是建立在twisted這個高效的異步模型上的),其實是將抓取的內容返回給引擎,引擎然後將網站的內容返回給spider。spider將內容進行解析。提取有用的數據或者進行下一步的抓取,或者將數據結構化給pipeline。爬蟲(Spiders):爬蟲是主要幹活的, 用於從特定的網頁中提取自己需要的信息, 即所謂的實體(Item)。用戶也可以從中提取出連結(new_url),讓Scrapy繼續抓取下一個頁面。從start_urls 開始,Scheduler 會將其交給 Downloader 進行下載,下載之後會交給 Spider 進行分析,Spider 分析出來的結果有兩種:一種是需要進一步抓取的連結,例如之前分析的「下一頁」的連結,這些東西會被傳回 Scheduler ;另一種是需要保存的數據,它們則被送到 Item Pipeline 那裡,那是對數據進行後期處理(詳細分析、過濾、存儲等)的地方。另外,在數據流動的通道裡還可以安裝各種中間件,進行必要的處理。

安裝scrapy,創建scrapy工程

pip install --default-timeout=5000 scrapyscrapy startproject 工程名字

創建工程之後,會生成一個固定的文件目錄,結構如下:

├── mySpider 爬蟲總目錄│———— __init__.py│———— items.py 項目文件│————middlewares.py 中間件文件|———— pipelines.py 管道文件 |———— __pycache__ |———— settings.py 設置文件│————spider 爬蟲文件|——————__init__.py|——————__pycache__└── scrapy.cfg 配置文件

在Scrapy爬蟲的工程目錄中,存在有以下幾個文件以及各部分組件的工作:

管道文件夾:負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體、驗證實體的有效性、清除不需要的信息。當頁面被爬蟲解析後,將被發送到項目管道,並經過幾個特定的次序處理數據。中間件文件:包含爬蟲中間件和下載器中間件。設置文件(配置文件):爬蟲文件:scrapy shell

scrapy shell是一個scrapy的交互終端,我們可以在未啟動爬蟲spider的情況下,嘗試以及調試代碼,也可以用來測試xpath或css表達式,查看特們的輸出信息,方便我們提取到準確的數據。

scrapy命令整理

1.創建一個新的爬蟲項目scrapy startproject 項目名2.生成爬蟲scrapy genspider 文件名網址3.運行爬蟲文件scrapy crawl 爬蟲名稱scrapy crawl 爬蟲名-o 文件名.json #保存json文件到本地4.check檢查錯誤scrapy check5.list返回項目所有的爬蟲spider名稱scrapy list6.view,存儲,打開網頁scrapy view 網址7.進入scrapy shell終端scrapy shell 網址

Scrapy Shell深入理解

Scrapy shell是一個交互終端,我們可以在未啟動spider爬蟲的情況下嘗試及調試代碼,也可以用來測試XPath表達式是否正確。

response.url #當前響應的url地址response.request.url #當前響應對應的請求的urlresponse.headers #響應頭response.body #響應體,就是html代碼,類型為byte字節類型,可以decode()轉換response.requests.headers #當前響應的請求頭

Scrapy深入理解DEBUG

通常我們啟動一個爬蟲,是會輸出以下信息的(我刪掉了日期):

[scrapy.utils.log] INFO:Scrapy1.6.0 started (bot: myspider)[scrapy.utils.log] INFO:Versions: lxml 4.3.3.0, libxml2 2.9.5, cssselect 1.0.3, parsel 1.5.1, w3lib 1.20.0,Twisted 19.2.1,Python3.7.3,PlatformWindows-7-6.1.7601-SP1[scrapy.crawler] INFO:Overridden settings:{'BOT_NAME':'myspider','NEWSPIDER_MODULE':'myspider.spiders','ROBOTSTXT_OBEY':True,'SPIDER_MODULES':['myspider.spiders']}#重啟一些設置,settings中的配置[scrapy.middleware] INFO:Enabled extensions:#已啟用的插件擴展['scrapy.extensions.corestats.CoreStats','scrapy.extensions.telnet.TelnetConsole',#控制臺,調試程序'scrapy.extensions.logstats.LogStats'][scrapy.middleware] INFO:Enabled downloader middlewares:#已啟用的下載程序中間件['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware','scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware','scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware','scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware','scrapy.downloadermiddlewares.useragent.UserAgentMiddleware','scrapy.downloadermiddlewares.retry.RetryMiddleware','scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware','scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware','scrapy.downloadermiddlewares.redirect.RedirectMiddleware','scrapy.downloadermiddlewares.cookies.CookiesMiddleware','scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware','scrapy.downloadermiddlewares.stats.DownloaderStats'][scrapy.middleware] INFO:Enabled spider middlewares:#啟用的蜘蛛爬蟲中間件['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware','scrapy.spidermiddlewares.offsite.OffsiteMiddleware','scrapy.spidermiddlewares.referer.RefererMiddleware','scrapy.spidermiddlewares.urllength.UrlLengthMiddleware','scrapy.spidermiddlewares.depth.DepthMiddleware'][scrapy.middleware] INFO:Enabled item pipelines:......[scrapy.core.engine] INFO:Spider opened[scrapy.extensions.logstats] INFO:Crawled0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)[scrapy.extensions.telnet] INFO:Telnet console listening on 127.0.0.1:6023[scrapy.downloadermiddlewares.redirect] DEBUG:Redirecting(302) to <GET xxx.com/robots.txt>from<GET xxx.com/robots.txt>[scrapy.core.engine] DEBUG:Crawled(200)<GET xxx.com/robots.txt>(referer:None)[scrapy.downloadermiddlewares.redirect] DEBUG:Redirecting(302) to <GET ...>from<GET ...>[scrapy.core.engine] DEBUG:Crawled(200)<GET https://sz.esf.fang.com/> (referer: None)[scrapy.core.engine] INFO:Closing spider (finished)[scrapy.statscollectors] INFO:DumpingScrapy stats:{'downloader/request_bytes':876,'downloader/request_count':4,'downloader/request_method_count/GET':4,'downloader/response_bytes':52832,'downloader/response_count':4,'downloader/response_status_count/200':2,'downloader/response_status_count/302':2,'finish_reason':'finished','finish_time': datetime.datetime(2020,3,8,5,37,12,513124),'log_count/DEBUG':4,'log_count/INFO':9,'response_received_count':2,'robotstxt/request_count':1,'robotstxt/response_count':1,'robotstxt/response_status_count/200':1,'scheduler/dequeued':2,'scheduler/dequeued/memory':2,'scheduler/enqueued':2,'scheduler/enqueued/memory':2,'start_time': datetime.datetime(2020,3,8,5,37,10,613015)}[scrapy.core.engine] INFO:Spider closed (finished)

我們需要關注的主要是DEBUG信息,特會顯示一些錯誤信息,比方說,遇到robots.txt文件(網站的robots禁止爬蟲),或者過濾filtered offsite 請求(通常是因為爬取的域名不在可允許的範圍)。那麼我們在剛開始的時候不要在settings

Scrapy之深入理解settings文件

為什麼需要配置文件?

配置文件存放一些公共的變量(比如資料庫的地址,帳號密碼等)。方便自己和別人修改,一般用全大寫字母命名變量名。MONGODB_TABLE

settings文件中的配置信息包含:

......#通過在用戶代理上標識您自己(和您的網站)負責任地爬行##默認的user-agent是關閉的,是個scrapy爬蟲,你也可以開啟試試,或者在這裡替換user-agent也可以#USER_AGENT = 'myspider (+)'# Obey robots.txt rules#遵守robots.txt規則 默認遵守,基本都會修改為FalseROBOTSTXT_OBEY =True# Configure maximum concurrent requests performed by Scrapy (default: 16)#配置Scrapy執行的最大並發請求數(默認值:16),打開注釋為32個#CONCURRENT_REQUESTS = 32# Configure a delay for requests for the same website (default: 0)#為同一網站的請求配置延遲(默認值:0)理解為對於一個相同的url是否需要建立連接#DOWNLOAD_DELAY = 3# The download delay setting will honor only one of:#下載延遲設置將僅支持以下選項之一#CONCURRENT_REQUESTS_PER_DOMAIN = 16#CONCURRENT_REQUESTS_PER_IP = 16# Disable cookies (enabled by default)#禁用Cookie(默認情況下已啟用)#COOKIES_ENABLED = False# Disable Telnet Console (enabled by default)#禁用Telnet控制臺(默認啟用)#TELNETCONSOLE_ENABLED = False# Override the default request headers:#重寫默認請求頭#DEFAULT_REQUEST_HEADERS = {# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',# 'Accept-Language': 'en',#}# Enable or disable spider middlewares#啟用或禁用爬蟲中間件#SPIDER_MIDDLEWARES = {# 'myspider.middlewares.MyspiderSpiderMiddleware': 543,#}# Enable or disable downloader middlewares#啟用或禁用下載程序中間件#DOWNLOADER_MIDDLEWARES = {# 'myspider.middlewares.MyspiderDownloaderMiddleware': 543,#}# Enable or disable extensions#啟用或禁用擴展插件#EXTENSIONS = {# 'scrapy.extensions.telnet.TelnetConsole': None,#}# Configure item pipelines#配置項管道#ITEM_PIPELINES = {# 'myspider.pipelines.MyspiderPipeline': 300,#}# Enable and configure the AutoThrottle extension (disabled by default)# 啟用並配置AutoThrottle擴展(默認情況下禁用)#AUTOTHROTTLE_ENABLED = True# The initial download delay#初始下載延遲#AUTOTHROTTLE_START_DELAY = 5# The maximum download delay to be set in case of high latencies#在高延遲情況下設置的最大下載延遲#AUTOTHROTTLE_MAX_DELAY = 60# The average number of requests Scrapy should be sending in parallel to# each remote server# Scrapy應並行發送到每個遠程伺服器的平均請求數#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0# Enable showing throttling stats for every response received:#啟用顯示接收到的每個響應的限制狀態,是否可以向遠程伺服器發送請求#AUTOTHROTTLE_DEBUG = False# Enable and configure HTTP caching (disabled by default)# 啟用和配置HTTP緩存(默認情況下禁用)#httpcache-middleware-settings#緩存的過期時間,緩存的文件夾路徑,忽略那些http響應碼#HTTPCACHE_ENABLED = True#HTTPCACHE_EXPIRATION_SECS = 0#HTTPCACHE_DIR = 'httpcache'#HTTPCACHE_IGNORE_HTTP_CODES = []#HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

在spider中settings能夠通過self.settings的方式獲取到:

classMySpider(scrapy,Spider):...def parse(self,response):print("Existing settings: %s "%self.settings.attributes.keys())

在pipelines中使用spider.settings.get()的方式獲取到:

classMyspiderPipeline(object):def open_spider(self, item, spider):print(spider.settings.get("MONGO_TABLE",None))

那麼又有個新的疑問,open_spider是幹什麼的

相關焦點

  • scrapy爬蟲框架的運用
    # scrapy# 爬蟲框架- 框架- 爬蟲框架- scrapy- pyspider- crawley- scrapy框架介紹- https://doc.scrapy.org/en/latest/- http://scrapy-chs.readthedocs.io
  • python爬蟲-- Scrapy入門
    其最初是為了 頁面抓取 (更確切來說, 網絡抓取 )所設計的, 也可以應用在獲取API所返回的數據(例如 Amazon Associates Web Services ) 或者通用的網絡爬蟲。架構概覽各組件作用Scrapy Engine引擎負責控制數據流在系統中所有組件中流動,並在相應動作發生時觸發事件。 詳細內容查看下面的數據流(Data Flow)部分。
  • 使用Scrapy網絡爬蟲框架小試牛刀
    前言這次咱們來玩一個在Python中很牛叉的爬蟲框架——Scrapy。scrapy 介紹標準介紹Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架,非常出名,非常強悍。所謂的框架就是一個已經被集成了各種功能(高性能異步下載,隊列,分布式,解析,持久化等)的具有很強通用性的項目模板。
  • 【Scrapy】走進成熟的爬蟲框架
    > 前幾天有小夥伴留言說能不能介紹推薦一下爬蟲框架
  • Python之初識Scrapy框架
    創建爬蟲項目創建儲存 scrapy 文件夾 scrapypy3,cd 進入到路徑,用 scrapy startproject 命令新建項目。Scrapy 項目目錄結構新建的爬蟲項目文件有以下部分組成,將整個文件在編輯器 Pycharm 中打開看得很明顯,文件後面我做了中文解釋。
  • Python程式語言:如何建立爬蟲框架
    建立爬蟲框架,首先學習scrapy爬蟲框架!這個爬蟲框架是一個快速且功能強大的網絡爬蟲框架!scrapy爬蟲框架安裝如下:在Windows平臺上,以管理員身份運行cmd,執行pip install scrapy 進行安裝這個框架,安裝好了之後,進行檢測一下,執行scrapy —h就好了!
  • 神一般的Scrapy框架,Python中Scrap的基本結構和去重原理
    "Scrapy的基本結構是什麼樣的, Scrapy的指紋去重到底是什麼原理",面試官經常這麼問.1.scrapy的基本結構(五個部分都是什麼,請求發出去的整個流程)2.scrapy的去重原理(指紋去重到底是什麼原理)看來大家都發現了標題中Scrapy掉了一個y,以後小編會改正的,謝謝大家的提醒一、Scrapy
  • 第7天|10天搞定Python網絡爬蟲,Scrapy爬更快
    Scrapy框架主要由五大組件組成,它們分別是:調度器(Scheduler):從隊列裡獲取下一步要抓取的網址,自動去除重複的。爬蟲(Spider):爬蟲,是用戶最關心的部分。用戶定製自己的爬蟲(通過定製正則表達式等語法),用於從特定的網頁中提取自己需要的信息,即所謂的實體(Item)。 用戶也可以從中提取出連結,讓Scrapy繼續抓取下一個頁面。
  • Scrapy源碼剖析:Scrapy有哪些核心組件?
    這些組件為了完成這些功能,內部又是如何實現的。爬蟲類我們接著上一篇結束的地方開始講起。然後 SpiderLoader 會掃描這些代碼文件,並找到父類是 scrapy.Spider 爬蟲類,然後根據爬蟲類中的 name 屬性(在編寫爬蟲時,這個屬性是必填的),生成一個 {spider_name: spider_cls} 的字典,最後根據 scrapy crawl <spider_name> 命令中的 spider_name 找到我們寫的爬蟲類,然後實例化它,在這裡就是調用了
  • 大數據開發神器——Scrapy Spider框架
    說到Python,估計很多同學跟我一樣都是從學習Python的爬蟲開始的。當然你可以使用lxml、BeautifulSoup、Request等第三方庫來編寫自己的爬蟲。但是當需要爬取海量數據,特別是大數據的實際應用中,若自己編寫爬蟲,是一件特別困難的事情。
  • Python技術:Scrapy架構介紹
    它也提供了多種類型爬蟲的基類,如BaseSpider、sitemap爬蟲等。Scrapy 算得上是Python世界中最常用的爬蟲框架了,同時它也是我掌握的幾種流行語言中最好的爬蟲框架,沒有之一!我認為它也是最難學習的框架,同樣沒有之一。很多初學 Scarpy的經常向我抱怨完全不清楚Scrapy該怎樣入手,即使看的是中文的文檔,也感到很難理解。
  • python scrapy框架爬蟲當當網
    最近在複習scrapy框架,就隨便找了個網站做了一下爬蟲,當當網,說實話這種網站還是比較好做爬蟲的,我沒加代理,也沒限速,沒寫多線程,就直接搞下來了,
  • Scrapy源碼剖析:Scrapy是如何運行起來的?
    scrapy 命令從哪來?當我們基於 Scrapy 寫好一個爬蟲後,想要把我們的爬蟲運行起來,怎麼做?非常簡單,只需要執行以下命令就可以了。 scrapy crawl <spider_name>通過這個命令,我們的爬蟲就真正開始工作了。那麼從命令行到執行爬蟲邏輯,這個過程中到底發生了什麼?
  • 網絡爬蟲框架Scrapy詳解之Request
    介紹Request類是一個http請求的類,對於爬蟲而言是一個很重要的類。import HttpErrorfrom twisted.internet.error import DNSLookupErrorfrom twisted.internet.error import TimeoutError, TCPTimedOutErrorclass ToScrapeCSSSpider(scrapy.Spider):
  • 小叮噹高級爬蟲(二):Scrapy創建項目「五部曲」獲取豆瓣電影信息
    >定義items.py文件內容,明確將要爬取的目標(4)使用命令創建爬蟲文件在系統生成的Scrapy項目的」spiders「文件夾下使用命令:scrapy genspider在打開的命令窗口中輸入命令:scrapy genspider catch_movie douban.com其中」catch_movie"表示爬蟲名字,「douban.com"表示要抓取的網頁的域名。
  • 使用 Scrapy 快速抓取網頁
    Scrapy 是 Python 中一個非常棒的網頁抓取框架。它可以在大規模進行網頁抓取時,處理一些常見的問題。這裡是對上面文件及目錄的簡單介紹:items.py 是被解析數據的模型。你也可以繼承 scrapy 中的 item 類創建自定義的模型(比如 Product)。
  • Python爬蟲推薦用什麼框架呢?
    實現爬蟲技術的編程環境有很多種,Java、Python、C++等都可以用來爬蟲,但最熱門的依然是Python,這是為什麼呢?因為Python有著非常豐富的第三方庫,確實很適合做爬蟲,簡單的幾行代碼便可實現你想要的功能,同時Python也是數據挖掘和分析的好能手。
  • Python爬蟲學習的完整路線推薦
    基於python爬蟲,我們整理了一個完整的學習框架:篩選和甄別學習哪些知識,在哪裡去獲取資源是許多初學者共同面臨的問題。接下來,我們將學習框架進行拆解,分別對每個部分進行詳細介紹和推薦一些相關資源,告訴你學什麼、怎麼學、在哪裡學。爬蟲是一種按照一定的規則,自動地抓取全球資訊網信息的程序或者腳本。
  • 手把手:教你用Scrapy建立你自己的數據集(附視頻)
    像許多網站一樣,該網站具有自己的結構、形式,並具有大量可訪問的有用數據,但由於沒有結構化的API,很難從站點獲取數據。 因此,我們將爬取這個網站,獲得非結構化的網站數據,並以有序的形式建立我們自己的數據集。為了爬取網站,我們將使用Scrapy(https://scrapy.org/)。簡而言之,Scrapy是一個框架,可以更輕鬆地構建網絡爬蟲並降低護它們的難度。
  • 獨家 | 教你用Scrapy建立你自己的數據集(附視頻)
    像許多網站一樣,該網站具有自己的結構、形式,並具有大量可訪問的有用數據,但由於沒有結構化的API,很難從站點獲取數據。 因此,我們將爬取這個網站,獲得非結構化的網站數據,並以有序的形式建立我們自己的數據集。為了爬取網站,我們將使用Scrapy(https://scrapy.org/)。簡而言之,Scrapy是一個框架,可以更輕鬆地構建網絡爬蟲並降低護它們的難度。