Scrapy爬蟲框架

架構介紹

Scrapy框架的架構如下圖所示:
在這裏插入圖片描述
它可以分爲如下的幾個部分:
①Engine。引擎,處理整個系統的數據流處理、觸發事務,是整個框架的核心。
②Item。項目,它定義了爬取結果的數據結構,爬取的數據會被賦值成該Item對象。
③Scheduler。調度器,接受引擎發過來的請求並將其加入到隊列中,在引擎再次請求的時候將請求提供給引擎。
④Downloader。下載器,下載網頁內容,並將網頁內容返回給蜘蛛。
⑤Spiders。蜘蛛,其內定義了爬取的邏輯和網頁的解析規則,它主要負責解析響應並生成提取結果和新的請求。
⑥Item Pipeline。項目管道,負責處理由蜘蛛從網頁中抽取的項目,它的主要任務是清洗、驗證和存儲數據。
⑦Downloader Middlewares。下載器中間件,位於引擎和下載器之間的鉤子框架,主要處理引擎與下載器之間的請求及響應。
⑧Spider Middlewares。蜘蛛中間件,位於引擎和蜘蛛之間的鉤子框架,主要處理蜘蛛輸入的響應和輸出的結果及新的請求。

數據流

Scrapy中的數據流由引擎控制,數據流的過程如下:
①Engine首先打開一個網站,找到處理該網站的Spider,並向該Spider請求第一個要爬取的URL。
②Engine從Spider中獲取到第一個要爬取的URL,並通過Scheduler以Request的形式調度。
③Engine向Scheduler請求下一個要爬取得URL。
④Scheduler返回下一個要爬取的URL給Engine,Engine將URL通過Downloader Middlewares轉發給Downloader下載。
⑤一旦頁面下載完畢,Downloader生成該頁面的Response,並將其通過Downloader Middlewares發送給Engine。
⑥Engine從下載器中接收到Response,並將其通過Spider Middlewares發送給Spider處理。
⑦Spider處理Response,並返回爬取到的Item及新的Request給Engine。
⑧Engine將Spider返回的Item給Item Pipeline,將新的Request給Scheduler。
⑨重複第2步到第8步,直到Scheduler中沒有更多的Request,Engine關閉該網站,爬取結束。
通過多個組件的相互協調、不同組件完成工作的不同、組件對異步處理的支持,Scrapy最大限度地利用了網絡帶寬,大大提高了數據爬取和處理的效率。

項目結構

scrapy.cfg
project/
	__init__.py
	items.py
	pipelines.py
	settings.py
	middlewares.py
	spiders/
		__init__.py
		spider1.py
		spider2.py
		...

①scrapy.cfg:它是Scrapy項目的配置文件,其內定義了項目的配置文件路徑、部署相關信息等內容。
②items.py:它定義Item數據結構,所有的Item的定義都可以放這裏。
③pipelines.py:它定義Item Pipeline的實現,所有的Item Pipeline的實現都可以放這裏。
④settings.py:它定義項目的全局配置。
⑤middlewares.py:它定義Spider Middlewares和Downloader Middlewares的實現。
⑥spiders.py:其內包含一個個Spider的實現,每個Spider都有一個文件。
一個簡單的爬取Quotes網站的Scrapy的簡單入門的結果圖:
在這裏插入圖片描述

Selector的用法

之前學的爬蟲提取網頁數據可以利用Beautiful Soup、pyquery以及正則表達式。實際上,Scrapy提供了自己的數據提取方法,即Selector(選擇器)。Selector是基於lxml來構建的,支持XPath選擇器、CSS選擇器以及正則表達式,功能全面,解析速度和準確度非常高。

Spider的用法

Spider運行流程

在實現Scrapy爬蟲項目時,最核心的類便是Spider類了,它定義瞭如何爬取某個網站的流程和解析方式。簡單來講,Spider要做的事就是:
①:定義爬取網站的動作;
②:分析爬取下來的網站。
對於Spider類來說,整個爬取循環過程如下所述:
①以初始的URL初始化Request,並設置回調函數。當該Request成功請求並返回時,Response生成並作爲參數傳給該回調函數。
②在回調函數內分析返回的網頁內容。返回結果有兩種形式。一種是解析到的有效結果返回字典或Item對象,它們可以經過處理後(或直接)保存。另一種是解析得到下一個(如下一頁)鏈接,可以利用此鏈接構造Request並設置新的回調函數,返回Request等待後續調度。
③如果返回的是字典或Item對象,我們可通過Feed Exports等組件將返回結果存入到文件。如果設置了Pipeline的話,我們可以使用Pipeline處理(如過濾、修正等)並保存。
④如果返回的是Request,那麼Request執行成功後得到Response之後,Response會被傳遞給Request中定義的回調函數,在回調函數中我們可以再次使用選擇器來分析新得到的網頁內容,並根據分析的數據生成Item。
通過以上幾步循環往復進行,完成站點的爬取。

注:Downloader Middleware是做異常處理和反爬處理的核心!!!
Pycharm中運行Scrapy爬蟲
#!/usr/bin/env python
# -*- coding:utf-8 -*-

from scrapy import cmdline

# scrapy crawl images (images 爲爬蟲名)
cmdline.execute("sscrapy crawl images".split())

在project目錄下新建一個Python文件,添加上述代碼運行即可。

一個scrapy爬蟲效果圖

在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章