由於公司項目需求,須要作一個爬蟲。因此我一個python小白就被拉去作了爬蟲。花了兩週時間,拼拼湊湊總算趕出來了。因此寫個blog作個記錄。
首先,初步要作的就是快速構建一個爬蟲。html
1) 直接從官網下載
python下載官網python
2) 是經過brew安裝
首先安裝xcode
能夠選擇在App Store安裝或者使用xcode-select --install
這個命令安裝git
接着安裝brewgithub
usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
把這個命令輸入終端運行就能夠安裝了
brew官網docker
接着利用brew安裝python3brew install python3
數據庫
安裝完python3之後,咱們來裝scrapy。由於python3是自帶pip3的,
因此若是找不到該命令的話,能夠去看看python3的安裝路徑。brew是將其安裝在了\usr\local\bin
這個目錄下。bootstrap
若是pip沒安裝上的話,不要慌。咱們還能夠經過命令來安裝windows
curl -O https://bootstrap.pypa.io/get-pip.py python3 get-pip.py
接下來安裝scrapy
輸入命令pip3 install Scrapy
就能夠了xcode
首先從官網上下載msi文件
在安裝選項中勾選上須要pipruby
而後在cmd中輸入pip3 install Scrapy
完成
sudo get-apt install python36 python36-devel gcc sudo pip3 install Scrapy
兩條命令就搞定了。
由於個人爬蟲是跑在docker上,有些鏡像可能沒有gcc。因此須要devel和gcc,不然有些包會安不上。切記
Redhat系的話,只須要把get-apt
改爲yum
就能夠了
scrapy startproject demo
scrapy genspider demo_spider www.google.com
scrapy crwal demo_spider
當你創建完項目的時候,scrapy會幫你生成一堆文件。
目錄結構是這樣的
在你的demo項目中,會有個scrapy.cfg
的配置文件和一個demo
的文件夾
scrapy.cfg
這個文件咱們先暫時不去關心。咱們來關心一下demo
文件夾下的東西
分別是items.py
,middlewares.py
,pipelines.py
,settings.py
和一個spiders
文件夾。
接着咱們去spiders
目錄下去建立一個爬蟲scrapy genspider demo_spider www.google.com
OK,爬蟲生成功了。
咱們來初步解析一下這個爬蟲。
有一個DemoSpiderSpider
的類。很明顯,這個是咱們剛纔生成爬蟲的名字爲demo_spider而後後面又添加了一個Spider。
接着往下看,有個name的屬性,這個屬性很重要,咱們到時候啓動爬蟲的時候,就要經過這個name來告知scarpy
啓動的是哪一個爬蟲
allowed_demains
是用來指定,咱們只爬取哪些域名下的。好比說,我在爬取google的搜索結果的時候,會爬到不少別的網站,這個屬性就是用來告知,除了www.google.com
之外的,我都不爬取。
start_urls
是用來作啓動url,看命名就知道了。能夠把Scrapy的爬取過程當作一個廣度搜索。因此它會先迅速把start_urls
下的全部url
都爬取一遍。而後把結果加入到一個隊列中。也是由於這個緣由,因此在作併發爬蟲時,會讓不一樣的爬蟲的start_urls
不同。固然還有重複的問題要解決(笑)
接下來就是parse
方法了,咱們對頁面的爬取也是在這個parse
中解決
初步理解了spider
,咱們往外層走。
咱們首先來假想幾個問題,若是我是Scrapy框架的設計者,我會這麼設計這個框架。
既然是通用的爬蟲框架,那用戶是否是應該能夠操做header之類的,讓個人每個爬蟲都通過代理,或者是設置不一樣的cookie。
噹噹噹,因此就有了中間件。middlewares.py
咱們來看看Scrapy
生成的是什麼樣的。
既然是入門,咱們確定是先關心咱們須要的。看第二張圖。有這麼幾個幹方法process_request
,process_response
,process_exception
處理request
,response
,exception
。很好,咱們就要這幾個東西。
咱們能夠這麼理解,咱們的爬蟲爬到的每個頁面,都會通過這些中間件。
來看看架構圖
因此咱們的數據是通過每個中間件。而後中間件來決定去留。
而後咱們來想一想具體process_request
下的狀況。
None
spider
了,這個時候,咱們就須要返回一個response
了。request
.這時候只要返回request
。調度器會終止process_request
,而後用這個request
從新開始。raise
一個IgnoreRequest
,也就是,若是你不處理這個異常,這異常就直接扔了。固然,你還能夠選擇在process_exception
去處理這個異常Python爬蟲從入門到放棄(十七)之 Scrapy框架中Download Middleware用法
初步理解了中間件,咱們來講說items
在spider
處理完數據之後,寫入item中,而後就來到了這兒。scrapy
生成的代碼
怎麼用呢。舉個例子,我在spider中須要存儲url。因而我在這個文件中就寫入url = scrapy.Field
接着在spider
中生成這個item
。而後將item['url'] = url
,在處理完了之後。yield item
完成
這個數據呢,就會交給pipelines
來處理
接着,咱們來看看pipelines
咱們和剛纔同樣,思考一下,數據拿過來有幾種可能。
raise
一個DropItem
就能夠了這邊呢,若是要寫入數據庫,玩玩寫入的時間特別長,因此推薦使用Twisted
來作一個異步寫入
最後。咱們來看看settings
配置文件,好比是否遵照robots.txt之類的。固然,你剛纔寫的全部middlewares
,pipelines
。都要在這兒註冊!!!!隨便給它一個不重複的數字就行了