優化python爬蟲scrapy

2020-10-08 每日長點知識君

項目的復用

在千辛萬苦配置好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.pypipelines.pysettings.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)

Scrapy運行越來越慢

我爬取一個大概10萬以上頁面的小說網站,剛開始時候能夠達到1200頁/min,一小時大概7萬頁面,號稱一天能達百萬量級的爬取規模(攤手狀,畢竟牛皮容易吹嘛,所以要「號稱」)。因為要下載下來小說來看,當時為了省事直接保存為txt文本文檔。現在經歷過這個事情之後,文本文檔和資料庫在大規模的訪問速度有了相當直觀的對比和明顯,以後還是直接保存到資料庫裡吧。

但是到了後面就發現速度逐步往下走了,到後面曾經一度直接變成20頁/min,這個就讓我很詫異了,這個速度也太慢了。

查看一下,發現既不是網速問題,也不是CPU和內存佔用問題,但是電腦操作也的確很卡,幹什麼都費勁。訪問該項目文件夾速度很慢,當時還在納悶是不是爬取的頁面直接保存為txt下來直接把硬碟給寫掛了?

還不得不利用CentOS7自帶的硬碟讀寫速度軟體進行測試。發現home分區測速正常;但是到了訪問項目所在分區,讀取速度就逐步往下了,到達一半的速度了。


隨著緩存文件的加大,導致了.scrapy文件夾越發加大。導致訪問該文件夾速度都很慢,因此打算把這個文件夾給清理掉。

.scrapy下面有httpcache文件夾,裡面有不同爬蟲對應的文件夾,每個文件夾下又分了眾多頁面文件夾,爬取到的頁面的緩存,分別為pickled_metarequest_headersrequest_bodyresponse_headersresponse_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) 連結

為什麼選擇阿里雲

  1. 以前域名註冊一般選老牌域名服務商,其中萬網已經被阿里收購到旗下了。
  2. 提供域名備案服務。備案業務還是很貼心的。提交完備案信息之後,第二天阿里雲小姐姐會幫你免費形式審查一下,還會主動打電話過來幫助校正。如果是自己動手提交備案信息給ICP備案機構,萬一因為低級錯誤被駁回就浪費了十天左右時間。
  3. 域名ICP備案需要伺服器,阿里雲也提供伺服器購買,一條龍服務嘛。伺服器在阿里雲畢竟伺服器才是支出大頭,域名什麼的都是小意思了。而且購買完伺服器之後,還會有客服主動打電話過來詢問使用情況,需不需要技術支持,還是挺不錯的。
  4. 阿里雲伺服器購買新用戶有優惠,最基礎的話一年下來不超過100元。如果是本科生的話免費使用的。
  5. 備案完成之前,伺服器不算租賃時間。比如說3月1日我購買了一年的伺服器,域名提交備案。18日域名備案審核通過。伺服器租賃時間重新按18日算起,即可以用到第二年3月18日。相當於免費多用幾天。佔了一點小便宜。

