Scrapy框架的原理及簡單使用
一.介紹:
Scrapy是一個純Python編寫,為了爬取網站資料,提取結構性資料而編寫的應用框架。 可以應用在包括資料探勘,資訊處理或儲存歷史資料等一系列的程式中。
二.環境搭建:
Scrapy的安裝:1. scrapy需要安裝第三方庫檔案,lxml和Twisted
2. 下載地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/
3.下載好檔案之後,在DOS命令下pip install 檔案的位置(lxml,twisted)安裝。這裡如果報錯,提示更新pip.就輸入python -m pip install --upgrade pip 命令
安裝完成就可以安裝:pip install scrappy
還需要安裝 win32(啟動蜘蛛的時候會提示安裝,根據python版本來的我32位)
pip install pypiwin32
Scrapy API地址:https://docs.scrapy.org/en/latest/
三.架構
元件詳解:
ScrapyEngine (引擎)
引擎相當於Scrapy的心臟,負責控制資料在各元件之間流動,並在相應動作發生時觸發事件
Scheduler (排程器)
引擎將要處理的request交給排程器排隊等候,等待引擎呼叫後返回request
Downloader (下載器)
下載器負責獲取頁面資料,返回response響應給引擎,而後給Spider
Downloader(下載器中介軟體)
下載器中介軟體位於下載器和引擎之間,處理Downloader返回給引擎的response,通過自定義程式碼來擴充套件功能
Spider Middlewares (Spider中介軟體)
Spider中介軟體位於Spider和引擎之間,處理Spider的輸入response和輸出Item和requests,通過自定義程式碼
來擴充套件功能
Spider (蜘蛛)
Spider是Scrapy使用者編寫的用於分析和處理Response並返回Item或額外跟進的Url的類,每個Spider負責處
理一個(或一些)特定的網站
ItemPipeline (管道)
Item Pipeline負責處理被spider提取出來的item.典型的處理有清理、 驗證及持久化(例如存取到資料庫中)。
Scrapy執行流程:
1.引擎訪問spider,spider執行,執行start_request返回需要處理的請求request交給引擎
2.引擎將request交給排程器secheduler排隊等待呼叫
3.排程器將request請求交給引擎,引擎將request交給下載器Downloader,在Internet進行下載,後返回response給引擎
4.引擎判斷是response將其交給Spider蜘蛛進行解析返回Item和requests給引擎
5.如果是Item,引擎將item交給管道piplines進行儲存等操作,是request的話。同樣交給secheduler處理
6.在item中如果發現url,也會返回request給引擎,再交給排程器處理
7.然後當下一個請求要處理的時候,再從頭開始依次執行
下面開始用程式碼簡單的瞭解一下Scrapy:
首先在命令列裡打一些命令(前提是下載好所需要的環境)
第一步:建立專案 scrapy startproject 專案名 然後cd 專案名目錄裡
第二步:建立蜘蛛 scrapy genspider 蜘蛛名 要爬取的路徑
這裡我們就將蜘蛛建立成功了。然後用idea工具開啟專案
一。首先。編寫我們自定義的蜘蛛類kgcSpider.py。如下:
二。下面編寫Items.py,封裝結構化資料
三。接著編寫管道,pipline.py。管道負責接收Item並決定,Item是否刪除繼續或不再處理
class KgcPipeline(object):
def open_spider(self,spider):
'''
當蜘蛛啟動時自動執行
:param spider:
:return:
'''
self.file=open('kgc.csv','w',encoding='utf8') #開啟檔案,將資料寫入檔案中
def close_spider(self,spider):
'''
當蜘蛛啟完成工作並關閉時執行
:param spider:
:return:
'''
self.file.close()
def process_item(self, item, spider):
'''
蜘蛛每yield一個item,這個方法執行一次
:param item:
:param spider:
:return:
'''
line=item['title']+","+item['price']+','+item['personNum']+"\n"
self.file.write(line)
return item
PS:在使用ItemPipline之前必須啟用管道,到settings.py裡將下面這行註釋去掉
四。由於要爬取圖片。我們要使用圖片管道所,以在settings.py裡進行設定
在ITEM_PIPELINES中新增 'scrapy.pipelines.images.ImagesPipeline':1,
啟用圖片管道
然後再其他地方加上下面這句來設定圖片的路徑:
IMAGES_STORE = '/home/hadoop/IdeaProjects/kgc/images'
五。最後。用scrapy crawl 蜘蛛名 來執行蜘蛛.
或者使用cmdline模組的execute來執行
神奇的事情就發生了