網路爬蟲_Scrapy框架入門
什麼是Scrapy?(百度百科)
Scrapy是適用於Python的一個快速、高層次的螢幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的資料。Scrapy用途廣泛,可以用於資料探勘、監測和自動化測試。
Scrapy吸引人的地方在於它是一個框架,任何人都可以根據需求方便的修改。它也提供了多種型別爬蟲的基類,如BaseSpider、sitemap爬蟲等,最新版本又提供了web2.0爬蟲的支援。
一、基本功能
Scrapy是一個適用爬取網站資料、提取結構性資料的應用程式框架,它可以應用在廣泛領域:Scrapy 常應用在包括資料探勘,資訊處理或儲存歷史資料等一系列的程式中。通常我們可以很簡單的通過 Scrapy 框架實現一個爬蟲,抓取指定網站的內容或圖片。
二、架構
綠線是資料流向
Scrapy Engine(引擎):負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,訊號、資料傳遞等。 Scheduler(排程器):它負責接受引擎傳送過來的Request請求,並按照一定的方式進行整理排列,入隊,當引擎需要時,交還給引擎。 Downloader(下載器):負責下載Scrapy Engine(引擎)傳送的所有Requests請求,並將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理。 Spider(爬蟲):四、Scrapy安裝以及生成專案
1、下載方式: widows ,開啟一個cmd,安裝需要的包
pip install wheel
pip install lxml
pip install twisted
pip install pywin32
pip install scrapy
2、開啟cmd ,輸入(預設是在C:\Users\Administrator>這個目錄下,你可以自行切換)
scrapy startproject 專案名
scrapy genspider 爬蟲名 域名
scrapy crawl 爬蟲名 (執行爬蟲)
建立後目錄大致頁如下
|-ProjectName #專案資料夾
|-ProjectName #專案目錄
|-items.py #定義資料結構
|-middlewares.py #中介軟體
|-pipelines.py #資料處理
|-settings.py #全域性配置
|-spiders
|-__init__.py #爬蟲檔案
|-baidu.py
|-scrapy.cfg #專案基本配置檔案
3、用pycharm開啟檔案
spiders下的baidu.py是scrapy自動為我們生成的
下面再看一下spdier專案的配置檔案,開啟檔案settings.py
- CONCURRENT_ITEMS:專案管道最大併發數
- CONCURRENT_REQUESTS: scrapy下載器最大併發數
- DOWNLOAD_DELAY:訪問同一個網站的間隔時間,單位秒。一般預設為0.5*
DOWNLOAD_DELAY
到1.5 *DOWNLOAD_DELAY
之間的隨機值。也可以設定為固定值,由RANDOMIZE_DOWNLOAD_DELAY
指定是否固定,預設True隨機。這裡的同一個網站可以是域名也可以是IP,由CONCURRENT_REQUESTS_PER_IP
的值決定。 - CONCURRENT_REQUESTS_PER_DOMAIN:對單個域名的最大併發
- CONCURRENT_REQUESTS_PER_IP:對單個IP的最大併發,如果值不為0,則
CONCURRENT_REQUESTS_PER_DOMAIN
引數被忽略,而且DOWNLOAD_DELAY
這個引數的同一網站指的是IP - DEFAULT_ITEM_CLASS:執行scrapy shell 命令的預設item類,預設
scrapy.item.Item
- DEPTH_LIMIT:爬取的最大深度
- DEPTH_PRIORITY:正值為廣度優先(BFO),負值為深度優先(DFO),計算公式:
request.priority = request.priority - ( depth * DEPTH_PRIORITY )
- COOKIES_ENABLED: 是否啟用cookie中介軟體,也就是自動cookie管理
- COOKIES_DEBUG:將請求cookie和響應包含Set-Cookie的寫入日誌
- DOWNLOADER_MIDDLEWARE:下載器中介軟體和優先順序的字典
- DEFAULT_REQUEST_HEADERS:用於Scrapy HTTP請求的預設標頭
- DUPEFILTER_CLASS:去重的類,可以改成使用布隆過濾器,而不使用預設的
- LOG_ENABLED:是否啟用日誌
- LOG_FILE:日誌檔案路徑,預設為None
- LOG_FORMAT:日誌格式化表示式
- LOG_DATEFORMAT:
LOG_FORMAT
中的時間格式化表示式 - LOG_LEVEL:最低日誌級別,預設DEBUG,可用:CRITICAL, ERROR, WARNING, INFO, DEBUG
- LOG_STDOUT:是否將所有標準輸出(和錯誤)將被重定向到日誌,例如print也會被記錄在日誌
- LOG_SHORT_NAMES:如果為True,則日誌將僅包含根路徑;如果設定為False,則顯示負責日誌輸出的元件
- LOGSTATS_INTERVAL:每次統計記錄列印輸出之間的間隔
- MEMDEBUG_ENABLED:是否啟用記憶體除錯
- REDIRECT_MAX_TIMES:定義可以重定向請求的最長時間
- REDIRECT_PRIORITY_ADJUST:調整重定向請求的優先順序,為正值時優先順序高
- RETRY_PRIORITY_ADJUST:調整重試請求的優先順序
- ROBOTSTXT_OBEY:是否遵循robot協議
- SCRAPER_SLOT_MAX_ACTIVE_SIZE:正在處理響應資料的軟限制(以位元組為單位),如果所有正在處理的響應的大小總和高於此值,Scrapy不會處理新的請求。
- SPIDER_MIDDLEWARES:蜘蛛中介軟體
- USER_AGENT:預設使用的User-Agent
我們主要配置下面五個:
到這裡我們嘗試用scrapy做一下爬取,開啟spider.py下的baidu.py(取決於你scrapy genspider 爬蟲名 域名時輸入的爬蟲名)
輸入一下程式碼,我們使用xpath提取百度首頁的標題title
開啟一個終端cmd,輸入scrapy crawl baidu(爬蟲名),就可以看到一大堆輸出資訊,而其中就包括我們要的內容。但是使用終端執行太麻煩了,而且不能提取資料,我們一個寫一個run檔案作為程式的入口,splite是必須寫的,目的是把字串轉為列表形式,第一個引數是scrapy,第二個crawl,第三個baidu
直接執行就可以在編輯器中輸出了
案例推薦:https://blog.csdn.net/ck784101777/article/details/104468780/