回顧一下寫一個爬蟲需要做的一些步驟,使用requests庫發送網絡請求、使用lxml等解析技術對數據進行解析、使用資料庫等方法進行存儲數據,另外還可以在請求網絡的時候進行更換IP、設置請求頭等。
每次爬蟲都要幹這麼多活,如果每次都從零開始寫則比較浪費時間,所以我們需要一個框架,這個框架幫我們把一些基本的爬蟲前奏都準備好了,我們只需要「站在巨人的肩膀上」即可。而Scrapy 框架就是這個「巨人的肩膀」。
它的工作原理如下:
各模塊功能如下:
各模塊執行過程如下:
(從第二步)重複直到調度器中沒有更多地request,引擎關閉該網站。
原理圖及執行過程的描述參考於這篇文章:Scrapy架構圖(工作原理)
如果覺得很不理解沒關係,可以先往下學,之後再回過頭來看這張圖就會豁然開朗了。
使用Scrapy之前需要先安裝:pip install scrapy 。
如果在window系統下,還需安裝一個東西:pip install pypiwin32
創建項目:
進入你想把此項目存放的目錄,使用命令 scrapy startproject 項目名稱 來創建項目。如 scrapy startproject scrapy_demo
用pycharm或其他編輯器打開該項目,項目結構如下:
主要文件的作用:
以上步驟只是創建了項目,下一步還需要創建爬蟲(我們在爬蟲文件夾下進行寫代碼)
創建爬蟲前需要先進入到剛才創建的項目中,然後通過命令 scrapy genspider 爬蟲名字 要爬取網站的域名 。如scrapy genspider demo1 baidu.com 注意:爬蟲名字不能跟項目名字重複。
此時,你會發現spiders文件夾下多了個demo1文件,內容如下:
allowed_domains是指以後所有的爬蟲的連結都是在該域名下的,並不會說你要爬取百度的網址,卻給你爬了個谷歌的網址。
stats_urls是指爬蟲剛啟動時是向該連結發送網絡請求。
這些都創建好之後,就可以運行項目了,需要注意的是,在編輯器中是無法直接運行的,需要進入到爬蟲文件夾下運行cmd命令 scrapy crwal 爬蟲名字 運行項目。放心,以後在編輯器中有便捷方式來運行,現在先不介紹。
至此,一個scrapy就成功創建並運行起來了。來回顧一下剛才的操作:
pipelines.py文件函數:
__init__(self) 構造函數,創建pipelines時執行
open_spider(self,spider) spider(爬蟲) 被打開時自動執行
process_item(self, item, spider)當爬蟲有item傳入時被調用
close_spider(self,spider) 當spider(爬蟲)被關閉的時候執行
tips: 一般需要存儲文件時在__init__(self)或者open_spider(self,spider) 中編寫打開文件的操作或者連結資料庫操作,在process_item(self, item, spider)中編寫寫入數據的操作,最後在close_spider(self,spider)中關閉文件或資料庫
settings.py文件常用設置:
ROBOTSTXT_OBEY = True 是否遵循機器人協議,我們需要把它改成False
DEFAULT_REQUEST_HEADERS 設置請求頭
DEFAULT_REQUEST_HEADERS = { &39;: &39;, &39;: &39;, 39;User-Agent&39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362&39;scrapy_demo.middlewares.ScrapyDemoDownloaderMiddleware&39;scrapy_demo.middlewares.UserAgentDownloadMiddleware&39;scrapy_demo.middlewares.IPProxyDownloadMiddlleware& 導入命令行from scrapy import cmdline34;scrapy crawl 項目名&39;scrapy_demo.middlewares.ScrapyDemoDownloaderMiddleware&39;scrapy_demo.middlewares.UserAgentDownloadMiddleware&39;scrapy_demo.middlewares.IPProxyDownloadMiddlleware& 在item模型中定義好要保存的數據 39;qsbk.json&39;a&39;utf-8& 此時的item為QsbkItem類型,需要轉成字典才可以變成json text = json.dumps(dict(item), ensure_ascii=False) self.fp.write(text + &39;) return item def close_spider(self, spider): self.fp.close()
記得要在settings中打開pipelines。
小結:
原文連結:https://blog.csdn.net/weixin_43521592/java/article/details/106962079