Scrapy爬蟲框架教程(一)-- Scrapy入門
個人博客地址:woodenrobot.me
前言
轉行做python程序員已經有三個月了,這三個月用Scrapy爬蟲框架寫了將近兩百個爬蟲,不能說精通了Scrapy,但是已經對Scrapy有了一定的熟悉。準備寫一個系列的Scrapy爬蟲教程,一方面通過輸出鞏固和梳理自己這段時間學到的知識,另一方面當初受惠於別人的博客教程,我也想通過這個系列教程幫助一些想要學習Scrapy的人。
Scrapy簡介
Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。 可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。
其最初是為了 頁面抓取 (更確切來說, 網路抓取 )所設計的, 也可以應用在獲取API所返回的數據(例如 Amazon Associates Web Services ) 或者通用的網路爬蟲。
架構概覽
各組件作用
Scrapy Engine
引擎負責控制數據流在系統中所有組件中流動,並在相應動作發生時觸發事件。 詳細內容查看下面的數據流(Data Flow)部分。
此組件相當於爬蟲的「大腦」,是整個爬蟲的調度中心。
調度器(Scheduler)
調度器從引擎接受request並將他們入隊,以便之後引擎請求他們時提供給引擎。
初始的爬取URL和後續在頁面中獲取的待爬取的URL將放入調度器中,等待爬取。同時調度器會自動去除重複的URL(如果特定的URL不需要去重也可以通過設置實現,如post請求的URL)
下載器(Downloader)
下載器負責獲取頁面數據並提供給引擎,而後提供給spider。
Spiders
Spider是Scrapy用戶編寫用於分析response並提取item(即獲取到的item)或額外跟進的URL的類。 每個spider負責處理一個特定(或一些)網站。
Item Pipeline
Item Pipeline負責處理被spider提取出來的item。典型的處理有清理、 驗證及持久化(例如存取到資料庫中)。
當頁面被爬蟲解析所需的數據存入Item後,將被發送到項目管道(Pipeline),並經過幾個特定的次序處理數據,最後存入本地文件或存入資料庫。
下載器中間件(Downloader middlewares)
下載器中間件是在引擎及下載器之間的特定鉤子(specific hook),處理Downloader傳遞給引擎的response。 其提供了一個簡便的機制,通過插入自定義代碼來擴展Scrapy功能。
通過設置下載器中間件可以實現爬蟲自動更換user-agent、IP等功能。
Spider中間件(Spider middlewares)
Spider中間件是在引擎及Spider之間的特定鉤子(specific hook),處理spider的輸入(response)和輸出(items及requests)。 其提供了一個簡便的機制,通過插入自定義代碼來擴展Scrapy功能。
數據流(Data flow)
引擎打開一個網站(open a domain),找到處理該網站的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,引擎關閉該網站。
建立Scrapy爬蟲項目流程
創建項目
在開始爬取之前,首先要創建一個新的Scrapy項目。這裡以爬取我的博客為例,進入你打算存儲代碼的目錄中,運行下列命令:
scrapy startproject scrapyspidern
該命令將會創建包含下列內容的scrapyspider目錄:
scrapyspider/n scrapy.cfgn scrapyspider/n __init__.pyn items.pyn pipelines.pyn settings.pyn spiders/n __init__.pyn ...n
這些文件分別是:
- scrapy.cfg: 項目的配置文件。
- scrapyspider/: 該項目的python模塊。之後您將在此加入代碼。
- scrapyspider/items.py: 項目中的item文件。
- scrapyspider/pipelines.py: 項目中的pipelines文件。
- scrapyspider/settings.py: 項目的設置文件。
- scrapyspider/spiders/: 放置spider代碼的目錄。
編寫第一個爬蟲(Spider)
Spider是用戶編寫用於從單個網站(或者一些網站)爬取數據的類。
其包含了一個用於下載的初始URL,如何跟進網頁中的鏈接以及如何分析頁面中的內容, 提取生成 item 的方法。
為了創建一個Spider,您必須繼承 scrapy.Spider 類, 且定義以下三個屬性:
- name: 用於區別Spider。 該名字必須是唯一的,您不可以為不同的Spider設定相同的名字。
- start_urls: 包含了Spider在啟動時進行爬取的url列表。 因此,第一個被獲取到的頁面將是其中之一。 後續的URL則從初始的URL獲取到的數據中提取。
- parse() 是spider的一個方法。 被調用時,每個初始URL完成下載後生成的 Response 對象將會作為唯一的參數傳遞給該函數。 該方法負責解析返回的數據(response data),提取數據(生成item)以及生成需要進一步處理的URL的 Request 對象。
以下為我們的第一個Spider代碼,保存在scrapyspider/spiders目錄下的blog_spider.py文件中:
from scrapy.spiders import Spidernnnclass BlogSpider(Spider):n name = woodenrobotn start_urls = [http://woodenrobot.me]nn def parse(self, response):n titles = response.xpath(//a[@class="post-title-link"]/text()).extract()n for title in titles:n print title.strip()n
啟動爬蟲
打開終端進入項目所在路徑(即:scrapyspider路徑下)運行下列命令:
scrapy crawl woodenrobotn
啟動爬蟲後就可以看到列印出來當前頁所有文章標題了。
Ps:這一篇教程里就先簡單介紹這麼多,有好多東西我還沒想好這麼講。期待後面的乾貨吧!
推薦閱讀: