為什麼不推薦Selenium寫爬蟲
原文原文:為什麼不推薦Selenium寫爬蟲
最近在群里經常會看到有些朋友說,使用Selenium去採集網站,我看到其實內心是很難受的,哎!為什麼要用Selenium呢?
我想說下自己的看法,歡迎各位大佬批評。
觀點
如果可以使用 Requests
完成的,別用 Selenium
數據採集的順序
接到一個項目或者有一個採集需求時,第一步就是明確自己的需求。經常會遇到半路改需求的事情,真的很難受。
第二步就是去分析這個網站,這個在之前有提到過 採集方案策略之App抓包 :
首先大的地方,我們想抓取某個數據源,我們要知道大概有哪些路徑可以獲取到數據源,基本上無外乎三種:
PC端網站
針對移動設備響應式設計的網站(也就是很多人說的H5, 雖然不一定是H5);移動App原則是能抓移動App的,最好抓移動App,如果有針對移動設備優化的網站,就抓針對移動設備優化的網站,最後考慮PC網站。因為移動App基本都是API很簡單,而移動設備訪問優化的網站一般來講都是結構簡單清晰的HTML,而PC網站自然是最複雜的了;針對PC端網站和移動網站的做法一樣,分析思路可以一起講,移動App單獨分析。
這個時候可以借用 postman
來分析請求,參考 或許你應該學學 postman
然後下一步可能就是工程開始,各種配置,以及選擇哪種採集方式,一般來說 Scrapy 是最好用、也是最常見的框架。當然你也可以使用requests + xpath
或者 Selenium
。下面就我自己的看法來說說這三種採集方式。
三種採集差異
Scrapy
在 Scrapy 官網 上是這樣寫的:
Scrapy | A Fast and Powerful Scraping and Web Crawling Framework
關鍵詞是 Fast
和 Powerful
,使用過確實感覺如此。我感覺 Scrapy
就是一個全家桶,它把爬蟲所需要的大部分東西(為什麼不是全部,下面會說到)都集成到這個框架中,如:下載器、中間件、調度器、Spider、調試、數據流等等所有功能全部都在這一個框架中,你所需要做的只是在命令行中輸入:scrapy startproject yourproject
Scrapy 的缺點也是顯而易見的:不支持分散式。scrapy中scheduler是運行在隊列中的,而隊列是在單機內存中的,伺服器上爬蟲是無法利用內存的隊列做任何處理。但是也有解決辦法,參見rmax/scrapy-redis
Requests
來看看 Requests的文檔
Requests 唯一的一個非轉基因的 Python HTTP 庫,人類可以安全享用。
警告:非專業使用其他 HTTP 庫會導致危險的副作用,包括:安全缺陷症、冗餘代碼症、重新發明輪子症、啃文檔症、抑鬱、頭疼、甚至死亡。
作者真幽默
urllib2 VS requests
#!/usr/bin/env python # -*- coding: utf-8 -*- import urllib2gh_url = https://api.github.comreq = urllib2.Request(gh_url)password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()password_manager.add_password(None, gh_url, user, pass)auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)opener = urllib2.build_opener(auth_manager)urllib2.install_opener(opener)handler = urllib2.urlopen(req)print handler.getcode()print handler.headers.getheader(content-type)# ------ # 200 # application/json
#!/usr/bin/env python # -*- coding: utf-8 -*- import requestsr = requests.get(https://api.github.com, auth=(user, pass))print r.status_codeprint r.headers[content-type]# ------ # 200 # application/json簡單對比發現 requests 的好用之處了,剛開始學習爬蟲的時候也是從 urllib 開始,當看到 requests 果斷拋棄,就像看到 xpath 拋棄 bs4 一樣
所以如果你是初學者,那麼請毫不猶豫的選擇 requests
Selenium
最後來到今天的主角 Selenium, 首先看看官方怎麼說
What is Selenium?
Selenium automates browsers. Thats it! What you do with that power is entirely up to you. Primarily, it is for automating web applications for testing purposes, but is certainly not limited to just that. Boring web-based administration tasks can (and should!) be automated as well.Selenium has the support of some of the largest browser vendors who have taken (or are taking) steps to make Selenium a native part of their browser. It is also the core technology in countless other browser automation tools, APIs and frameworks.
重點是:it is for automating web applications for testing purposes, but is certainly not limited to just that
,翻譯過來就是:它是用於自動化Web應用程序的測試目的,但肯定不僅限於此,簡單來說,Selenium 是web自動化測試工具集,如果你去Google上搜索 Selenium ,大多結果都是 利用Selenium 自動化web 測試
相關內容,比較出名的有博客園的蟲師 @蟲師,寫的兩本書也都是關於自動化測試方面的
至於為啥爬蟲要用selenium,我在某些博客上找到有人這樣說,我也不知道怎麼說
對於一般網站來說scrapy、requests、beautifulsoup等都可以爬取,但是有些信息需要執行js才能顯現,而且你肉眼所能看到的基本都能爬取下來,在學習中遇到了,就記錄下來方便以後查看。
webdrive是selenium中一個函數:from selenium import webdriverdriver = webdriver.Chrome()driver.get(網址)其中PhantomJS同時可以換成Chrome、Firefox、Ie等等,但是PhantomJS是一個無頭的瀏覽器,運行是不會跳出相應的瀏覽器,運行相對效率較高。在調試中可以先換成Chrome,方便調試,最後再換成PhantomJS即可。
下面是吐槽時間,說一說 Selenium
的缺點:
- 速度慢。每次運行爬蟲都打開一個瀏覽器,如果沒有設置,還會載入圖片、JS等等一大堆東西;
- 佔用資源太多。有人說,把
Chrome
換成無頭瀏覽器PhantomJS
,原理都是一樣的,都是打開瀏覽器,而且很多網站會驗證參數,如果對方看到你是以PhantomJS
去訪問,會BAN掉你的請求,然後你又要考慮更換請求頭的事情,事情複雜程度不知道多了多少,為啥學Python?因為Python簡單啊,如果有更快、更簡單的庫可以實現同樣的功能,為什麼不去使用呢? - 對網路的要求會更高。
Selenium
載入了很多可能對您沒有價值的補充文件(如css,js和圖像文件)。 與僅僅請求您真正需要的資源(使用單獨的HTTP請求)相比,這可能會產生更多的流量。 - 爬取規模不能太大。你有看到哪家公司用
Selenium
作為生產環境嗎? - 難。學習
Selenium
的成本太高,只有我一個人覺得Selenium
比Requests
難一百倍嗎?
我能想到的就這麼多了,歡迎各位大佬補充。所以,如果可以使用 Requests
完成的,別用 Selenium
,OK,洗腦完成。
之前面試爬蟲工程師有一題就是:如何處理網站的登錄系統? A.瀏覽器模擬 B.HTTP請求
如果你想做測試工程師,那肯定需要學會 Selenium
,公司一個妹子就是測試,現在學了 Selenium
,工作輕鬆了好多。
最後,無恥的來個廣告,本公司招聘爬蟲工程師,希望和你成為隊友!
如果對你有幫助,可以來關注我的公眾號:zhangslob
推薦閱讀:
※左手用R右手Python系列——循環中的錯誤異常規避
※左手用R右手Python系列之——noSQL基礎與mongodb入門
※Django開發社交類網站必備的10個第三方應用
※用python做個簡單web界面選什麼框架最簡單?