在配置好Python3
的環境以後,能夠在cmd
或者編輯器的終端窗口裏使用pip3 list
查看已安裝的Python
模塊。
安裝scrapy框架:
Windows上:在cmd
或者編輯器的終端窗口裏使用pip3 install scrapy
,等待提示便可完成。輸入scrapy -v
能夠查看版本以及幫助命令。如圖:
html
scrapy startproject projectname
能夠建立爬蟲項目,建立完成以後會出現以下圖所示的文件結構:scrapy
無關,只是在vscode
中的一些運行配置文件,能夠忽略。
在mySpider
文件夾下面有一個spiders
子文件夾和五個.py
文件和一個.cfg
文件。這裏對結構作一個簡要介紹。spiders
文件夾下面是爬蟲文件,__init__.py
爲此項目的模塊文件,默認爲空,暫時不用。items.py
主要用來定義咱們須要獲取的數據。middlewares.py
中間件文件,主要用來定義下載中間件和爬蟲中間件的內容。pipelines.py
處理獲取到數據的文件。settings.py
爲項目配置文件,能夠對項目進行一些自定義設置,好比開啓或者關閉中間件,日誌警告等級,啓用或者關閉pipelines
,以及其優先級的設置,是否開啓cookies
等。scrapy.cfg
內的內容爲下圖: shell
settings.py
,項目爲建立的項目名稱。
scrapy genspider spidername domain[starturl]
能夠建立一個爬蟲,使用命令以後如圖:
使用scrapy crawl spidername
能夠啓動爬蟲項目。瀏覽器
關於數據流向總體大體分爲5個部分:
一、Scheduler
:常稱爲調度器,存放Requests
對象,其中包括url
地址、headers
、post
數據,cookies
、代理等等。Scheduler
會將Requests
對象經過Engine
發送到Downloader
模塊進行處理。
二、Downloader
:常稱爲下載器,此模塊在得到Requests
對象以後會對服務器發送請求,而且獲得Response
,隨後將Response
經過Engine
發送給Spiders
模塊。
三、Spiders
:此模塊用於提取所須要的數據,能夠分爲兩個部分。第一部分,提取url
,headers
,cookis
,post
等數據組裝成Requests
對象經過Engine
發給調度器。第二部分,將提取到有用的數據經過Engine
傳遞到Item Pipeline
模塊。
四、Item Pipeline
:將爬取到的數據列入一個隊列,另外是對爬取到的數據進行保存和其餘的一些操做。
五、Scrapy Engine
:爲整個框架的調度,傳遞各個模塊之間的數據,使得其餘4個模塊相互獨立。除過Item Pipeline
,每一個模塊會首先將數據傳給Scrapy Engine
,而後由Scrapy Engine
傳遞給下一個模塊。大體的數據流以下圖:
服務器
Downloader
和
Engine
之間存在一個
Downloader Middlewares
稱爲下載中間件,能夠對本身的
Requests
請求做出一些修改,好比設置代理
IP
,修改
UA
等。在這裏
Requests
和
Response
都是通過這個組件的。
Spiders
和
Engine
之間存在着一個
Spider Middlewares
稱爲爬蟲中間件,處理來自
Downloader
的
Response
,能夠對組成的
Requests
對象進行一些過濾操做。在這裏
Spider Middlewares
不對想要獲得的數據進行處理,由於有專門的
Item Pipeline
模塊對想要獲得的數據進行處理。
一、關於Scrapy Engine
模塊,這一部分在項目創建的時候其實已經實現好了,不用咱們再去手動編寫,對於數據在各個模塊之間的流動,Scrapy Engine
會自行進行調度。
二、調度器主要是處理來處理創建爬蟲開始的url
地址和通過組裝以後的Requests
對象,將其列成一個隊列,有序的送給Scrapy Engine
交給下一個模塊。在傳遞給下載器以前會先通過下載中間件,若是開啓了Downloader Middlewares
組件的話,對象會先通過這個組件進行處理,作出相應的自定義修改,而後給下載器想服務器發送請求。
三、下載器想服務器發送請求以後,服務器會給咱們一個響應,這個響應能夠經過response.text
查看,返回的是一個網頁的源代碼(Ajax請求的方法可能另有不一樣),而後可使用正則或者Xpath選擇器對須要的數據進行提取。隨後將響應結果交還給Engine
,再由Engine
交給spider
。
四、在交給spider
以前會有一個爬蟲中間件,默認是關閉狀態的。通常不用,並且在中間件中內置了一些方法,能夠在作出相應操做的時候對方法進行調用。在middlwares.py
文件中有相應的模板。通過中間件以後就到了spider
模塊了,這個地方是須要咱們編寫的,由於對於每次數據的獲取均可能不太同樣,因此要作出相應的改變。主要就是在咱們新建的爬蟲文件下的parse
方法下進行處理獲得數據。本身能夠新建方法,可是這個方法不能被更名,並且是經過這個方法來將item
數據傳給pipeline
的。
五、pipeline
模塊主要是對拿到的數據進行處理,而在settings.py
文件中,pipeline
模塊是默認關閉的,因此須要手動開啓。取消掉pipeline
的註釋便可。pipeline
裏的默認內容以下圖: cookie
settings.py
文件中有
ITEM_PIPELINES
這個項目,而且是個字典,鍵爲一個
pipeline
類,意味着在管道處理模塊能夠設置多個
pipeline
來處理數據,一方面是處理來自不一樣爬蟲文件的數據,能夠經過爬蟲類的
name
屬性來判斷是哪一個爬蟲,以此來作出相應的數據處理。另外一方面就是對於一個爬蟲來講能夠創建多個
pipeline
來處理數據,假設一個
pipeline
對數據進行處理,另一個
pipeline
對數據進行保存工做。而這個字典的值就是當前
pipeline
的優先級,數字越小說明優先級越高,就越早執行。
在使用scrapy genspider spidername
以後,會在spider
目錄下建立一個spidername
的py
文件,這個文件就是須要編寫爬蟲的地方,在建立好了爬蟲文件以後如圖: 框架
DtyySpider
類,下面有三個屬性和一個方法,這個
parse
方法就是處理來自引擎的
response
。類的
name
屬性爲這個爬蟲的名稱,以後可使用
scrapy crawl dytt
能夠啓動當前爬蟲,固然這個屬性還能夠用來判斷是哪一個爬蟲,能夠在一個框架下面建立多個不一樣的爬蟲。經過
name
屬性來判斷是哪一個爬蟲,而後能夠在
pipeline
裏面對不一樣的爬蟲作相應的處理。
這裏建議使用scrapy shell url
進行調試,這裏能夠調試本身的正則、CSS
、Xpath
等語句是否正確,查看是否能夠準確的提取到數據。而後再運行爬蟲便可,這樣作的好處是,在沒有配置IP
池的狀況下,能夠不用對網址進行請求,防止請求屢次以後被網站禁封IP
。
dom
以前粗略的講過這個類裏面的屬性和方法,這裏詳細講解一下。
爬蟲如何建立以及建立以後默認內容是什麼上面已經說了。首先就是DyttSpider
這個類,繼承的是scrapy.Spider
這個類,有興趣的能夠看看源碼,這裏再也不多說。allowed_domains
屬性就是這個爬蟲能夠爬取的域名範圍。start_urls
就是這個爬蟲開始的url
地址。下面的parse
方法就是對返回結果進行處理的函數,並且返回結果保存在response
裏面,咱們可使用正則、Xpath
、CSS
選擇器等方法提取到咱們想要的值。 這裏使用一個我本身作過的例子來說解:
我這裏是對電影天堂電影信息的爬取,大約200餘頁的電影信息。代碼如圖:異步
對於非Ajax請求的網址,reponse
能夠返回咱們在網頁上看到的內容,經過一個按鈕會跳轉到另一個html
頁面,一樣的仍是能夠在源代碼中看見網頁上的內容。
然而對於Ajax形式的請求,在網頁源代碼處不能直接看到,是經過js
進行異步加載的,意思就是在瀏覽器地址欄的那個網址不是咱們須要請求的網址,真正的網址須要在開發者工具經過抓包找到,而後對真正的url
地址進行請求。
這個時候對於新找到的url
可能爲get
請求,也可能爲post
請求,要看清楚,而後再進行操做。scrapy