Scrapy是用python寫的一個爬蟲框架,當然如果只是寫一些簡單爬蟲豺裆,python自己就有做爬蟲的庫知给,scrapy只是更加流水線化,各部分分工更加清晰.它的結(jié)構(gòu)如下圖:
① Scrapy Engine
引擎負責控制數(shù)據(jù)流在系統(tǒng)中所有組件中流動嘿架,并在相應動作發(fā)生時觸發(fā)事件。 詳細內(nèi)容查看下面的數(shù)據(jù)流(Data Flow)部分
② 調(diào)度器(Scheduler)
調(diào)度器從引擎接受request并將他們?nèi)腙犘ン铮员阒笠嬲埱笏麄儠r提供給引擎
③ 下載器(Downloader)
下載器負責獲取頁面數(shù)據(jù)并提供給引擎耸彪,而后提供給spider
④ Spiders
Spider是Scrapy用戶編寫用于分析response并提取item(即獲取到的item)或額外跟進的URL的類。 每 個spider負責處理一個特定(或一些)網(wǎng)站
⑤ Item Pipeline
Item Pipeline負責處理被spider提取出來的item忘苛。典型的處理有清理蝉娜、 驗證及持久化(例如存取到數(shù) 據(jù)庫中)
⑥ 下載器中間件(Downloader middlewares)
下載器中間件是在引擎及下載器之間的特定鉤子(specific hook),處理Downloader傳遞給引擎的 response扎唾。 其提供了一個簡便的機制召川,通過插入自定義代碼來擴展Scrapy功能
⑦ Spider中間件(Spider middlewares)
Spider中間件是在引擎及Spider之間的特定鉤子(specific hook),處理spider的輸入(response)和輸出 (items及requests)胸遇。 其提供了一個簡便的機制荧呐,通過插入自定義代碼來擴展Scrapy功能
流程歸納:
1.首先下載器下載request回執(zhí)的html等的response
2.然后下載器傳給爬蟲解析
3.接著爬蟲解析后交給調(diào)度器過濾,查重等等
4.最后交給管道,進行爬取數(shù)據(jù)的處理
實戰(zhàn)應用
1.創(chuàng)建爬蟲項目
1??scrapy startproject 項目名稱
2??cd進入 文件夾(與項目名稱同名) cd到spider文件夾
3??scrapy genspider 爬蟲名稱 域
通用爬蟲:scrapy genspider -t crawl 爬蟲名稱 域
2.編寫items.py
在這里定義字段
字段名 = scrapy.Field()
3.編寫spider(爬蟲文件)
先爬后忍吃觥(獲取整個網(wǎng)頁內(nèi)容获雕,再取出有用部分)
name:爬蟲的識別名,它必須是唯一的收捣,在不同的爬蟲中你必須定義不同的名字.
start_urls:包含了Spider在啟動時進行爬取的url列表届案。因此,第一個被獲取到的頁面將是其中之一罢艾。后續(xù)的URL則從初始的URL獲取到的數(shù)據(jù)中提取楣颠。我們可以利用正則表達式定義和過濾需要進行跟進的鏈接。
parse():是spider的一個方法咐蚯。被調(diào)用時童漩,每個初始URL完成下載后生成的 Response 對象將會作為唯一的參數(shù)傳遞給該函數(shù)。該方法負責解析返回的數(shù)據(jù)(response data)春锋,提取數(shù)據(jù)(生成item)以及生成需要進一步處理的URL的 Request 對象矫膨。
這個方法負責解析返回的數(shù)據(jù)、匹配抓取的數(shù)據(jù)(解析為 item )并跟蹤更多的 URL期奔。
4.存儲內(nèi)容---管道(Pipline)
數(shù)據(jù)持久化 :(切記激活管道)
1.可以自定義數(shù)據(jù)管道
def init(self,xxx,xxx,xxx):
可以設(shè)置一些參數(shù)侧馅,(比如,創(chuàng)建數(shù)據(jù)庫連接呐萌,打開文件等等)
@classmethod
def from_crawler(cls,crawler):
crawler:包含了爬蟲的一些核心組件馁痴,
可以獲取settings中的一些參數(shù)
return cls(xxx,xxx,xxx)
def open_spider(self,spider):
可選方法,在爬蟲開始的時候會調(diào)用
def process_item(self,item,spider):
所有的item,都會經(jīng)過這個方法
在這里做數(shù)據(jù)持久化(pymongo,mysql)
方法1
if isinstance(item,類名):
做數(shù)據(jù)插入操作
elif isinstance(item,類名):
做數(shù)據(jù)插入操作
方法2
1.在item對應的類中肺孤,我們定義一個方法罗晕,返回sql語句和要插入的數(shù)據(jù)
2.使用item調(diào)用這個方法,得到sql語句和要插入的管道
3.執(zhí)行插入操作
return item≡隆(如果將item,傳遞給下一個管道小渊,必須要return)
def close_spider(self,spider):
可選方法,在爬蟲結(jié)束的時候會調(diào)用
在這里關(guān)閉數(shù)據(jù)庫連接顾腊,關(guān)閉文件等