相關焦點

  • Python 爬蟲框架Scrapy 簡單介紹
    當前Scrapy 最新版本為1.5,支持python2.7 和python3.4+版本的python。Linux/Mac在linux 和 Mac 系統下,可使用 pip安裝。pip install scrapy windows在windows上安裝的話,需要按照的依賴包比較多。
  • 進階爬蟲框架Scrapy,告別單一爬蟲
    如果頁面用到ajax之類動態加載的,可以通過分析原碼爬人家的json(學習下python裡json的包)。提取html裡的內容,就是我們要爬的內容啦,這個方法有很多,比如正則式,比如xpath,比如BeautifulSoup等等,我主要是用xpath,複雜一點的情況會配合正則用。
  • python爬蟲29 | 使用scrapy爬取糗事百科
    這個框架到底有多牛b那麼接下來就是學習 python 的正確姿勢在你想要存放的爬蟲文件目錄下使用命令來創建一個 scrapy 爬蟲項目比如在這裡我們要創建一個 qiushibaike 的爬蟲項目要使用 scrapy 爬蟲我們就需要繼承 scrapy.Spider 這個類
  • python爬蟲小白——scrapy的使用
    本文中的知識點:安裝scrapyscrapy的基礎教程scrapy使用代理安裝scrapy以下的演示是基於windows系統,windows與linux都可以用。安裝好後,確認scrapy是否安裝scrapy genspider baidu "baidu.com"看到命令已經幫我們自動創建了爬蟲代碼,打開文件看下。
  • Python爬蟲:Scrapy-redis分布式爬蟲講解
    Github地址:https://github.com/rmax/scrapy-redis安裝:pip install scrapy-redisscrapy_redis在scrapy的基礎上實現了更多,更強大的功能,具體體現在:
  • python scrapy 爬蟲筆記匯總,如何寫 一個專業的scrapy爬蟲
    之前我們已經寫好了scrapy網絡爬蟲爬取極品笑話大全,但是不夠專業,要在items 中定義好模型。整個爬取數據的模型,我們這個比較簡單,只有一個內容,有的還要爬取title,這些,我們就要寫上title=scrapy.Field()Scrapy 爬蟲匯總:1.Response 是一個scrapy.http.response.html HtmlResponse 對像,可以執行』xpath』,』css』來提取數據2.提取出來的數據是一個『selector』或者
  • 使用Scrapy網絡爬蟲框架小試牛刀
    命令pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simplescrapy創建爬蟲項目命令scrapy startproject <項目名稱>示例:創建一個糗事百科的爬蟲項目(記得cd到一個乾淨的目錄哈)scrapy startproject
  • python 爬蟲框架Scrapy使用方法
    Python作為腳本語言,功能非常強大,這裡介紹一下爬蟲框架Scrapy有安裝及使用方法介紹。一、安裝篇python3在安裝scrapy時,需要twisted的支持,但安裝twisted會需要visual studio的支持,詳見本人的另一文章Python 3.5 安裝scrapy無法找到vcvarsall.bat解決方案.
  • Crawlab準備之python+scrapy環境搭建
    上篇《分布式爬蟲管理平臺Crawlab開發搭建》把爬蟲的管理後臺搭建起來了;搗鼓一番發現要真正爬取數據還有下不少的功夫。這篇看看怎麼搭建python+scrapy環境。0x01:安裝Python3下載python安裝包,具體版本根據自己的系統要求https://www.python.org/downloads/windows/下載安裝完成後直接cmd輸入python,可正常查看版本
  • 簡單使用scrapy爬蟲框架批量採集網站數據
    本篇文章就使用python爬蟲框架scrapy採集網站的一些數據。 Scrapy的爬蟲項目的創建流程 1.創建一個爬蟲項目 在Pycharm中選擇 Terminal 在 Local 裡面輸入 scrapy startproject +(項目名字
  • 小叮噹高級爬蟲(一):爬蟲利器Scrapy
    Scrapy簡介Scrapy是一個為了爬取網站數據、提取結構性數據而完全由python編寫的應用框架。所謂「框架」,便是整個或部分系統的可重用設計。在python中也可以說,一個框架就是一個可復用的「巨大模塊」。
  • Scrapy爬蟲框架新手入門教程
    : 項目配置文件douban/: 項目python模塊, 代碼將從這裡導入douban/items.py: 項目items文件,存要爬取的欄位信息,可以插入資料庫、寫入txt等douban/pipelines.py: 項目管道文件
  • 「小白學爬蟲連載(8)」——scrapy框架入門教程
    這些文件分別是:scrapy.cfg: 項目的配置文件tutorial/: 該項目的python模塊。之後您將在此加入代碼。tutorial/items.py: 項目中的item文件.tutorial/pipelines.py: 項目中的pipelines文件.
  • scrapy爬蟲框架的運用
    # scrapy# 爬蟲框架- 框架- 爬蟲框架- scrapy- pyspider- crawley- scrapy框架介紹- https://doc.scrapy.org/en/latest/- http://scrapy-chs.readthedocs.io
  • 13天搞定python網絡爬蟲
    解析數據HTML Dom解析正則匹配,通過的正則表達式來匹配想要爬取的數據,如:有些數據不是在html 標籤裡,而是在html的script 標籤的js變量中使用第三方庫解析html dom,比較喜歡類jquery的庫數據字符串正則匹配(根據情景使用)轉 JSON/XML 對象進行解析9. python
  • Python爬蟲技術路線?
    原標題:Python爬蟲技術路線?     對於初學者而言,Python爬蟲的技術路線應該怎麼取捨?     首先展示一下如何用python爬蟲requests庫進行爬取,requests庫是python爬蟲最基礎也必須掌握的庫。
  • scrapy使用快速入門
    首先你要具備以下能力:#有一定的python基礎和編程思想,#具有一定的liunx系統管理基礎#掌握基本資料庫操作,增刪改查等,#了解html,css,js相關方面的知識建議使用Pycharm開發工具,方便調試下面我們開始寫爬蟲程序1、創建一個scrapy
  • Python爬蟲框架:scrapy爬取迅雷電影天堂最新電影
    項目開始第一步仍然是創建scrapy項目與spider文件切換到工作目錄兩條命令依次輸入scrapy startproject xunleidianyingscrapy genspider xunleiBT https://www.xl720
  • 小叮噹高級爬蟲(三):Scrapy shell 命令行模式
    經過「小叮噹高級爬蟲(一):爬蟲利器Scrapy」想必大家都已經了解了Scrapy。今天,我們來看下「Scrapy shell」命令行模式。Scrapy shell 簡介Scrapy shell也稱"Scrapy終端",是一個交互終端,使我們可以在未啟動spider爬蟲的情況下嘗試及調試代碼。
  • 爬蟲基礎面試題(Python篇)
    2:scrapy和scrapy-redis的區別? scrapy是一個爬蟲通用框架,但不支持分布式,scrapy-redis是為了更方便的實現scrapy分布式爬蟲,而提供了一些以redis為基礎的組件 為什麼會選擇redis資料庫?