Python 網路編程需要學習哪些網路相關的知識?

學習Python有很長一段時間了,可是一直感覺都沒有啥子明顯的進示。最近想了想,還是覺得自己目標不夠明確,不清楚到底學了後能做些什麼(業餘人士,學編程就是愛好),因此什麼都在看,但卻什麼都沒成。總結了下,確定在網路編程方面的深入一下,麻煩大家指教下需要學些什麼樣的東西。


就我個人的經驗,不妨:
1.寫出基本的TCP連接,知道編寫TCP的各個步驟,例如創建socket、綁定port、埠復用等,對TCP稍微做了解,知道協議的每個欄位,了解三次握手。
2.了解基本的伺服器並發模型,例如多進程、多線程、IO復用
3.了解一些網路庫例如twisted

其實想研究深入還得去讀《UNP》《TCPv1》之類的書籍,但是這類語言都是基於C的。
我是在Linux下編寫C++程序的,我的感覺是要鑽研的深入,一般都是用C來描述,
用python這種語言,抽象層次高,容易抓住重點,適合上手,但是同時也規避了很多問題


Python網路編程是一個很大的範疇,個人感覺需要掌握的點有:
1. 如何使用Python來創建socket, 如何將socket與指定的IP地址和埠進行綁定,使用socket來發送數據,接受數據,
2. 如何使用Python中處理線程,從而編寫可以同時處理多個請求的web伺服器
3. 如何使用Python來控制HTTP層的邏輯,包括如何創建http GET,POST,PUT,DELETE請求,如何處理接受到的HTTP請求,這些分別涉及python的httplib, basehttpserver等模塊
4. 掌握一種基本的python的web開發框架,比如webpy, django,pylon
5. 了解非阻塞式的HTTP Server,比如tornado
6. 了解twisted, python編寫的消息驅動的網路引擎

參考資料:
網路基礎知識
1. HTTP: the definitive guide http://www.amazon.com/HTTP-Definitive-Guide-David-Gourley/dp/1565925092/
2. Computer Networking: A Top-Down Approach http://www.amazon.com/Computer-Networking-Top-Down-Approach-Edition/dp/0136079679/ref

python 網路編程基礎
1. python 網路編程 http://www.amazon.com/Foundations-Python-Network-Programming-Goerzen/dp/1590593715
2. python socket編程的文檔 http://docs.python.org/library/socket.html
3. python httplib的文檔 http://docs.python.org/library/httplib.html

python常用框架文檔:
1. django 的官方網站 https://www.djangoproject.com/
2. twisted 的官方網站 http://twistedmatrix.com/trac/
3. tornado 的官方網站 http://www.tornadoweb.org/


不清楚你具體指的是底層的網路編程,還是偏應用的web開發。如果是做網站的話,那是web開發,建議先去看python的web開發框架,推薦從Django開始,文檔比較詳細
Django:https://www.djangoproject.com/


鑒於這種情況,自然是做爬蟲獲取數據咯!

試著按照下文的要求開始做一些確實看起來有用的事情,然後嘗試快速的學習一些新的輪子,同時,不間斷的編碼。

完成數據獲取這個階段以後,你就可以準備開始web開發了,如果沒有前端基礎,那就寫API吧。

事實上,我認為一個好的爬蟲,或者是蜘蛛,應當具備以下素質:

  • 不勤勞的蜘蛛不是一隻好爬蟲


    這是作為一隻存活在互聯網這張大網上的蜘蛛的基本素養。所謂勤勞,就是能夠完成自己的基本使命(爬取數據), 孜孜不倦,任勞任怨

  • 不機靈的蜘蛛死的早


    試想一下,蜘蛛在自己的八卦陣(網路)中迷失了方向,那可能只剩下死掉了,所以作為蜘蛛,除了要勤勞外,還需要機靈,具體描述就是:不迷失方向(爬取正確的url)遇到困難不退縮(能各種網路異常)不幹不必要的工作(避免重複)

  • 不嚴謹的蜘蛛跑斷腿也沒用


    儘管我們的蜘蛛已經聰明又勤勞了,但是如果粗心大意不嚴謹,大部分情況下爬了好久好久還是一點食物都吃不到,原因就是不嚴謹,可能找到了過期的、不能吃的食物(數據分析不合理)

