1. 程式人生 > >Python3爬蟲(十八) Scrapy框架(二)

Python3爬蟲(十八) Scrapy框架(二)

ade 地圖 最終 站點地圖 url 命令 scheduler 持久 json

對Scrapy框架(一)的補充

Infi-chu:

http://www.cnblogs.com/Infi-chu/

Scrapy優點:
提供了內置的 HTTP 緩存 ,以加速本地開發 。
提供了自動節流調節機制,而且具有遵守 robots.txt 的設置的能力。
可以定義爬行深度的限制,以避免爬蟲進入死循環鏈接 。
會自動保留會話。
執行自動 HTTP 基本認證 。 不需要明確保存狀態。
可以自動填寫登錄表單。
Scrapy 有一個 內置的中間件 , 可以自動設置請求中 的引 用( refeπer )頭 。
支持通過 3xx 響應重定向 ,也可以通過 HTML 元刷新。
避免被網站使用的<noscript> meta 重定向困住,以檢測沒有 JS 支持的頁面 。
默認使用 css 選擇器或 XPath 編寫解析器。
可以通過 Splash 或任何其他技術(如 Selenium ) 呈現 JavaScript 頁面。
擁有強大的社區支持和豐富 的插件和擴展來擴展其功能 。
提供了通用的蜘蛛來抓取常見的格式 : 站點地圖、 csv 和 XML。
內置支持以多種格式 CJSON 、 csv 、 XML、 JSON-lines )導出收集的數據並將其存儲
在多個後端( FTP , S3 、本地文件系統)中。

Scrapy工作流程:
1.引擎打開一個網站( open a domain ) ,找到處理該網站的 Spider 並向該 Spider 請求第
一個要爬取的URL(s)。
2.引擎從 Spider 中 獲取第一個要爬取的 URL 並在調度器( Scheduler )中以 Request
調度 。
3.引擎向調度器請求下 一個要爬取的 URL 。
4.調度器返回下一個要爬取的 URL 給引擎,引擎將 URL 通過下載中間件(請求( request)
方向)轉發給下載器( Downloader )。
5.一旦頁面下載完畢,下載器生成一個該頁面的 Response ,並將其通過下載中間件(返回 ( Response)方向)發送給引擎。
6.引擎從下載器中 接收 Response 並通過 Spider 中間件(輸入方向)發送給 Spider 處理 。
7. Spider 處理 Response 井返回爬取到的 Item 及(跟進的)新的 Request 給引擎。
8.引擎將( Spider 返回的)爬取到的 Item 給 Item Pipeline ,將( Spider 返回的) Request
給調度器。
9. (從第 2 步)重復直到調度器中沒有更多的 Request,引擎關閉對該網站 的執行進程。

scrapy各組件功能:
1.引擎
引擎負責控制數據流在系統中所有組件中流動,並在相應動作發生時觸發事件。它也是程序的入口,可以通過 scrapy 指令方式在命令行啟動,或者通編程方式實例化後調用 start 方法啟動。
2.調度器
調度器從引擎接收爬取請求並將它們入隊,以便之後引擎請求它們時提供給引擎。一般來說,我們並不需要直接對調度器進行編程,它是由 Scrapy 主進程進行自動控制的。
3.下載器
下載器負責處理產生最終發出的請求對象 Request 並將返回的響應生成 Response對象傳遞給蜘蛛。
4. Spiders
Spider 是用戶編寫用於分析響應結果並從中提取 Item或額外跟進的 URL 的類。每個 Spider 負責處理一個特定網站。
5.數據管道
Item Pipeline 負責處理被 Spider 提取出來的 Item。典型的處理有清理、驗證及持久化。
6.下載器中間件
下載器中間件是在引擎及下載器之間的特定鉤子( specific hook ),處理 Downloader傳遞給引擎的 Response。其提供了 一個簡便的機制,通過插入自定義代碼來擴展 Scrapy 的功能。
7. Spider中間件
Spider 中間件是在引擎及 Spider 之間的特定鉤子( specific hook ),處理 Spider 的輸入( Response )和輸出(Items 及 Requests )。其提供了一個簡便的機制,通過插入自定義代碼來擴展 Scrapy 的功能。

Scrapy基本操作:
安裝
pip install scrapy
【Windows版註意事項】
環境要求:需要Microsoft Visual C++ 14.0 或以上版本

基本操作命令

# 創建爬蟲項目
scrapy startproject 項目名
# 創建蜘蛛
scrapy genspider 文件名 爬取網站的域名
# 啟動爬蟲
scrapy crawl 文件名


數據模型Item
官方定義:爬取的主要目標就是從非結構的數據源中提取結構性數據,如網頁。Scrapy提供Item類來滿足這樣的需求。Item對象是一種簡單的容器,保存了爬取到的數據。其提供了類似於詞典的API,以及用於聲明可用字段的簡單語法。
聲明Item:Item使用簡單的class定義語法和Field對象來進行聲明。
Item字段(Item Fields):Field對象指明了對每個字段的元數據。

蜘蛛Spider
定義:Spider定義了爬取的動作以及分析某個網頁的地方
Spider內部循環順序:
1.以最初的URL初始化request,並設置回調函數。當該request下載完畢並返回時,生成response,並作為參數傳給該回調函數。Spider中初始的request是通過調用start_requests()來獲取的。此函數會讀取其中的URL,並以parse為回調函數生成request。
2.在回調函數中分析返回的內容,返回Item或者一個包括二者的可叠代容器。返回的request對象之後會經過scrapy處理,下載相應的內容,並調用設置的callback函數。
3.在回調函數中,可以使用選擇器或其他的解析器卡來進行頁面分析,並根據分析的數據生成Item
4.由Spider返回的Item將被存放到數據庫(由某些Item Pipeline處理)或者使用Feed exports保存到文件中。

管道Item Pipeline
定義:當Item在Spider中被收集之後,他將被傳遞到此管道中,一些組件會按照一定的順序對Item進行處理。
作用:
1.清理HTML數據
2.驗證爬取的數據(檢查Item包含某些字段)
3.去重
4.將爬取結果保存到數據庫中。
實質:輸入/輸出
分類:
1.過濾性管道
2.加工性管道
3.存儲性管道

Python3爬蟲(十八) Scrapy框架(二)