用Python寫爬蟲,用什麼方式、框架比較好?

以前只寫過很簡單的Python爬蟲,直接用內置庫實現,有沒有誰用Python爬過規模較大的數據,用的是什麼方法?

還有,採用現有的Python爬蟲框架,相比與直接使用內置庫,優勢在哪?因為Python本身寫爬蟲已經很簡單了。


可以看看 Scrapy ( http://scrapy.org/ ),基於這個框架來寫自己的爬蟲


由於項目需求收集並使用過一些爬蟲相關庫,做過一些對比分析。以下是我接觸過的一些庫:

  • Beautiful Soup。名氣大,整合了一些常用爬蟲需求。缺點:不能載入JS。
  • Scrapy。看起來很強大的爬蟲框架,可以滿足簡單的頁面爬取(比如可以明確獲知url pattern的情況)。用這個框架可以輕鬆爬下來如亞馬遜商品信息之類的數據。但是對於稍微複雜一點的頁面,如weibo的頁面信息,這個框架就滿足不了需求了。
  • mechanize。優點:可以載入JS。缺點:文檔嚴重缺失。不過通過官方的example以及人肉嘗試的方法,還是勉強能用的。
  • selenium。這是一個調用瀏覽器的driver,通過這個庫你可以直接調用瀏覽器完成某些操作,比如輸入驗證碼。
  • cola。一個分散式爬蟲框架。項目整體設計有點糟,模塊間耦合度較高,不過值得借鑒。

以下是我的一些實踐經驗:

  • 對於簡單的需求,比如有固定pattern的信息,怎麼搞都是可以的。
  • 對於較為複雜的需求,比如爬取動態頁面、涉及狀態轉換、涉及反爬蟲機制、涉及高並發,這種情況下是很難找到一個契合需求的庫的,很多東西只能自己寫。

至於題主提到的:

還有,採用現有的Python爬蟲框架,相比與直接使用內置庫,優勢在哪?因為Python本身寫爬蟲已經很簡單了。

third party library可以做到built-in library做不到或者做起來很困難的事情,僅此而已。還有就是,爬蟲簡不簡單,完全取決於需求,跟Python是沒什麼關係的。


要處理 js 運行後的結果,可以使用 html5lib。

但我覺得最好的是用 beautifulsoup4 的介面,讓它內部用 html5lib。


下面基本是我整理的目前主流的Python領域和框架了,歡迎大家討論。

————

現在Python成為了刺手可熱的一門語言,在如何快速入門的同時,如何進行高效的開發是一門語言非常重要的優勢。我們收集馬哥Python了超過2000名學員的意見和建議,對Python常用的框架進行了梳理,這些框架包括事件I/O,OLAP,Web開發,高性能網路通信,測試,爬蟲等。

Python目前主流的應用包括:Web開發、圖形界面開發、系統網路運維、網路編程、科學數字計算、3D遊戲開發,而我們特別針對這6個方向進行了框架和庫的整理。

一、Python的幾大主流Web開發框架

1.Django: Python Web應用開發框架

Django 應該是最出名的Python框架,GAE甚至Erlang都有框架受它影響。Django是走大而全的方向,它最出名的是其全自動化的管理後台:只需要使用起ORM,做簡單的對象定義,它就能自動生成資料庫結構、以及全功能的管理後台。

網址:The Web framework for perfectionists with deadlines

2.Bottle: 微型Python Web框架

Bottle是一個簡單高效的遵循WSGI的微型python Web框架。說微型,是因為它只有一個文件,除Python標準庫外,它不依賴於任何第三方模塊。

網址:Bottle: Python Web Framework

3.Flask:也是一個Web應用框架

不同於Django它是輕量級Web應用框架。基於Werkzeug WSGI工具箱和Jinja2 模板引擎。Flask也被稱為「microframework」,因為它使用簡單的核心,用extension增加其他功能。Flask沒有默認使用的資料庫、窗體驗證工具。 但是Flask是可以擴增的,你可以使用可以用Flask-extension增加前邊沒有的一些功能。

網址:Flask (A Python Microframework)

4.Tornado:非同步非阻塞IO的Python Web框架

Tornado的全稱是Torado Web Server,從名字上看就可知道它可以用作Web伺服器,但同時它也是一個Python Web的開發框架。最初是在FriendFeed公司的網站上使用,FaceBook收購了之後便開源了出來。Tornado 和現在的主流 Web 伺服器框架和大多數Python框架有著明顯的區別:它是非阻塞式伺服器,而且速度相當快。也是比較常被使用的Python開源框架之一。

網址:Tornado Web Server - Tornado 4.5.1 documentation

Web2py:全棧式Web框架

Web2py是一個為Python語言提供的全功能Web應用框架,旨在敏捷快速的開發Web應用,具有快速、安全以及可移植的資料庫驅動的應用,兼容Google App Engine。

網址:http://www.web2py.com/

webpy: 輕量級的Python Web框架

webpy的設計理念力求精簡(Keep it simple and powerful),源碼很簡短,只提供一個框架所必須的東西,不依賴大量的第三方模塊,它沒有URL路由、沒有模板也沒有資料庫的訪問。

網址:Welcome to web.py! (web.py)

二、Python的爬蟲框架

Scrapy:Python的爬蟲框架

Scrapy是一個使用Python編寫的,輕量級的,簡單輕巧,並且使用起來非常的方便。

網址:A Fast and Powerful Scraping and Web Crawling Framework

三、圖形界面開發框架

PyQt

PyQt能夠實現高人氣Qt庫,因此如果大家熟知如何利用其它語言進行Qt開發,那麼上手PyQt也不會出現什麼障礙。其能夠讓Python應用具備跨平台外觀風格與使用感受,同時繼承Qt社區所帶來的龐大知識支持與工具選項。

PyQt同時提供商用與GPL許可(這一點與Qt項目本身有所不同),感興趣的朋友也可點擊此處了解與PyQt許可相關的常見問題(英文原文)。

網址:Riverbank | Software | PyQt | What is PyQt?

Tkinter

如果要為Python選出一款能夠稱得上「標準」的GUI工具包,那麼答案應該是Tkinter。Tkinter是一款以Tcl/Tk為基礎的打包工具,而後者則屬於誕生自上世紀九十年代初的高人氣圖形界面與語言組合。Tkinter的最大優勢在於擁有豐富的資源,其中包括文本與代碼示例以及龐大的用戶社區。通過示例,我們能夠輕鬆上手這套圖形界面實現方案。

Tkinter遵循Python許可,同時基於Tcl/Tk的BSD許可。

網址:24.1. Tkinter - Python interface to Tcl/Tk - Python 2.7.13 documentation

WxPython

WxPython 將針對C++的wxWidgets跨平台GUI庫帶給了Python。WxPython是一套較為現代的方案,其外觀的原生程度高於Tkinter,這主要歸功於其更傾向於針對不同系統平台建立控制項成果。其易於上手,同時擁有快速發展的開發者社區。不過大家需要自行將wxPython與應用相綁定,因為其無法通過Python自動進行安裝。

WxPython採用其父項目wxWindows的庫許可,這一許可獲得了OSI批准。

網址:Welcome to wxPython!

四、Python系統運維常用庫

1、psutil是一個跨平台庫(http://code.google.com/p/psutil/)

能夠實現獲取系統運行的進程和系統利用率(內存,CPU,磁碟,網路等),主要用於系統監控,分析和系統資源及進程的管理。

2、IPy(http://github.com/haypo/python-ipy),輔助IP規劃。

3、dnspython(http://dnspython.org)Python實現的一個DNS工具包。

4、difflib:difflib作為Python的標準模塊,無需安裝,作用是對比文本之間的差異。

5、filecmp:系統自帶,可以實現文件,目錄,遍歷子目錄的差異,對比功能。

6、smtplib:發送電子郵件模塊

7、pycurl(http://pycurl.sourceforge.net)是一個用C語言寫的libcurl Python實現,功能強大,支持的協議有:FTP,HTTP,HTTPS,TELNET等,可以理解為Linux下curl命令功能的Python封裝。

8、XlsxWriter:操作Excel工作表的文字,數字,公式,圖表等。

9、rrdtool:用於跟蹤對象的變化,生成這些變化的走走勢圖

10、scapy(http://www.wecdev.org/projects/scapy/)是一個強大的互動式數據包處理程序,它能夠對數據包進行偽造或解包,包括發送數據包,包嗅探,應答和反饋等功能。

11、Clam Antivirus免費開放源代碼防毒軟體,pyClamad,可以讓Python模塊直接使用ClamAV病毒掃描守護進程calmd。

12、pexpect:可以理解成Linux下expect的Python封裝,通過pexpect我們可以實現對ssh,ftp,passwd,telnet等命令行進行自動交互,而無需人工干涉來達到自動化的目的。

13、paramiko是基於Python實現的SSH2遠程安裝連接,支持認證及密鑰方式。可以實現遠程命令執行,文件傳輸,中間SSH代理等功能。相對於Pexpect,封裝的層次更高,更貼近SSH協議的功能,官網地址:http://paramiko.org(依賴:Crypto,Ecdsa,Python開發包python-devel)

14、fabric是基於Python實現的SSH命令行工具,簡化了SSH的應用程序部署及系統管理任務,它提供了系統基礎的操作組件,可以實現本地或遠程shell命令,包括命令執行,文件上傳,下載及完整執行日誌輸出等功能。Fabric在paramiko的基礎上做了更高一層的封裝,操作起來更加簡單。官網地址:http://www.fabfile.org(依賴setuptools,Crypto,paramiko包支持)

15、CGIHTTPRequestHandler實現對CGI的支持。

16、ansible(http://www.ansibleworks.com/)一種集成IT系統的配置管理,應用部署,執行特定任務的開源平台。基於Python實現,由Paramiko和PyYAML兩個關鍵模塊構建。Ansibl與Saltstack最大的區別是Ansible無需在被控主機上部署任何客戶端,默認直接通過SSH通道進行遠程命令執行或下發功能。

17、YAML:是一種用來表達數據序列的編程語言。

18、playbook:一個非常簡單的配置管理和多主機部署系統。

19、saltstack(http://saltstack.com)是一個伺服器基礎架構集中化管理平台,一般可以理解為簡化版的puppet和加強版的func。Saltstack基於Python語言實現,結合輕量級消息隊列ZeroMQ,與Python每三方模塊(Pyzmq,PyCrypto,Pyjinja2,python-msgpack和PyYAML等)構建。

20、func,為解決集群管理,監控問題需設計開發的系統管理基礎框架。

四、Python科學數字計算的框架

Python中的數據科學計算庫有Numpy、Scipy、pandas、matplotlib

Numpy是一個基礎性的Python庫,為我們提供了常用的數值數組和函數。numpy(Numerical Python extensions)是一個第三方的Python包,用於科學計算。這個庫的前身是1995年就開始開發的一個用於數組運算的庫。經過了長時間的發展,基本上成了絕大部分Python科學計算的基礎包,當然也包括所有提供Python介面的深度學習框架。

網址:NumPy - NumPy

Scipy是Python的科學計算庫,對Numpy的功能進行了擴充,同時也有部分功能是重合的。Numpy和Scipy曾經共享過基礎代碼。

網址:SciPy.org - SciPy.org

pandas是一個流行的開源Python項目,它的名稱取panel data(面板數據,一個計量經濟學的術語)和Python data analysis(Python數據分析)的意思。matplotlib是一個基於Numpy的繪圖庫。

網址:Python Data Analysis Library

Matplotlib是Python中最常用的可視化工具之一,可以非常方便地創建海量類型地2D圖表和一些基本的3D圖表。Matplotlib最早是為了可視化癲癇病人的腦皮層電圖相關的信號而研發,因為在函數的設計上參考了MATLAB,所以叫做Matplotlib。Matplotlib首次發表於2007年,在開源和社區的推動下,現在在基於Python的各個科學計算領域都得到了廣泛應用。Matplotlib的原作者John D. Hunter博士是一名神經生物學家,2012年不幸因癌症去世,感謝他創建了這樣一個偉大的庫。

網址:Python plotting - Matplotlib 2.0.2 documentation

四、Python的3D遊戲開發框架

Pygame是跨平台Python模塊,專為電子遊戲設計。包含圖像、聲音。pygame建立在SDL基礎上,允許實時電子遊戲研發而無需被低級語言(如機器語言和彙編語言)束縛。基於這樣一個設想,所有需要的遊戲功能和理念都(主要是圖像方面)都完全簡化為遊戲邏輯本身,所有的資源結構都可以由高級語言提供,如Python。

網址:http://www.pygame.org/news

ocos2d-python上面很多都用pyglet這個庫的,裡面主要的精靈什麼的也是針對pyglet的封裝,另外還封裝了些音頻庫什麼的。

網址:cocos2d

五、Python的其他流行的開發框架

Diesel:基於Greenlet的事件I/O框架

Diesel提供一個整潔的API來編寫網路客戶端和伺服器。支持TCP和UDP。

Flask:一個用Python編寫的輕量級Web應用框架

Flask是一個使用Python編寫的輕量級Web應用框架。基於Werkzeug WSGI工具箱和Jinja2

模板引擎。Flask也被稱為「microframework」,因為它使用簡單的核心,用extension增加其他功能。Flask沒有默認使用的數

據庫、窗體驗證工具。

Cubes:輕量級Python OLAP框架

Cubes是一個輕量級Python框架,包含OLAP、多維數據分析和瀏覽聚合數據(aggregated data)等工具。

Kartograph.py:創造矢量地圖的輕量級Python框架

Kartograph是一個Python庫,用來為ESRI生成SVG地圖。Kartograph.py目前仍處於beta階段,你可以在virtualenv環境下來測試。

Pulsar:Python的事件驅動並發框架

Pulsar是一個事件驅動的並發框架,有了pulsar,你可以寫出在不同進程或線程中運行一個或多個活動的非同步伺服器。

Falcon:構建雲API和網路應用後端的高性能Python框架

Falcon是一個構建雲API的高性能Python框架,它鼓勵使用REST架構風格,儘可能以最少的力氣做最多的事情。

Dpark:Python版的Spark

DPark是Spark的Python克隆,是一個Python實現的分散式計算框架,可以非常方便地實現大規模數據處理和迭代計算。DPark由豆瓣實現,目前豆瓣內部的絕大多數數據分析都使用DPark完成,正日趨完善。

Buildbot:基於Python的持續集成測試框架

Buildbot是一個開源框架,可以自動化軟體構建、測試和發布等過程。每當代碼有改變,伺服器要求不同平台上的客戶端立即進行代碼構建和測試,收集並報告不同平台的構建和測試結果。

Zerorpc:基於ZeroMQ的高性能分散式RPC框架

Zerorpc是一個基於ZeroMQ和MessagePack開發的遠程過程調用協議(RPC)實現。和 Zerorpc 一起使用的 Service API 被稱為 zeroservice。Zerorpc 可以通過編程或命令行方式調用。

好了,最後我們再來看看,到底是哪些人學習呢?

目前來學的人群分為以下幾類:

第一類:入行編程新手:大學剛畢業或者其他行業轉崗,想從事編程開發的工作,目前認為Python比較火,想入行;

第二類:Linux系統運維人員:Linux運維以繁雜著稱,對人員系統掌握知識的能力要求非常高,那麼也就需要一個編程語言能解決自動化的問題,Python開發運維工作是首選,Python運維工資的薪資普遍比Linux運維人員的工資高。

第三類:做數據分析或者人工智慧:不管是常見的大數據分析或者一般的金融分析、科學分析都比較大程度的應用了數據分析,人工智慧的一些常見應用也使用了Python的一些技術。

第四類:在職程序員轉Python開發:平常只關注div+css這些頁面技術,很多時候其實需要與後端開發人員進行交互的,現在有很多Java程序在轉到Python語言,他們都被Python代碼的優美和開發效率所折服

第五類:其他:一些工程師以前在做很多SEO優化的時候,苦於不會編程,一些程序上面的問題,得不到解決,只能做做簡單的頁面優化。 現在學會Python之後,可以編寫一些查詢收錄,排名,自動生成網路地圖的程序,解決棘手的SEO問題

如果你有更好的建議,歡迎留言和討論。


大二的時候寫了一個網路爬蟲 爬取 http://amazon.com的某類商品的bestseller top100 的所有評論。

也不用什麼框架,在linux下用的叫做 beautifulsoup的庫幫助解析html,正則表達式也可以啦 不過好麻煩。

爬蟲好慢啦,有個小技巧是走代理,因為是外國網站嘛,非常慢,而且可以防止同一個ip訪問次數太多。

大概有幾萬個網頁吧,然後用beautifsoup解析,挑一些自己感興趣的數據,比如打分、評論、商家、分類什麼的。然後用一些科學庫做一些簡單的統計和報表,比如 numpy、scipy、matplotlib等。網上也有好多數據生成報表的 js 庫,很酷炫,也很不錯的 :)

恩,就是這樣。


我也來回答一下吧.

如果樓主想爬去更大規模的東西,可以有兩種方案,一種自己寫一個爬蟲框架,另一總通過爬蟲框架.

1,自己動手寫一個爬蟲框架,我沒寫過沒法說

2,通過線程的爬蟲框框架.

用的比較多的是scrapy,首先scrapy非同步,然後scrapy可以寫成分散式爬蟲.這樣面對大數據再也不用爬一輩子啦.

另外還有pyspider,sola等.更多的爬蟲我也在收集中,不過如果你要著手開始用框架的話,大概只能找到這兩個,究其原因,還是因為很多框架是是英語寫的吧,大部分不願意爬英語的坑.

還有有人提到cola,這個是國人寫的,作者這樣說過

靠,以前只是聽過scrapy,從來沒去看過,剛看了一下,發現除了分散式的部分,竟然真挺像的。

從scrapy倒是有啟發可以保存json文件的形式,減少對資料庫的依賴。

想了一下,分散式還是我的初衷,真沒想到其他部分這麼相近。

其實用那個框架到不是一件值得糾結的事,因為幾乎沒得選.

第二個問題.python自己的類庫和框架有什麼區別?

你問這樣的問題,是因為,你現在爬的需求還很簡單!!

僅僅是爬靜態頁的話,而且爬不了多少個,真心建議你喜歡什麼就用什麼好了,或者直接就用類庫吧,推薦requests,幾行代碼就搞定了

但是,生活中不光有靜態頁這種東西啊,還有ajax,還有js,還有各種各樣莫名其妙的細節.

而細節是相當可怕的存在,比如,數據的提取,用正則還是xpath,為什麼不是所有的頁面都有下一頁,一晚上爬了5000條數據,我一共有20萬條怎麼辦,爬蟲又被封了,我靠.

有時候想想自己真夠堅定不移的.也真是煩

這個時候,你就會知道框架的好處了,框架最大的作用,在於用最簡單的方法幫助你實現需求,也就是說,如果你現在可以很好的滿足工作的需要,那就不要看框架,如果工作有些吃力,那就去看看吧,說不定別人已經造好了輪子,等著你推車呢!老漢!

cola的鏈接給你吧

Cola:一個分散式爬蟲框架

scrapy百度就是

pyspider還沒用


我的博客里有很詳細的敘述和源碼,python3.4實現。

歡迎交流 http://goldencui.org/articles/%E7%BD%91%E7%BB%9C%E8%B5%84%E6%BA%90%E6%90%9C%E7%B4%A2%E7%88%AC%E8%99%AB(python%203.4.1%E5%AE%9E%E7%8E%B0)


這個要看個人了,開始可以先看scrapy方面的內容,然後結合redis,實現分散式,具體實現可以參考github上的代碼,如chineking/cola · GitHub。

存儲的話,需要mongodb,要深入的話,這方面的內容還是挺多,而且mongodb可以實現集群式存儲,完全可以滿足樓主的要求。

框架有很多,比如爬蟲框架 | 為自己寫代碼,樓主可以嘗試下。

爬取大規模的數據其實可以通過分散式來實現。


推薦使用python語言,採用phantomjs + webdriver 可以處理非同步載入的情況,phantomjs是一個無界面瀏覽器,可以模擬各種操作,獲取html標籤可以使用bs4,Beautiful Soup 4.2.0 文檔,webdriver元素定位:4. 查找元素 - Selenium-Python中文文檔 2 documentation

使用phantomjs出現請求超時:python 高度健壯性爬蟲的異常和超時問題 - Python - 伯樂在線

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()

driver.get("http://somedomain/url_that_delays_loading")

try:

element = WebDriverWait(driver, 10).until( #這裡修改時間

EC.presence_of_element_located((By.ID, "myDynamicElement"))

)

finally:

driver.quit()

或者:Phantomjs爬蟲那些事兒

from selenium import webdriver
d = webdriver.PhantomJS()
d.set_page_load_timeout("10")
d.implicitly_wait("10")
d.get(url)
d.current_url


我開發了一個雲端爬蟲開發框架:神箭手,可以讓開發者在雲上使用Javascript編寫和運行爬蟲,歡迎大家來使用拍磚~


前兩個回答的都可以參考。。。

ps:爬蟲有時會死掉。寫的時候小心。


自己寫爬蟲的話,用一些非同步事件驅動庫,如gevent,比單純多線程要好很多。


推薦閱讀:

如何理解 CGI, WSGI?
WSGI 為什麼很重要?
python搭建網站和cms搭建網站哪個更快,各有何優勢?
Django寫的博客工具?
為什麼 Python 裡面的 range 不包含上界?

TAG:Python框架 | Python開發 |