&

我們了解了一隻網路蜘蛛的基本素養,接下來我們就開始學習它吧:

爬蟲原理

參見上面網路蜘蛛的基本素養,我們大概已經知道了爬蟲需要做的事情,無非就是如下幾個階段:

  1. 確定目標(url),也就是得到需要獲取內容的url
  2. 偽裝接近(驗證機制),也就是要騙過目標的防禦系統,如偽裝成瀏覽器
  3. 發送請求(request),獲取信任之後,我們就可以大膽的發送請求到目的地了
  4. 捕獲響應(response),當目標有了反饋以後捕獲響應的內容
  5. 獲取數據(getdata),拿到響應的數據之後,需要對數據進行分析和篩選
  6. 重複1-5 (repeat), 確定新目標,然後繼續做一名勤勞、機靈嚴謹的蜘蛛

用python來講,就是通過代碼實現對目標地址的訪問(走完http request和response的流程,獲取response之後再做數據篩選)

獲取內容

python中的urllib和urllib2兩個原生庫提供了我們發送http request和獲取 http response的全部實現。通過使用這兩個庫,可以很簡單的獲取網路內容,大致分為如下幾步。

確定目標(url)

也就是確定我們要爬區的頁面的url

偽裝接近

很多站點都對用戶訪問做了一些驗證,比如通過查看headers內的信息,來確定訪問來源

HTTP Headers是HTTP請求和相應的核心,它承載了關於用戶端流覽器,請求頁面,伺服器等相關的資訊。具體關於headers的詳細信息參見 什麼是HTTP Headers

比如,大部分網站會驗證Headers內的 User-Agent 來確定請求是不是從瀏覽器發出,我們則可以偽造一個user-agent封裝成headers(headers在python內以字典的結構表現)

發送請求

發送請求之前,我們需要和headers一樣,創建一個請求request

如果是帶參數的請求,我們還需要創造參數data

urllib2內可以直接調用 urllib2.Request(url, data, headers)方法,這個方法返回一個request

捕獲響應

當我們準備好了request(帶數據或者不帶數據)之後,即可發送請求到頁面,然後會得到一個response

urllib2內可以使用 urllib2.urlopen(request, timeout)方法,該方法返回一個response; 要獲取response的內容,則需要使用 response.read()方法

數據分析

通過 urllib2可以輕鬆的獲取目標頁面內容,那麼最讓人頭疼的事情來了,那就是數據分析(篩選)

這裡我們暫時只使用最笨的一種方法,那就是在本地進行字元串的匹配來獲取想要的內容,這裡則需要使用到正則表達式,關於正則表達式可以參考《python核心編程 第三版》的第一章,也可以觀看imooc的視頻python正則表達式

通過分析源文件找到適合的匹配規則


比如,上面得到的內容,我們可以對美女圖片的代碼進行分析,並作出匹配:

示例代碼(對上面獲得的content進行正則匹配,得到其中的圖片):

