Python爬蟲實戰-使用Scrapy框架爬取土巴兔(一)

weixin_33860722發表於2017-03-18

Scrapy is an application framework for crawling web sites and extracting structured data which can be used for a wide range of useful applications, like data mining, information processing or historical archival.

上面這段話取自官方文件。翻譯過來就是:
Scrapy是一個為了爬取網站資料,提取結構性資料而編寫的應用框架。 可以應用在包括資料探勘,資訊處理或儲存歷史資料等一系列的程式中。
Scrapy可以說是目前Python爬蟲框架中最成熟最穩定的框架之一,所以我們使用Scrapy框架來做爬蟲開發可以說是好鋼用在刀刃上。

該系列其它文章


該篇文章主要講Scrapy架構工作流程優點開發環境的搭建,接下來我們進入正題。

一.初識Scrapy

Scrapy架構圖:


5022380-a2b1bfc297836d6f.png
Scrapy架構圖

通過清晰的架構圖我們可以瞭解到Scrapy運作的流程。

1.Scrapy的五大模組:
  • 引擎(Scrapy Engine):Scrapy使用Twisted來作為框架的核心,Twisted是一個基於事件驅動的網路引擎框架。所以引擎主要是用來處理整個系統的資料流,觸發各個事件。
  • 排程器(Scheduler):排程器接受引擎傳來的資料,維護需要爬取的網頁URL佇列,並通過規定的排程機制將URL建立為下載請求。
  • 管道(Item Pipeline):將爬取到的內容轉換為實體物件,並對實體物件做有效性驗證、持久化等等自定義的操作。
  • 下載器(Downloader):主要是進行網頁的http請求及響應,負責產生資料並返回資料。
  • 爬蟲(Spiders):在爬蟲中,定義爬取URL的規則和網頁資訊的提取規則。
2.Scrapy的三個中介軟體起到串聯各個模組的作用:
  • 下載器中介軟體(Downloader Middlewares):位於Scrapy引擎和下載器之間的中介軟體,在Scrapy引擎和下載器中間負責傳遞下載內容的請求和資料。
  • 排程中介軟體(Scheduler Middewares):位於Scrapy引擎和排程之間的中介軟體,Scrapy引擎和排程器之間負責傳遞排程的請求和響應。
  • 爬蟲中介軟體(Spider Middlewares):位於Scrapy引擎和爬蟲之間的框架,主要工作是處理爬蟲的響應輸入和請求輸出。
3.Scrapy的工作流程:
  • 引擎開啟一個網站,找到處理該網站的Spider並向該spider請求第一個要爬取的URL(s)。
  • 引擎從Spider中獲取到第一個要爬取的URL並在排程器(Scheduler)中建立request來進行排程。
  • 引擎向排程器請求下一個要爬取的URL。
  • 排程器返回下一個要爬取的URL給引擎,引擎將URL通過下載中介軟體(請求(request)方向)轉發給下載器(Downloader)。
  • 一旦頁面下載完畢,下載器生成一個該頁面的Response,並將其通過下載中介軟體(返回(response)方向)傳送給引擎。
  • 引擎從下載器中接收到Response並通過Spider中介軟體(輸入方向)傳送給Spider處理。
  • Spider處理Response並返回爬取到的Item及(跟進的)新的Request給引擎。
  • 引擎將(Spider返回的)爬取到的Item給Item Pipeline,將(Spider返回的)Request給排程器。
  • (從第二步)重複直到排程器中沒有更多地request,引擎關閉該網站。
4.Scrapy的優點:

我們為什麼要使用Scrapy,而不使用其他爬蟲框架,除了成熟穩定之外,還有很多其他優勢。

  • 使用可讀性較好的xpath代替正則處理html解析
  • 支援shell方便除錯
  • 高擴充套件,低耦合,方便定製功能
  • 編碼自動檢測以及健壯的編碼支援
  • 有強大的統計功能和log系統
  • 支援多URL非同步請求

二.開發環境的搭建

1.安裝python環境

目前Scrapy同時支援python2.7版本和python3.3以上,所以可以根據自己需要選擇不同的Python版本。本文針對的開發環境使用的是python3.5,如果你是初學者建議使用python3開始學習,不用考慮python的許多歷史包袱。

Python各個版本下載地址:https://www.python.org/downloads

2.安裝Scrapy

由於官方文件有Scrapy安裝教程,這裡不做詳細說明,安裝方法可以參考官方文件。
這裡說下Windows下可能會遇到的問題,因為Scrapy依賴部分第三方框架,所以在安裝的Scrapy的同時也會一起安裝相關的第三方框架。部分第三方框架可能會出現安裝失敗的情況,如:

  • Twisted在Windows環境下安裝失敗,需要手動下載Twisted在下的Windows安裝包http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted。根據自己的windows和python版本選擇對應下載安裝包。
    5022380-068c2b9eff63c7fe.png

    如果下載的安裝包是"Twisted-17.1.0-cp35-cp35m-win_amd64.whl",則呼叫命令
pip install Twisted-17.1.0-cp35-cp35m-win_amd64.whl
  • Lxml在Windows環境下安裝失敗,與Twisted情況相似。需要手動下載安裝包。http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml
    5022380-c7d7a2ea6a9331a9.png

    如果下載的安裝包是"lxml‑3.7.3‑cp35‑cp35m‑win_amd64.whl",則呼叫命令
pip install lxml‑3.7.3‑cp35‑cp35m‑win_amd64.whl
3.安裝MongoDB

這裡使用MongoDB來儲存爬取到的網頁上的資訊,如文章的標題、類別、圖片儲存路徑等等。
MongoDB安裝相對簡單。先下載安裝包https://www.mongodb.com/download-center,如果安裝過程中有疑問可以參考官方文件。Windows下也可以參考這篇文章MongoDB下載與安裝,作者講的很詳細。
MongoDB安裝完後還需要安裝第三方庫pymongo,我們需要pymongo在python程式碼中操作MongoDB。
安裝命令:

pip install pymongo
4.安裝Redis

Redis是一個資料結構為key-value鍵值對的儲存系統。在爬蟲中使用Redis主要是為了存取快取,記錄自動更新Http代理的時間,對已經爬取的網頁URL進行過濾等等。
Redis的安裝教程和下載地址在官網連結中https://redis.io/download
Redis還目前沒有Windows版本,所以如果要安裝Windows版本,只能使用Microsoft Open Tech group 提供的Redis版本。Github中有下載地址和安裝教程https://github.com/ServiceStack/redis-windows
接著安裝第三方庫redis
安裝命令:

pip install redis
5.安裝第三方庫
  1. pillow:處理對圖片的裁剪、儲存
pip install pillow
  1. requests:基於 urllib,採用Apache2 Licensed開源協議的HTTP庫
pip install requests
  1. schedule:使用schedule進行定時任務管理
pip install schedule
6.安裝IDE

推薦使用PyCharm,可以說是目前做python開發最好的IDE,PyCharm社群版提供的功能就已經足夠強大了。

最後

現在我們對Scrapy已經有了基本的認識,開發環境搭建也已經完成,接下來就開始進行程式碼編寫。Python爬蟲實戰-使用Scrapy框架爬取土巴兔(二)

附:

詳細的專案工程在Github中,如果覺得還不錯的話記得Star哦。

相關文章