在千辛萬苦配置好Scrapy項目文件之後,同樣的過程不想再輸入一遍,配置這些東西都好繁瑣和無聊。我以前重複同樣的項目配置,一個爬蟲下來得調試個一個多小時已經算快的了,畢竟框架好多地方需要修改。
以爬取小說網站為例,不同地方在於提取標題、網址Url、內容的xpath不一樣,即只是spiders文件夾下爬蟲文件不一樣而已。
novel_xx├── novel_xx│ ├── __init__.py│ ├── items.py│ ├── middlewares.py│ ├── pipelines.py│ ├── settings.py│ └── spiders│ └── __init__.py└── scrapy.cfg
而且生成爬蟲的命令scrapy genspider xx_spider yy.com是產生xx_spider名字的爬蟲,其對應小說網站yy.com域名,並在spiders文件夾內產生xx_spider.py文件。
在工程中可以產生一個或多個spider,在spiders文件夾內產生不同名字的.py文件。
這樣可以復用Items.py、pipelines.py、settings.py等文件,即工程大部分可以復用不用修改了,這樣節省了好多時間和避免額外帶來很多不必要的錯誤和調試時間。
爬蟲設置在settings.py中,包括以下方面:
# 是否遵循爬蟲機器人ROBOTSTXT_OBEY = False# 並發是指同時處理的request的數量,調整其建議達到CPU 80%,默認16CONCURRENT_REQUESTS = 100# 正式爬取中只顯示INFO級別信息,Debug級別信息只在開始調試使用LOG_LEVEL = 'INFO'# LOG_LEVEL = 'DEBUG'# 如非必要,禁用Cookies加快爬取COOKIES_ENABLED = False# 修改默認請求頭,主要是'USER_AGENT':DEFAULT_REQUEST_HEADERS = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', 'USER_AGENT': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36',}# 使用本地緩存,減少請求網站HTTPCACHE_ENABLED = TrueHTTPCACHE_EXPIRATION_SECS = 0HTTPCACHE_DIR = 'httpcache'HTTPCACHE_IGNORE_HTTP_CODES = []HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'## 緩存策略HTTPCACHE_POLICY='scrapy.extensions.httpcache.RFC2616Policy'#針對生產環境並且應用在持續性運行環境所設置。該策略能避免下載未修改的數據(來節省帶寬,提高爬取速度)。# HTTPCACHE_POLICY='scrapy.extensions.httpcache.DummyPolicy'# #對於測試spider十分有用。其能使spider運行更快(不需要每次等待下載完成), 同時在沒有網絡連接時也能測試。# 爬蟲暫停與恢復文件夾JOBDIR='jobdir'## 是否開啟retryRETRY_ENABLED=True## 重試次數RETRY_TIMES=10## 遇到什麼http code時需要重試,默認是500,502,503,504,408,其他的,網絡連接超時等問題也會自動retry的RETRY_HTTP_CODECS=[500,502,503,504,408,404]
一般來說,現在一般的網站都幾十萬至上百萬的頁面去了,一般幾千頁面的小網站都擺不上檯面了。(作為同樣有著一個小網站的博主,這臉piapia地生疼。)
而且按照Scrapy bench的測試速度,Scrapy訪問的是localhost能夠達到3000頁面/min,換算而言是18萬/小時,一天大概是四五百萬頁面。當然了,這個是本地訪問速度。如果頁面多了之後就上分布式之類的。不過到了這麼大規模之後,得考慮反爬蟲的一些事情了。這個就扯遠了。
一般來看,可以看自己爬蟲CPU消耗、內存消耗、網絡連結情況。一般自己CPU耗費50%,網絡連接速度多大。一般文本500KiB/s已經算很大了,畢竟網站伺服器帶寬還是很貴的,從KiB/s換算為Mbps要乘以8,而且還不能影響正常用戶訪問,即爬取帶寬佔比不要過大,20%就挺好。另外爬取速度200頁面/min,每小時過萬頁面,爬蟲速度算是可以。當然了,最主要是看你要爬取完成的時間能否在一日內或幾小時內完成。畢竟花個幾天時間爬取,這個也是很冗長的流程了。
一般來說,影響爬蟲的一些因素有:
網站連結速度,同樣的網站,掛了代理和沒有代理差別還是挺大 的;還有一些小網站出口帶寬就那麼一點點,比如說常見的10Mbps帶寬,還有一些入門級的1Mbps那就洗洗睡了(在國內伺服器帶寬小的離譜一大幫站長集體臉piapia地疼)。
網站伺服器的性能,比如說有一些小網站就是很弱弱的單核CPU,你爬蟲多核都80%了,對方伺服器豈不是100%爆炸了。所以為什麼要儘量晚上爬取,白天正常訪問高峰時候搶佔資源已經妨礙了正常訪問用戶,也阻礙了自己爬取速度。
另外為什麼用Scrapy框架的地方在於,在爬取過程中會顯示很多數據和進度,方便監控爬蟲。自己用Aiohttp和線程池+requests的方法,很多時候對爬蟲進度並不是那麼直觀。Scrapy結束的時候會有一個統計,統計成功爬取頁面,耗時之類的,清楚直觀。以下面為例,總計爬取了8401頁面(downloader/request_count),耗時1151s(elapsed_time_seconds),下載量198MB(response_bytes),相當於每小時2萬多張頁面。
[scrapy.statscollectors] INFO: Dumping Scrapy stats:{'downloader/request_bytes': 3769023, 'downloader/request_count': 8401, 'downloader/request_method_count/GET': 8401, ## 下載量字節大小B 'downloader/response_bytes': 198638509, ## 爬取頁面數量 'downloader/response_count': 8401, 'downloader/response_status_count/200': 8401, ## 下載耗時 'elapsed_time_seconds': 1151.568491, 'finish_reason': 'finished', 'finish_time': datetime.datetime(2020, 8, 23, 3, 4, 15, 712938), 'httpcache/firsthand': 8401, 'httpcache/miss': 8401, 'httpcache/uncacheable': 8401, 'item_scraped_count': 7975, 'log_count/ERROR': 24, 'log_count/INFO': 8406, 'memusage/max': 91279360, 'memusage/startup': 52350976, 'request_depth_max': 1, 'response_received_count': 8401, 'scheduler/dequeued': 8401, 'scheduler/dequeued/disk': 8401, 'scheduler/enqueued': 8401, 'scheduler/enqueued/disk': 8401, 'start_time': datetime.datetime(2020, 8, 23, 2, 45, 4, 144447)}[scrapy.core.engine] INFO: Spider closed (finished)
我爬取一個大概10萬以上頁面的小說網站,剛開始時候能夠達到1200頁/min,一小時大概7萬頁面,號稱一天能達百萬量級的爬取規模(攤手狀,畢竟牛皮容易吹嘛,所以要「號稱」)。因為要下載下來小說來看,當時為了省事直接保存為txt文本文檔。現在經歷過這個事情之後,文本文檔和資料庫在大規模的訪問速度有了相當直觀的對比和明顯,以後還是直接保存到資料庫裡吧。
但是到了後面就發現速度逐步往下走了,到後面曾經一度直接變成20頁/min,這個就讓我很詫異了,這個速度也太慢了。
查看一下,發現既不是網速問題,也不是CPU和內存佔用問題,但是電腦操作也的確很卡,幹什麼都費勁。訪問該項目文件夾速度很慢,當時還在納悶是不是爬取的頁面直接保存為txt下來直接把硬碟給寫掛了?
還不得不利用CentOS7自帶的硬碟讀寫速度軟體進行測試。發現home分區測速正常;但是到了訪問項目所在分區,讀取速度就逐步往下了,到達一半的速度了。
隨著緩存文件的加大,導致了.scrapy文件夾越發加大。導致訪問該文件夾速度都很慢,因此打算把這個文件夾給清理掉。
.scrapy下面有httpcache文件夾,裡面有不同爬蟲對應的文件夾,每個文件夾下又分了眾多頁面文件夾,爬取到的頁面的緩存,分別為pickled_meta、request_headers、request_body、response_headers、response_body這五個部分。
因為在Scrapy爬蟲是這麼設置緩存的。
# 使用本地緩存,減少請求網站HTTPCACHE_ENABLED = TrueHTTPCACHE_EXPIRATION_SECS = 0HTTPCACHE_DIR = 'httpcache'HTTPCACHE_IGNORE_HTTP_CODES = []HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'## 緩存策略HTTPCACHE_POLICY='scrapy.extensions.httpcache.RFC2616Policy'#針對生產環境並且應用在持續性運行環境所設置。該策略能避免下載未修改的數據(來節省帶寬,提高爬取速度)。# HTTPCACHE_POLICY='scrapy.extensions.httpcache.DummyPolicy'# #對於測試spider十分有用。其能使spider運行更快(不需要每次等待下載完成), 同時在沒有網絡連接時也能測試。
真是不看不知道,一看嚇一跳,整個文件夾居然有幾十萬個小文件,因為我爬取了大概7萬張頁面。導致了直接圖形界面刪除文件夾大半天都沒啥反應。
後面直接用命令行刪除,命令行如下
rm -rfv .scrapy/
其中,注意文件夾後面/斜槓。-r代表遞歸刪除,刪除掉文件夾及子文件架和文件;-f代表強制刪除,不用反覆提示選擇y或者n;-v代表顯示刪除過程。用了這命令了 ,只見屏幕譁啦啦地一直滾動刪除記錄,幾十萬條也不是那麼容易刪除完畢的。後面估算了一下時間,刷屏估計時間會很久,直接把-v參數去掉,直到刪除結束之後命令行光標才恢復。
作者的其他回答:
這篇伺服器的使用經驗幫助了近千人,簡明實用,闡述到位。值得你花幾分鐘看一下。
[]
伺服器建立個人網站,看看這個,少走彎路不買錯,堪稱完美避坑指南。
[]
朋友們都點讚的伺服器選購指南,5分鐘看一遍,能節約你4小時選購時間。
[]
[]
還有好十幾篇這麼優秀的經驗分享,都收在我個人回答裡,關注我,你將獲得不一樣的經驗。
架設個人博客網站、企業門戶都可以使用ECS。如果其網站如個人博客主要面向國內用戶訪問,為加快速度還是建議選用國內的伺服器商。
[阿里雲域名] (https://wanwang.aliyun.com/domain/com/?userCode=yos4xyvp)連接,
[阿里雲伺服器ECS] (https://www.aliyun.com/minisite/goods?userCode=yos4xyvp) 連結