import re
pattern = re.compile("&

  • 上面代碼中的 compile 表示匹配規則, 其中.?可以理解為忽略這期間的內容,我們從&

  • for item in items:
    print item[0] #item[0]也就是我們匹配到的第一個元素 src
    print item[1] #item[0]也就是我們匹配到的第二個元素 alt

    數據持久化

    數據持久化的方式是多樣的
    我們可以使用資料庫來存儲,對於大型數據分析,我們還可以使用緩存工具 memchche 或者 redis將數據快速保存,之後持久化到資料庫中,甚至還有數據集群(再扯久沒邊了,參考google 機器人深度學習)

    其次我們還可以保存內容到本地文件,比較流行的是直接寫入到某一個伺服器的web目錄(以html為主),這樣數據爬取下來後,還可以通過web直接訪問。

    這裡,我們主要是保存圖片,因此直接將數據保存到本地,而且保存成圖片格式。urllib中(注意時urllib而非urllib2)提供了非常方便的方法。具體參見代碼:

    for item in items:
    urllib.urlretrieve(item[0],item[1]+".jpg")

    urllib.urlretrieve(url, local, Schedule) 函數可以從url下載內容保存到本地路徑local中,其中還可以加入第三個參數 (回調函數,主要實現類似於進度條的功能),具體函數解析請參考 現代魔法學院 urllib解析


    前段時間寫了一些 python 網路編程代理相關的教程,希望對題主有用

    • 由淺入深寫代理(1)-介紹
    • 由淺入深寫代理(2)- socket 編程
    • 由淺入深寫代理(3) -socks5 代理
    • 由淺入深寫代理(4)-socks5-代理
    • 由淺入深寫代理(5)-socks5-代理
    • 由淺入深寫代理(6)-http-代理
    • 由淺入深寫代理(7)-https-代理
    • 由淺入深寫代理(8)-ss-代理
    • 由淺入深寫代理(9)-ssh-代理
    • 由淺入深寫代理(10)-內網穿

    一般來說分為web編程和網路編程,所以最好分清兩者的概念。前者更傾向於去學習一些主流的框架以及自己搭建站點,後者則是從更底層上去描述與實現。所以建議先找到感興趣的,在好好研究。


    我也在學,第一感覺是先學好英語


    Socket Programming in Python這裡有個簡單的教程


    可以參考下面這個答案,這個答案對英語不好如何看技術英文文檔的問題也有參考性,對照源碼讀http://docs.python.org/2/library/對英文有幫助。

    __cutline_start__ = "-" * 20 + "以下轉發賴勇浩的答案" + "-" * 20

    著作權歸作者所有。
    商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
    作者:賴勇浩
    鏈接:初學 Python,有哪些 Pythonic 的源碼推薦閱讀? - 賴勇浩的回答
    來源:知乎

    謝邀。看到邀請已經很久了,一直沒敢回答,主要是我自己沒有讀過多少模塊的源碼,因為我一直認為讀源碼是一種比較「低效」的學習方法。我用 yolk -al 看了一下安裝的模塊,發現居然也沒有幾個算是「讀過」的。web.py 的讀過一點,它的介面很 pythonic,但這貨的實現應該算不上是非常 pythonic 的代碼。

    如果一定要推薦一些 python 的源碼去讀,我的建議是標準庫里關於網路的代碼。從 SocketServer 開始,補上 socket 模塊的知識,熟悉 TCP/UDP 編程,然後了解 Mixin 機制的最佳示例 SocketServer.{ForkingMixIn|ThreadingMixIn},借這個機會了解 thread/threading 模塊,這時會對並發量提出新的要求,就可以讀 select 模塊,開始對 select/{epoll|kqueue} 有深刻理解,搞懂以後就可以接觸一下非同步框架 asyncore 和 asynchat。這時開始出現分岔。如果是做 game 等以 TCP/UDP 協議為基礎的應用,可以去讀 greenlet 和 gevent,如果是做 web,則走下一條路。

    做 web,讀 BaseHTTPServer、SimpleHTTPServer 和 CGIHTTPServer,讀 cgi/cgitb,自己隨意寫框架,讀cookielib,讀 wsgiref,這時候自己寫一個簡便的 web framework 就 so easy 了,老闆再也不擔心你寫 web 了,選擇 flask/web.py/django/pyramid 都心中有數了。因為走的是 web 的路,所以難免要調用一下別人的 api,搞懂一下 httplib/urllib/urllib/urlparse。

    最後,上述提到的標準庫,我大多讀過。

    __cutline_over__ = "-" * 20, "over", "-" * 20


    學習完網路編程基礎知識後. 強烈建議學習twisted.


    推薦閱讀:
  • Python新手,在哪裡才能閱讀到大量的基礎Python常式?
    TCP如何保持長連接,並識別不同請求的?
    你為什麼不用unity引擎?
    如何通過新浪微博API抓取大量用戶信息?
    關於Python IDE如何選擇?

    TAG:Python | 編程 | 網路編程 |