Scrapy架構(gòu)圖
Scrapy框架模塊功能:
- Scrapy Engine(引擎):Scrapy框架的核心部分樱哼。負責在Spider和ItemPipeline良姆、Downloader冀泻、Scheduler中間通信二跋、傳遞數(shù)據(jù)等。
- Spider(爬蟲):發(fā)送需要爬取的鏈接給引擎信柿,最后引擎把其他模塊請求回來的數(shù)據(jù)再發(fā)送給爬蟲,爬蟲就去解析想要的數(shù)據(jù)醒第。這個部分是我們開發(fā)者自己寫的渔嚷,因為要爬取哪些鏈接,頁面中的哪些數(shù)據(jù)是我們需要的稠曼,都是由程序員自己決定形病。
- Scheduler(調(diào)度器):負責接收引擎發(fā)送過來的請求,并按照一定的方式進行排列和整理霞幅,負責調(diào)度請求的順序等漠吻。
- Downloader(下載器):負責接收引擎?zhèn)鬟^來的下載請求,然后去網(wǎng)絡(luò)上下載對應(yīng)的數(shù)據(jù)再交還給引擎司恳。
- Item Pipeline(管道):負責將Spider(爬蟲)傳遞過來的數(shù)據(jù)進行保存途乃。具體保存在哪里,應(yīng)該看開發(fā)者自己的需求扔傅。
- Downloader Middlewares(下載中間件):可以擴展下載器和引擎之間通信功能的中間件耍共。
- Spider Middlewares(Spider中間件):可以擴展引擎和爬蟲之間通信功能的中間件。
Scrapy文檔
安裝Scrapy框架
- 安裝‘scrapy’:通過‘pip install scrapy’即可安裝猎塞。
- 如果在windows下划提,還需要安裝‘pypiwin32’,安裝方式‘pip install pipiwin32’邢享。
- 如果在ubuntu下鹏往,還需安裝以下三方庫:‘sudo apt-get install python3-dev build-essential python3-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev’,然后再通過pip install scrapy安裝骇塘。
創(chuàng)建項目和爬蟲:
- 創(chuàng)建項目:‘scrapy startproject +爬蟲的名字’伊履。
- 創(chuàng)建爬蟲:進入到項目所在路徑,執(zhí)行命令:scrapy genspider +爬蟲的名字 +"爬蟲的域名"款违。注意唐瀑,爬蟲的名字不能和項目名稱一致。
項目目錄結(jié)構(gòu):
- items.py:用來存放爬蟲爬取下來數(shù)據(jù)的模型插爹。
- middlewares.py:用來存放各種中間件的文件哄辣。
- pipelines.py:用來將items的模型存儲到本地磁盤中。
- settings.py:本爬蟲的一些配置信息(比如請求頭赠尾、多久發(fā)送一次請求力穗、ip代理池等)。
- scrapy.cfg:項目的配置文件气嫁。
- spiders包:以后所有的爬蟲当窗,都是存放到這個里面。
糗事百科案例Scrapy爬蟲筆記
- response是一個‘scrapy.http.response.html.HtmlResponse’對象寸宵⊙旅妫可以執(zhí)行‘xpath’和‘css’語法來提取數(shù)據(jù)元咙。
- 提取出來的數(shù)據(jù),是一個‘Selector’或者是一個‘SelectorList’對象巫员。如果想要獲取其中的字符串庶香,那么應(yīng)該執(zhí)行‘getall’或者‘get’方法。
- getall方法:獲取‘Selector’中的所有文本简识。返回的是一個列表赶掖。
- get方法:獲取‘Selector’中得第一個文本。返回的是一個str類型财异。
- 如果數(shù)據(jù)解析回來,要傳給pipeline處理唱遭。那么可以使用‘yield’來返回戳寸。或者是收集所有的item拷泽,最后統(tǒng)一使用return返回疫鹊。
- item:建議在‘items.py’中定義好模型。以后就不要使用字典司致。
- pipeline:這個是專門用來保存數(shù)據(jù)的拆吆。其中有三個方法時會經(jīng)常用到:
*‘open_spider(self, spider)’:當爬蟲打開的時候執(zhí)行。
*‘process_item(self, item, spider)’:當爬蟲有item傳過來的時候被調(diào)用脂矫。
*‘close_spider(self, spider)’:當爬蟲關(guān)閉的時候執(zhí)行枣耀。
要激活pipeline,應(yīng)該在‘settings.py’中庭再,設(shè)置‘ITEM_PIPELINES’捞奕。
JsonItemExporter和JsonLinesItemExporter:
保存json數(shù)據(jù)的時候,可以使用這兩個類拄轻,讓操作變得更簡單颅围。
- ‘JsonItemExporter’:每次把數(shù)據(jù)添加到內(nèi)存中。最后統(tǒng)一寫入到磁盤中恨搓。優(yōu)點:存儲的數(shù)據(jù)滿足json規(guī)則的數(shù)據(jù)院促。缺點:當數(shù)據(jù)量比較大時,內(nèi)存消耗嚴重斧抱。示例代碼如下:
from scrapy.exporters import JsonItemExporter
class QsbkPipeline(object):
def __init__(self):
self.fp = open("joke.json", "wb")
self.exporter = JsonItemExporter(self.fp, ensure_ascii=False, encoding='utf-8')
self.exporter.start_exporting()
def open_spider(self, spider):
print("爬蟲開始了")
def process_item(self, item, spider):
self.exporter.export_item(item)
return item
def close_spider(self, spider):
self.exporter.finish_exporting()
self.fp.close()
print("爬蟲結(jié)束了")
- ‘JsonLinesItemExporter’:每次調(diào)用‘export_item’的時候就把這個item存儲到硬盤中常拓。優(yōu)點:內(nèi)存消耗低,數(shù)據(jù)安全性高辉浦。缺點:每一個字典是一行墩邀,整個文件不是一個滿足json格式的文件。示例代碼如下:
from scrapy.exporters import JsonLinesItemExporter
class QsbkPipeline(object):
def __init__(self):
self.fp = open("joke.json", "wb")
self.exporter = JsonLinesItemExporter(self.fp, ensure_ascii=False, encoding='utf-8')
def open_spider(self, spider):
print("爬蟲開始了")
def process_item(self, item, spider):
self.exporter.export_item(item)
return item
def close_spider(self, spider):
self.fp.close()
print("爬蟲結(jié)束了")