Python程序設(shè)計(jì)第7章網(wǎng)絡(luò)和Web開發(fā)課件_第1頁
Python程序設(shè)計(jì)第7章網(wǎng)絡(luò)和Web開發(fā)課件_第2頁
Python程序設(shè)計(jì)第7章網(wǎng)絡(luò)和Web開發(fā)課件_第3頁
Python程序設(shè)計(jì)第7章網(wǎng)絡(luò)和Web開發(fā)課件_第4頁
Python程序設(shè)計(jì)第7章網(wǎng)絡(luò)和Web開發(fā)課件_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Python第1頁,共85頁。7網(wǎng)絡(luò)和Web開發(fā)第章第2頁,共85頁。本章內(nèi)容7.1 網(wǎng)絡(luò)和web開發(fā)7.2 socket模塊7.3 網(wǎng)絡(luò)數(shù)據(jù)抓取7.4 python網(wǎng)絡(luò)常用模塊本章總結(jié)第3頁,共85頁。7.1 python的web開發(fā)最早的軟件都是運(yùn)行在大型機(jī)上的,軟件使用者通過“啞終端”登陸到大型機(jī)上去運(yùn)行軟件。后來隨著PC機(jī)的興起,軟件開始主要運(yùn)行在桌面上,而數(shù)據(jù)庫這樣的軟件運(yùn)行在服務(wù)器端,這種Client/Server模式簡(jiǎn)稱CS架構(gòu)。隨著互聯(lián)網(wǎng)的興起,人們發(fā)現(xiàn),CS架構(gòu)不適合Web,最大的原因是Web應(yīng)用程序的修改和升級(jí)非常迅速,而CS架構(gòu)需要每個(gè)客戶端逐個(gè)升級(jí)桌面App,因此,Br

2、owser/Server模式開始流行,簡(jiǎn)稱BS架構(gòu)。在BS架構(gòu)下,客戶端只需要瀏覽器,應(yīng)用程序的邏輯和數(shù)據(jù)都存儲(chǔ)在服務(wù)器端。瀏覽器只需要請(qǐng)求服務(wù)器,獲取Web頁面,并把Web頁面展示給用戶即可。當(dāng)然,Web頁面也具有極強(qiáng)的交互性。由于Web頁面是用HTML編寫的,而HTML具備超強(qiáng)的表現(xiàn)力,并且,服務(wù)器端升級(jí)后,客戶端無需任何部署就可以使用到新的版本,因此,BS架構(gòu)迅速流行起來。今天,除了重量級(jí)的軟件如Office,Photoshop等,大部分軟件都以Web形式提供。比如,新浪提供的新聞、博客、微博等服務(wù),均是Web應(yīng)用。第4頁,共85頁。7.1 python的web開發(fā)Web應(yīng)用開發(fā)可以說是

3、目前軟件開發(fā)中最重要的部分。Web開發(fā)也經(jīng)歷了好幾個(gè)階段:1.靜態(tài)Web頁面:由文本編輯器直接編輯并生成靜態(tài)的HTML頁面,如果要修改Web頁面的內(nèi)容,就需要再次編輯HTML源文件,早期的互聯(lián)網(wǎng)Web頁面就是靜態(tài)的;2.CGI:由于靜態(tài)Web頁面無法與用戶交互,比如用戶填寫了一個(gè)注冊(cè)表單,靜態(tài)Web頁面就無法處理。要處理用戶發(fā)送的動(dòng)態(tài)數(shù)據(jù),出現(xiàn)了Common Gateway Interface,簡(jiǎn)稱CGI,用C/C+編寫。3.ASP/JSP/PHP:由于Web應(yīng)用特點(diǎn)是修改頻繁,用C/C+這樣的低級(jí)語言非常不適合Web開發(fā),而腳本語言由于開發(fā)效率高,與HTML結(jié)合緊密,因此,迅速取代了CGI模

4、式。ASP是微軟推出的用VBScript腳本編程的Web開發(fā)技術(shù),而JSP用Java來編寫腳本,PHP本身則是開源的腳本語言。4.MVC:為了解決直接用腳本語言嵌入HTML導(dǎo)致的可維護(hù)性差的問題,Web應(yīng)用也引入了Model-View-Controller的模式,來簡(jiǎn)化Web開發(fā)。ASP發(fā)展為ASP.Net,JSP和PHP也有一大堆MVC框架。第5頁,共85頁。7.1 python的web開發(fā)目前,Web開發(fā)技術(shù)仍在快速發(fā)展中,異步開發(fā)、新的MVVM前端技術(shù)層出不窮。Python的誕生歷史比Web還要早,由于Python是一種解釋型的腳本語言,開發(fā)效率高,所以非常適合用來做Web開發(fā)。Pyth

5、on有上百種Web開發(fā)框架,有很多成熟的模板技術(shù),選擇Python開發(fā)Web應(yīng)用,不但開發(fā)效率高,而且運(yùn)行速度快。第6頁,共85頁。Python的WEB框架有Django、Tornado、Flask 等多種,Django相較與其他WEB框架其優(yōu)勢(shì)為:大而全,框架本身集成了ORM、模型綁定、模板引擎、緩存、Session等諸多功能。7.1.1 Django框架安裝和部署第7頁,共85頁。MVC是眾所周知的模式,即:將應(yīng)用程序分解成三個(gè)組成部分:model(模型),view(視圖),和 controller(控制 器)。其中: M管理應(yīng)用程序的狀態(tài)(通常存儲(chǔ)到數(shù)據(jù)庫中),并約束改變狀態(tài)的行為(或者

6、叫做“業(yè)務(wù)規(guī)則”)。 C接受外部用戶的操作,根據(jù)操作訪問模型獲取數(shù)據(jù),并調(diào)用“視圖”顯示這些數(shù)據(jù)??刂破魇菍ⅰ澳P汀焙汀耙晥D”隔離,并成為二者之間的聯(lián)系紐帶。 V負(fù)責(zé)把數(shù)據(jù)格式化后呈現(xiàn)給用戶。7.1.1 Django框架安裝和部署第8頁,共85頁。Django也是一個(gè)MVC框架。但是在Django中,控制器接受用戶輸入的部分由框架自行處理,所以 Django 里更關(guān)注的是模型(Model)、模板(Template)和視圖(Views),稱為 MTV模式: M 代表模型(Model),即數(shù)據(jù)存取層。 該層處理與數(shù)據(jù)相關(guān)的所有事務(wù): 如何存取、如何驗(yàn)證有效性、包含哪些行為以及數(shù)據(jù)之間的關(guān)系等。 T

7、 代表模板(Template),即表現(xiàn)層。 該層處理與表現(xiàn)相關(guān)的決定: 如何在頁面或其他類型文檔中進(jìn)行顯示。 V 代表視圖(View),即業(yè)務(wù)邏輯層。 該層包含存取模型及調(diào)取恰當(dāng)模板的相關(guān)邏輯。 你可以把它看作模型與模板之間的橋梁。7.1.1 Django框架安裝和部署第9頁,共85頁。本小節(jié)我們將了解一下Django框架安裝和部署。1.首先打開linux系統(tǒng),在這里以u(píng)buntu系統(tǒng)為例。終端默認(rèn)使用的是Python2.7,如果需要設(shè)置為默認(rèn)3.5版本,可以在終端運(yùn)行下面2條命令,不然可以忽略sudo update-alternatives -install /usr/bin/python

8、python /usr/bin/python2 100sudo update-alternatives -install /usr/bin/python python /usr/bin/python3 1507.1.1 Django框架安裝和部署第10頁,共85頁。2.安裝 setuptools在終端上輸入命令:sudo apt-get install python-setuptools如圖7-1所示,成功安裝setuptools。7.1.1 Django框架安裝和部署第11頁,共85頁。3.使用easy_install命令安裝 django命令如下: sudo easy_install dj

9、ango如圖7-2所示,成功安裝django。7.1.1 Django框架安裝和部署第12頁,共85頁。4.打開終端,輸入命令:Python然后導(dǎo)入Python,如圖7-3所示進(jìn)入Python。查看django版本,輸入命令如下:import djangodjango.VERSION可以看到當(dāng)前的django版本7.1.1 Django框架安裝和部署第13頁,共85頁。1、安裝環(huán)境python 2.6.6版本對(duì)應(yīng)django的版本是1.4.2,下載/安裝:wget /m/releases/1.4/Django-1.4.20.tar.gztar zxvf Django-1.4.20.tar.gz

10、python setup.py install在安裝 Django 之后,現(xiàn)在應(yīng)該已經(jīng)有了可用的管理工具 django-admin.pywhich django-admin.py/usr/bin/django-admin.py7.1.2 Django開發(fā)實(shí)例第14頁,共85頁。2、創(chuàng)建django項(xiàng)目cd /data/www/django-admin.py startproject djproject上面這個(gè)命令會(huì)創(chuàng)建一個(gè) djproject 目錄,其中包含了運(yùn)行 Django 項(xiàng)目所需要的基本配置文件:ls djproject/djproject manage.py對(duì)于這個(gè)項(xiàng)目來說,我們要構(gòu)

11、建一個(gè)應(yīng)用程序 “djapp”。要?jiǎng)?chuàng)建應(yīng)用程序,可以使用 manage.py 腳本,這是一個(gè)特定于項(xiàng)目的 django-admin.py 腳本,其中settings.py(該文件位于:django/conf/global_settings.py)文件可以自動(dòng)提供。7.1.2 Django開發(fā)實(shí)例第15頁,共85頁。cd djproject/django-admin.py startapp djapp這將創(chuàng)建一個(gè)應(yīng)用程序骨架,其中模型有一個(gè) Python 模塊,視圖有另外一個(gè) Python 模塊。djapp目錄中包含以下文件_init_.py models.py tests.py views.p

12、y提供應(yīng)用程序在項(xiàng)目中的位置純粹是為新 Django 開發(fā)人員建立的一種慣例,并不是必需的。一旦開始在幾個(gè)項(xiàng)目中混合使用應(yīng)用程序,就可以將應(yīng)用程序放到自己的命名空間中,并使用設(shè)置和主 URL 文件將它們綁定在一起。7.1.2 Django開發(fā)實(shí)例第16頁,共85頁。3、管理員工具Django 的最大賣點(diǎn)之一是其一流的管理界面。這個(gè)工具是按照最終用戶的思路設(shè)計(jì)的。它為我們的項(xiàng)目提供了很多數(shù)據(jù)輸入工具。管理工具是 Django 提供的一個(gè)應(yīng)用程序。與 jobs 應(yīng)用程序一樣,在使用之前也必須進(jìn)行安裝。第一個(gè)步驟是將應(yīng)用程序的模塊(django.contrib.admin)添加到 INSTALLED

13、_APPS 設(shè)置中:修改 settings.pyINSTALLED_APPS = ( django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.sites, , django.contrib.admin, )7.1.2 Django開發(fā)實(shí)例第17頁,共85頁。要讓該管理工具可以通過 /admin URL 使用,只需要簡(jiǎn)單地取消項(xiàng)目的 urls.py 文件中提供的對(duì)應(yīng)行的內(nèi)容即可。下一節(jié)將詳細(xì)介紹 URL 的配置。使管理工具可以通過 urls.py 使用from django

14、.conf.urls.defaults import * from django.contrib import admin admin.autodiscover() urlpatterns = patterns(, url(radmin/, include(admin.site.urls), )在 settings.py 中配置數(shù)據(jù)庫DATABASES = default: ENGINE: django.db.backends.sqlite3, NAME: /data/www/djproject/djproject.db, # Or path to database file if using

15、 sqlite3. 這個(gè)管理應(yīng)用程序有自己的數(shù)據(jù)庫模型,但也需要進(jìn)行安裝。我們可以再次使用 syncdb 命令來完成這個(gè)過程:python manage.py syncdb注意,syncdb命令要求我們創(chuàng)建一個(gè)超級(jí)用戶帳號(hào)。此處必須創(chuàng)建,如果CTRL + C跳過,會(huì)導(dǎo)致初始化后無法訪問管理后臺(tái)的問題這是因?yàn)?django.contrib.auth 應(yīng)用程序(提供基本的用戶身份驗(yàn)證功能)默認(rèn)情況下是在 INSTALLED_APPS 設(shè)置中提供的。超級(jí)用戶名和密碼用來登錄將在下一節(jié)介紹的管理工具。記住,這是 Django 的超級(jí)用戶,而不是系統(tǒng)的超級(jí)用戶。7.1.2 Django開發(fā)實(shí)例第18頁,

16、共85頁。4、啟動(dòng)django的測(cè)試服務(wù)器要查看這個(gè)管理工具,可以使用 Django 提供的測(cè)試服務(wù)器。使用測(cè)試服務(wù)器來查看管理工具/dev/djproject$ python manage.py runserver :8001 Validating models. 0 errors found. Django version 0.95 (post-magic-removal), using settings djproject.settings Development server is running at :8001/ Quit the server with CONTROL-C (Un

17、ix) or CTRL-BREAK (Windows).:8000 表示讓Django監(jiān)聽所有網(wǎng)絡(luò)接口和IP地址,否則默認(rèn)監(jiān)聽:8000,也就是只允許本機(jī)訪問現(xiàn)在可以使用 http:/localhost:8001/admin 啟動(dòng)管理工具,并使用前面創(chuàng)建的超級(jí)用戶帳號(hào)進(jìn)行登錄7.1.2 Django開發(fā)實(shí)例第19頁,共85頁。socket是基于(TCP、UDP、IP)的通訊、也叫做套接字,通訊過程由服務(wù)端的socket處理信息發(fā)送,由客戶端的socket處理信息接收。7.2 socket模塊第20頁,共85頁。套接字:通信端點(diǎn)什么是套接字套接字是一種具有之前所說的“通信端點(diǎn)”概念的計(jì)算機(jī)網(wǎng)絡(luò)數(shù)

18、據(jù)結(jié)構(gòu)。網(wǎng)絡(luò)化的應(yīng)用程序在開始任何通訊之前都必需要?jiǎng)?chuàng)建套接字。就像電話的插口一樣,沒有它就完全沒辦法通信。7.2.1 套接字第21頁,共85頁。1.套接字起源套接字起源于20世紀(jì)70年代加州大學(xué)伯克利分校版本的Unix,即人們所說的BSDUnix。因此,有時(shí)人們也把套接字稱為“伯克利套接字”或“BSD套接字”。一開始,套接字被設(shè)計(jì)用在同一臺(tái)主機(jī)上多個(gè)應(yīng)用程序之間的通訊。這也被稱作進(jìn)程間通訊,或IPC。套接字有兩種,分別是基于文件型的和基于網(wǎng)絡(luò)型的。Unix套接字是我們要介紹的第一個(gè)套接字家族。其“家族名”為AF_UNIX(在POSIX1.g標(biāo)準(zhǔn)中也叫AF_LOCAL),表示“地址家族:UNIX

19、”。包括Python在內(nèi)的大多數(shù)流行平臺(tái)上都使用術(shù)語“地址家族”及其縮寫“AF”。而老一點(diǎn)的系統(tǒng)中,地址家族被稱為“域”或“協(xié)議家族”,并使用縮寫“PF”而不是“AF”。同樣的,AF_LOCAL(在2000-2001年被列為標(biāo)準(zhǔn))將會(huì)代替AF_UNIX。不過,為了向后兼容,很多系統(tǒng)上,兩者是等價(jià)的。Python自己則仍然使用AF_UNIX。由于兩個(gè)進(jìn)程都運(yùn)行在同一臺(tái)機(jī)器上,而且這些套接字是基于文件的。所以,它們的底層結(jié)構(gòu)是由文件系統(tǒng)來支持的。這樣做相當(dāng)有道理,因?yàn)?,同一臺(tái)電腦上,文件系統(tǒng)的確是不同的進(jìn)程都能訪問的。7.2.1 套接字第22頁,共85頁。另一種套接字是基于網(wǎng)絡(luò)的,它有自己的家族名

20、字:AF_INET,或叫“地址家族:Internet”。還有一種地址家族AF_INET6被用于網(wǎng)際協(xié)議第6版(IPv6)尋址上。還有一些其他的地址家族,不過,它們要么是只用在某個(gè)平臺(tái)上,要么就是已經(jīng)被廢棄,或是很少被使用,或是根本就還沒有實(shí)現(xiàn)。所有地址家族中,AF_INET是使用最廣泛的一個(gè)。Python2.5中加入了一種Linux套接字的支持:AF_NETLINK(無連接(稍后講解))套接字家族讓用戶代碼與內(nèi)核代碼之間的IPC可以使用標(biāo)準(zhǔn)BSD套接字接口。而且,相對(duì)之前那些往操作系統(tǒng)中加入新的系統(tǒng)調(diào)用、proc文件系統(tǒng)支持或是“IOCTL”等復(fù)雜的方案來說,這種方法顯得更為精巧,更為安全。P

21、ython只支持AF_UNIX,AF_NETLINK,和AF_INET家族。由于我們只關(guān)心網(wǎng)絡(luò)編程,所以在本章的大部分時(shí)候,我們都只用AF_INET。7.2.1 套接字第23頁,共85頁。套接字地址:主機(jī)與端口如果把套接字比做電話的插口即通信的最底層結(jié)構(gòu),那主機(jī)與端口就像區(qū)號(hào)與電話號(hào)碼的一對(duì)組合。有了能打電話的硬件還不夠,你還要知道你要打給誰,往哪打。一個(gè)因特網(wǎng)地址由網(wǎng)絡(luò)通信所必需的主機(jī)與端口組成。而且不用說,另一端一定要有人在聽才可以。否則,你就會(huì)聽到熟悉的聲音“對(duì)不起,您撥的是空號(hào),請(qǐng)查詢后再撥”。你在上網(wǎng)的時(shí)候,可能也見過類似的情況,如“不能連接該服務(wù)器。服務(wù)器無響應(yīng)或不可達(dá)”。合法的端

22、口號(hào)范圍為065535。其中,小于1024的端口號(hào)為系統(tǒng)保留端口。如果你所使用的是Unix操作系統(tǒng),那么就可以通過/etc/services文件獲得保留的端口號(hào)(及其對(duì)應(yīng)的服務(wù)/協(xié)議和套接字類型)。7.2.1 套接字第24頁,共85頁。面向連接與無連接(1)面向連接無論你使用哪一種地址家族,套接字的類型只有兩種。一種是面向連接的套接字,即在通信之前一定要建立一條連接,就像跟朋友打電話時(shí)那樣。這種通信方式也被稱為“虛電路”或“流套接字”。面向連接的通信方式提供了順序的、可靠的、不會(huì)重復(fù)的數(shù)據(jù)傳輸,而且也不會(huì)被加上數(shù)據(jù)邊界。這也意味著,每一個(gè)要發(fā)送的信息,可能會(huì)被拆分成多份,每一份都會(huì)不多不少地正

23、確到達(dá)目的地。然后被重新按順序拼裝起來,傳給正在等待的應(yīng)用程序。實(shí)現(xiàn)這種連接的主要協(xié)議就是傳輸控制協(xié)議(即TCP)。要?jiǎng)?chuàng)建TCP套接字就得在創(chuàng)建的時(shí)候指定套接字類型為SOCK_STREAM。TCP套接字采用SOCK_STREAM這個(gè)名字,表達(dá)了它作為流套接字的特點(diǎn)。由于這些套接字使用網(wǎng)際協(xié)議(IP)來查找網(wǎng)絡(luò)中的主機(jī),所以這樣形成的整個(gè)系統(tǒng),一般會(huì)由這兩個(gè)協(xié)議(TCP和IP)名的組合來描述,即TCP/IP。7.2.1 套接字第25頁,共85頁。(2)無連接與虛電路完全相反的是數(shù)據(jù)報(bào)型的無連接套接字。這意味著,無需建立連接就可以進(jìn)行通訊。但這時(shí),數(shù)據(jù)到達(dá)的順序、可靠性及不重復(fù)性就無法保證了。數(shù)據(jù)

24、報(bào)會(huì)保留數(shù)據(jù)邊界,這就表示,數(shù)據(jù)是整個(gè)發(fā)送的,不會(huì)像面向連接的協(xié)議那樣被先拆分成小塊。使用數(shù)據(jù)報(bào)來傳輸數(shù)據(jù)就像郵政服務(wù)一樣。郵件和包裹不一定會(huì)按它們發(fā)送的順序到達(dá)。事實(shí)上,它們還有可能根本到達(dá)不了!而且,在網(wǎng)絡(luò)中報(bào)文甚至?xí)貜?fù)發(fā)送,這也增加了復(fù)雜性。既然數(shù)據(jù)報(bào)有這么多缺點(diǎn),為什么還要使用它呢?(一定有能勝過流套接字的功能?。┯捎诿嫦蜻B接套接字要提供一些保證,以及要維持虛電路連接,這都是很重的額外負(fù)擔(dān)。數(shù)據(jù)報(bào)沒有這些負(fù)擔(dān),所以它更“便宜”。通常能提供更好的性能,更適合某些應(yīng)用場(chǎng)合。實(shí)現(xiàn)這種連接的主要協(xié)議就是用戶數(shù)據(jù)報(bào)協(xié)議(即UDP)。要?jiǎng)?chuàng)建UDP套接字就得在創(chuàng)建的時(shí)候指定套接字類型為SOCK_D

25、GRAM。SOCK_DGRAM這個(gè)名字,也許你已經(jīng)猜到了,來自于單詞“datagram”(“數(shù)據(jù)報(bào)”)。由于這些套接字使用網(wǎng)際協(xié)議來查找網(wǎng)絡(luò)中的主機(jī),這樣形成的整個(gè)系統(tǒng),一般會(huì)由這兩個(gè)協(xié)議(UDP和IP)名的組合來描述,即UDP/IP。7.2.1 套接字第26頁,共85頁。Python中的網(wǎng)絡(luò)編程現(xiàn)在,你已經(jīng)有了足夠的客戶端/服務(wù)器架構(gòu)、套接字和網(wǎng)絡(luò)方面的知識(shí)。我們現(xiàn)在就開始把這些概念帶到Python中來。本節(jié)中,我們將主要使用socket模塊。模塊中的socket()函數(shù)被用來創(chuàng)建套接字。套接字也有自己的一套函數(shù)來提供基于套接字的網(wǎng)絡(luò)通信。7.2.1 套接字第27頁,共85頁。(1)sock

26、et()模塊函數(shù)要使用socket.socket()函數(shù)來創(chuàng)建套接字。其語法如下:socket(socket_family,socket_type,protocol=0)如前所述,Socket,family不是AF_VNIX就是AF_INETsocket_type可以是SOCK_STREAM或SOCK_DGRAM,這一點(diǎn)前面已說過。protocol一般不填,默認(rèn)值為0。創(chuàng)建一個(gè)TCP/IP的套接字,要這樣調(diào)用socket.socket():tcpSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)同樣地,創(chuàng)建一個(gè)UDP/IP的套接字,要這樣

27、:udpSock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)由于socket模塊中有太多的屬性,我們?cè)谶@里破例使用了frommoduleimport*語句。使用fromsocketimport*,我們就把socket模塊里的所有屬性都帶到我們的命名空間里了,這樣能大幅減短我們的代碼。tcpSock=socket(AF_INET,SOCK_STREAM)當(dāng)我們創(chuàng)建了套接字對(duì)象后,所有的交互都將通過對(duì)該套接字對(duì)象的方法調(diào)用來進(jìn)行。7.2.1 套接字第28頁,共85頁。(2)套接字對(duì)象(內(nèi)建)方法表7-1中,我們列出了最常用的套接字對(duì)象的方法。在下

28、一個(gè)小節(jié)中,我們將分別創(chuàng)建TCP和UDP的客戶端和服務(wù)器,它們都要用到這些方法。雖然我們只關(guān)心因特網(wǎng)套接字,但是這些方法在Unix套接字中的也有類似的意義。7.2.1 套接字第29頁,共85頁。套接字對(duì)象(內(nèi)建)方法表7-1中,我們列出了最常用的套接字對(duì)象的方法。在下一個(gè)小節(jié)中,我們將分別創(chuàng)建TCP和UDP的客戶端和服務(wù)器,它們都要用到這些方法。雖然我們只關(guān)心因特網(wǎng)套接字,但是這些方法在Unix套接字中的也有類似的意義。注:a.(Python2.3版本新加入的函數(shù))。核心提示:在運(yùn)行網(wǎng)絡(luò)應(yīng)用程序時(shí),最好在不同的電腦上執(zhí)行服務(wù)器和客戶端的程序。在本章的例子中,你將看到大量的代碼和輸出中提及“l(fā)o

29、calhost”主機(jī)和IP地址。例子中客戶端與服務(wù)器運(yùn)行在同一臺(tái)電腦上,建議大家改掉主機(jī)名,并把代碼放到不同的電腦上運(yùn)行。眼看著自己的代碼讓不同的電腦在網(wǎng)絡(luò)上進(jìn)行通訊,這一時(shí)刻,你更能體會(huì)到開發(fā)的樂趣。7.2.1 套接字第30頁,共85頁。7.2.1 套接字(表7-1)函 數(shù) 描 述 服務(wù)器端套接字函數(shù)s.bind() 綁定地址(主機(jī)名,端口號(hào)對(duì))到套接字 s.listen() 開始TCP監(jiān)聽 s.accept() 被動(dòng)接受TCP客戶端連接,(阻塞式)等待連接的到來 客戶端套接字函數(shù) s.connect()主動(dòng)初始化TCP服務(wù)器連接 s.connect_ex() connect()函數(shù)的擴(kuò)展版

30、本,出錯(cuò)時(shí)返回出錯(cuò)碼,而不是拋出異常公共用途的套接字函數(shù) s.recv() 接收TCP數(shù)據(jù) s.send()發(fā)送TCP數(shù)據(jù) s.sendall()完整發(fā)送TCP數(shù)據(jù)s.recvfrom()接收UDP數(shù)據(jù)s.sendto()發(fā)送UDP數(shù)據(jù) s.getpeername() 連接到當(dāng)前套接字的遠(yuǎn)端的地址(TCP連接)s.getsockname() 當(dāng)前套接字的地址s.getsockopt() 返回指定套接字的參數(shù) s.setsockopt() 設(shè)置指定套接字的參數(shù)s.close()關(guān)閉套接字 面向模塊的套接字函數(shù) s.setblocking()設(shè)置套接字的阻塞與非阻塞模式s.settimeout()

31、a設(shè)置阻塞套接字操作的超時(shí)時(shí)間s.gettimeout()a 得到阻塞套接字操作的超時(shí)時(shí)間 面向文件的套接字函數(shù) s.fileno() 套接字的文件描述符 s.makefile() 創(chuàng)建一個(gè)與該套接字關(guān)連的文件對(duì)象 第31頁,共85頁。(3)創(chuàng)建一個(gè)TCP服務(wù)器我們首先將給出一個(gè)關(guān)于如何創(chuàng)建一個(gè)通用的TCP服務(wù)器的偽代碼,然后解釋會(huì)發(fā)生什么問題。要注意的是,這只是設(shè)計(jì)服務(wù)器的一種方法,當(dāng)對(duì)服務(wù)器的設(shè)計(jì)有了一定的了解之后,就能用你所希望的方式來修改這段偽代碼:ss=socket()#創(chuàng)建服務(wù)器套接字ss.bind()#把地址綁定到套接字上ss.listen()#監(jiān)聽連接inf_loop:#服務(wù)器

32、無限循環(huán)cs=ss.accept()#接受客戶端連接comm_loop:#通信循環(huán)cs.recv()/cs.send()#對(duì)話(接收與發(fā)送)cs.close()#關(guān)閉客戶端套接字ss.close()#關(guān)閉服務(wù)器套接字(可選)所有的套接字都用socket.socket()函數(shù)來創(chuàng)建。服務(wù)器需要“坐在某個(gè)端口上”等待請(qǐng)求。所以它們必需要“綁定”到一個(gè)本地的地址上。由于TCP是一個(gè)面向連接的通信系統(tǒng),在TCP服務(wù)器可以開始工作之前,要先完成一些設(shè)置。TCP服務(wù)器必須“監(jiān)聽”(進(jìn)來的)連接,設(shè)置完成之后,服務(wù)器就可以進(jìn)入無限循環(huán)了。7.2.1 套接字第32頁,共85頁。一個(gè)簡(jiǎn)單的(單線程的)服務(wù)器會(huì)調(diào)

33、用accept()函數(shù)等待連接的到來。默認(rèn)情況下,accept()函數(shù)是阻塞式的,即程序在連接到來之前會(huì)處于掛起狀態(tài)。套接字也支持非阻塞模式。一旦接收到一個(gè)連接,accept()函數(shù)就會(huì)返回一個(gè)單獨(dú)的客戶端套接字用于后續(xù)的通信。使用新的客戶端套接字就像把客戶的電話轉(zhuǎn)給一個(gè)客戶服務(wù)人員。當(dāng)一個(gè)客戶打電話進(jìn)來的時(shí)候,總機(jī)接了電話,然后把電話轉(zhuǎn)到合適的人那里來處理客戶的需求。這樣就可以空出總機(jī),也就是最初的那個(gè)服務(wù)器套接字,于是,話務(wù)員就可以等待下一個(gè)電話(客戶端請(qǐng)求),與此同時(shí),前一個(gè)客戶與對(duì)應(yīng)的客戶服務(wù)人員在另一條線路上進(jìn)行著他們之間的對(duì)話。同樣的,當(dāng)一個(gè)請(qǐng)求到來時(shí),要?jiǎng)?chuàng)建一個(gè)新的端口,然后直接

34、在那個(gè)端口上與客戶對(duì)話,這樣就可以空出主端口來接受其他客戶的連接。7.2.1 套接字第33頁,共85頁。核心提示:創(chuàng)建線程來處理客戶端請(qǐng)求。我們不打算在例子里實(shí)現(xiàn)這樣的功能。但是,創(chuàng)建一個(gè)新的線程或進(jìn)程來完成與客戶端通訊是一種非常常用的手段。SocketServer模塊是一個(gè)基于socket模塊的高級(jí)別的套接字通訊模塊,它支持在新的線程或進(jìn)程中處理客戶端請(qǐng)求。在臨時(shí)套接字創(chuàng)建好之后,通信就可以開始了??蛻襞c服務(wù)器都使用這個(gè)新創(chuàng)建的套接字進(jìn)行數(shù)據(jù)的發(fā)送與接收,直到通訊的某一方關(guān)閉了連接或發(fā)送了一個(gè)空字符串之后,通訊就結(jié)束了。在代碼中,當(dāng)客戶端連接關(guān)閉后,服務(wù)器繼續(xù)等待下一個(gè)客戶端的連接。代碼的最

35、后一行,會(huì)把服務(wù)器的套接字關(guān)閉。由于服務(wù)器處在無限循環(huán)中,不可能會(huì)走到這一步,所以,這一步是可選的。我們寫這一句話的主要目的是要提醒讀者,在設(shè)計(jì)一個(gè)更智能的退出方案時(shí),比方說,服務(wù)器被通知要關(guān)閉時(shí),要確保close()函數(shù)會(huì)被調(diào)用。7.2.1 套接字第34頁,共85頁?!纠?-1】TCP時(shí)間戳服務(wù)器(tsTserv.py)創(chuàng)建一個(gè)能接收客戶端的消息,在消息前加一個(gè)時(shí)間戳后返回的TCP服務(wù)器。1 #!/usr/bin/envpython2 3 fromsocketimport*4 fromtimeimportctime56 HOST=7PORT=215678 BUFSIZ=10249 ADDR=

36、(HOST,PORT)1011 tcpSerSock=socket(AF_INET,SOCK_STREAM)12 tcpSerSock.bind(ADDR)13 tcpSerSock.listen(5)1415 whileTrue:16 printwaitingforconnection.17 tcpCliSock,addr=tcpSerSock.accept()18 print.connectedfrom:,addr1920 whileTrue:21 data=tcpCliSock.recv(BUFSIZ)22 ifnotdata:7.2.1 套接字第35頁,共85頁。23break24tc

37、pCliSock.send(%s%s%(25ctime(),data)2627tcpCliSock.close()28tcpSerSock.close()逐行解釋14行,第1行是Unix的啟動(dòng)信息行,隨后我們導(dǎo)入了time.ctime()函數(shù)和socket模塊的所有屬性。613行HOST變量為空,表示bind()函數(shù)可以綁定在所有有效的地址上。我們還選用了一個(gè)隨機(jī)生成的未被占用的端口號(hào)。在程序中,我們把緩沖區(qū)的大小設(shè)定為1K。你可以根據(jù)網(wǎng)絡(luò)情況和應(yīng)用的需要來修改這個(gè)大小。listen()函數(shù)的參數(shù)只是表示最多允許多少個(gè)連接同時(shí)連進(jìn)來,而后來的連接就會(huì)被拒絕掉。TCP服務(wù)器的套接字(tcpSer

38、Sock)在第11行被生成。隨后把套接字綁定到服務(wù)器的地址上,然后開始TCP監(jiān)聽。1528行在進(jìn)入到服務(wù)器的無限循環(huán)后,我們(被動(dòng)地)等待連接的到來。當(dāng)有連接時(shí),我們進(jìn)入對(duì)話循環(huán),等待客戶端發(fā)送數(shù)據(jù)。如果消息為空,表示客戶端已經(jīng)退出,那就再去等待下一個(gè)客戶端連接。得到客戶端消息后,我們?cè)谙⑶凹右粋€(gè)時(shí)間戳然后返回。最后一行不會(huì)被執(zhí)行到,放在這里用于提醒讀者,在服務(wù)器要退出的時(shí)候,要記得調(diào)用close()函數(shù)。7.2.1 套接字第36頁,共85頁?!纠?-2】創(chuàng)建TCP客戶端創(chuàng)建TCP客戶端相對(duì)服務(wù)器來說更為容易。與TCP服務(wù)器那節(jié)類似,我們也是先給出偽代碼及其解釋,然后再給出真正的代碼。cs=

39、socket()#創(chuàng)建客戶端套接字cs.connect()#嘗試連接服務(wù)器comm_loop:#通信循環(huán)cs.send()/cs.recv()#對(duì)話(發(fā)送/接收)cs.close()#關(guān)閉客戶端套接字如前所述,所有的套接字都由socket.socket()函數(shù)創(chuàng)建。在客戶端有了套接字之后,馬上就可以調(diào)用connect()函數(shù)去連接服務(wù)器。連接建立后,就可以與服務(wù)器開始對(duì)話了。在對(duì)話結(jié)束后,客戶端就可以關(guān)閉套接字,結(jié)束連接。7.2.1 套接字第37頁,共85頁。代碼如下:#!/usr/bin/envpythonfromsocketimport*HOST=localhostPORT=21567BU

40、FSIZ=1024ADDR=(HOST,PORT)tcpCliSock=socket(AF_INET,SOCK_STREAM)tcpCliSock.connect(ADDR)whileTrue:data=raw_input()ifnotdata:breaktcpCliSock.send(data)data=tcpCliSock.recv(BUFSIZ)ifnotdata:breakprintdatatcpCliSock.close()7.2.1 套接字第38頁,共85頁。【例7-2】中,我們給出了TsTclnt.py的代碼。程序連接到服務(wù)器,提示用戶輸入要傳輸?shù)臄?shù)據(jù),然后通過客戶端代碼顯示服務(wù)

41、器返回的加了時(shí)間戳的結(jié)果。逐行解釋13行,第1行是Unix的啟動(dòng)信息行,隨后我們導(dǎo)入了socket模塊的所有屬性。例16.2TCP時(shí)間戳客戶端(tsTclnt.py),創(chuàng)建一個(gè)TCP客戶端,程序會(huì)提示用戶輸入要傳給服務(wù)器的信息,顯示服務(wù)器返回的加了時(shí)間戳的結(jié)果。511行HOST和PORT變量表示服務(wù)器的主機(jī)名與端口號(hào)。由于我們?cè)谕慌_(tái)電腦上進(jìn)行測(cè)試,所以HOST里放的是本機(jī)的主機(jī)名(如果你的服務(wù)器運(yùn)行在其他電腦上,要做相應(yīng)的修改)。端口號(hào)要與服務(wù)器上的設(shè)置完全相同(不然就沒辦法通信了)。緩沖區(qū)的大小還是設(shè)為1K。TCP客戶套接字(tcpCliSock)在第10行創(chuàng)建。然后就去連接服務(wù)器。132

42、3行客戶端也有一個(gè)無限循環(huán),但這跟服務(wù)器的那個(gè)不期望退出的無限循環(huán)不一樣??蛻舳说难h(huán)在以下兩個(gè)條件的任意一個(gè)發(fā)生后就退出:用戶沒有輸入任何內(nèi)容(1416行)或服務(wù)器由于某種原因退出,導(dǎo)致recv()函數(shù)失敗(1820行)。否則,在一般情況下,客戶端會(huì)把用戶輸入的字符串發(fā)給服務(wù)器進(jìn)行處理,然后接收并顯示服務(wù)器傳回來的加了時(shí)間戳的字符串。7.2.1 套接字第39頁,共85頁。常見的socket方法有很多,本小節(jié)將詳細(xì)介紹這些socket方法。socket.accept() ,接受一個(gè)連接,但前提是socket必須已經(jīng)綁定了一個(gè)地址,在等待連接。返回值是一個(gè)(conn, addresss)的值對(duì),

43、這里的conn是一個(gè)socket對(duì)象,可以用來改送或接收數(shù)據(jù).而address是連接另一端綁定的地址,socket.getpeername()函數(shù)也能返回該地址。socket.bind(address),將socket對(duì)象綁定到一個(gè)地址,但這個(gè)地址必須是沒有被占用的,否則會(huì)連接失敗。這里的address一般是一個(gè)ip,port對(duì),如(localhost, 10000)socket.close(),關(guān)閉連接,當(dāng)socket.close()執(zhí)行時(shí),與這個(gè)連接相關(guān)的底層操作也會(huì)關(guān)閉(如文件描述符),一旦關(guān)閉,再對(duì)相關(guān)的文件對(duì)象操作都會(huì)失敗。socket.connect(address),連接到一個(gè)a

44、ddress對(duì)應(yīng)的遠(yuǎn)程socket。如果連接被中斷,這個(gè)方法會(huì)等待直到連接完成,或者會(huì)拋出socket.timeout錯(cuò)誤(超時(shí))socket.connect_ex(address), 類似與connect(address),但是當(dāng)遇到c語言層的異常時(shí),并不會(huì)拋出異常,而是返回一個(gè)錯(cuò)誤指示器。但其他異常如host not found還是會(huì)拋出異常,操作成功時(shí),錯(cuò)誤指示器的值是0,否則是不確定的值。7.2.2 常見的socket方法第40頁,共85頁。如: import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.

45、connect_ex(localhost, 1024)111socket.detach(),將socket 對(duì)象設(shè)置為關(guān)閉狀態(tài),但底層的文件描述符并沒關(guān)閉,仍可以進(jìn)行操作,返回值為文件描述符。socket.dup(), 復(fù)制一個(gè)socketsocket.fileno(),返回文件描述符(一個(gè)很小的整數(shù)),如果失敗返回,返回的個(gè)整數(shù)不能用在如os.fdopen()方法。7.2.2 常見的socket方法第41頁,共85頁。socket.get_inheritable(),測(cè)試socket是否可以繼承,True或者Falsesocket.getpeername() , 返回當(dāng)前socket連接的遠(yuǎn)

46、程地址socket.getsockname(), 返回socket自己的地址,如: s.bind(localhost, 10000) s.getsockname()(, 10000)socket.gettimeout(), 返回超時(shí)值,單位是秒,沒有設(shè)置返回None. s.gettimeout() print(s.gettimeout()Nonesocket.listen(backlog), 監(jiān)聽,使得服務(wù)器能接收服務(wù)端連接,如果backlog指定了(最少是0,如果比0小,系統(tǒng)默認(rèn)改成0),限制可以連接的數(shù)量,如果沒有指定,將指派一個(gè)默認(rèn)的合理值。socket.makefile(mode=r,

47、buffering=None, *, encoding=None, errors=None,newline=None), 返回一個(gè)文件對(duì)象,具體類型與參數(shù)相關(guān),除了只能指定r,w,b模式外,與open()函數(shù)一樣.前提條件是socket必須是阻塞模式,它可以含有一個(gè)超時(shí)間(指socket),如果發(fā)生超時(shí),內(nèi)部緩沖區(qū)會(huì)在不一致的狀態(tài)中關(guān)閉。關(guān)閉文件對(duì)象不會(huì)關(guān)閉socket,除非調(diào)用了socket.close()方法,或者所有其他文件對(duì)象都關(guān)閉了。7.2.2 常見的socket方法第42頁,共85頁。注意:在win上,makefile創(chuàng)建的一個(gè)類文件對(duì)象在需要文件描述符的文件對(duì)象的情況下是無法使用

48、的(意思大概是makefile創(chuàng)建的文件對(duì)象沒有文件描述符)7.2.2 常見的socket方法第43頁,共85頁。socket.recv(bufsize, flags),從socket接收數(shù)據(jù),注意是byte類型,bufsize指定一次最多接收的數(shù)據(jù)大小,socket.recvfrom(bufsize, flags) ,與上一個(gè)方法的區(qū)別是返回值除了數(shù)據(jù)還有發(fā)送數(shù)據(jù)的地址,返回值是一個(gè)數(shù)據(jù),地址對(duì)(data, address)socket.recvmsg(bufsize, ancbufsize, flags), 接收常規(guī)文件,附件等。ancbufsize設(shè)定附件接收緩沖區(qū),類似于bufsize

49、。但返回值是有四個(gè)元素的元組()。(data, ancdata, msg_flags, address). ancdata是一個(gè)含有四個(gè)0的列表或者是(cmsg_level, cmsg_type, cmsg_data)這樣的列表。socket.send(bytes,flags), 發(fā)送數(shù)據(jù)到socket,前提是已經(jīng)連接到遠(yuǎn)程socket,返回值是發(fā)送數(shù)據(jù)的量,檢查數(shù)據(jù)是否發(fā)送完是應(yīng)用的責(zé)任socket.sendall(bytes,flags), 同上,與send不同的是,它會(huì)一直發(fā)送完為止,或者發(fā)生了錯(cuò)誤,導(dǎo)致異常。發(fā)送成功返回Nonesocket.sendto(bytes, flags, a

50、ddress), 基本與socket.send()相同socket.sendmsg()對(duì)應(yīng)上面的socket.recvmsg()7.2.2 常見的socket方法第44頁,共85頁。7.3 網(wǎng)絡(luò)數(shù)據(jù)抓取“網(wǎng)絡(luò)數(shù)據(jù)抓取”是指利用互聯(lián)網(wǎng)搜索引擎技術(shù)實(shí)現(xiàn)有針對(duì)性、行業(yè)性、精準(zhǔn)性的數(shù)據(jù)抓取,并按照一定規(guī)則和篩選標(biāo)準(zhǔn)進(jìn)行數(shù)據(jù)歸類,并形成數(shù)據(jù)庫文件的一個(gè)過程。第45頁,共85頁。7.3.1 JSON數(shù)據(jù)使用過最新版火車采集器V9的朋友應(yīng)該都發(fā)現(xiàn)V9新增了json提取的功能,但是許多使用抓取網(wǎng)頁數(shù)據(jù)工具的朋友在操作此功能的時(shí)候都會(huì)覺得有點(diǎn)弄不明白,這里特意為大家整理了json提取的教程示例,感興趣的朋友可以

51、仔細(xì)研究一下。 首先大家需要明白JSON 是有兩種結(jié)構(gòu),簡(jiǎn)單的說json就是javascript中的對(duì)象和數(shù)組,所以這兩種結(jié)構(gòu)就是對(duì)象和數(shù)組兩種,通過這兩種結(jié)構(gòu)可以表示各種復(fù)雜的結(jié)構(gòu)。下面具體說明一下。第46頁,共85頁。1、對(duì)象:對(duì)象在js中表示為“”括起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為 key:value,key:value,.的鍵值對(duì)的結(jié)構(gòu),在面向?qū)ο蟮恼Z言中,key為對(duì)象的屬性,value為屬性值,所以很容易理解,取值方法為對(duì)象key 獲取屬性值value,這個(gè)屬性值的類型可以是數(shù)字、字符串、數(shù)組、對(duì)象幾種。2、數(shù)組:數(shù)組在js中是中括號(hào)“”括起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為java,javascript,

52、vb,.,取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是 數(shù)字、字符串、數(shù)組、對(duì)象幾種。7.3.1 JSON數(shù)據(jù)第47頁,共85頁。經(jīng)過對(duì)象、數(shù)組2種結(jié)構(gòu)就可以組合成復(fù)雜的數(shù)據(jù)結(jié)構(gòu)了。如下: name: 中國, province: name: 黑龍江, cities: city: 哈爾濱, 大慶 , name: 廣東, cities: city: 廣州, 深圳, 珠海 , name: 臺(tái)灣, cities: city: 臺(tái)北, 高雄 , name: 新疆, cities: city: 烏魯木齊 7.3.1 JSON數(shù)據(jù)第48頁,共85頁。下面舉例說明JSON提取的2種方式:1、JS

53、ON數(shù)據(jù)源:URL網(wǎng)址如我們需要對(duì)JSON網(wǎng)址/dealer/LoadDealerPrice.ashx?_callback=LoadDealerPrice&type=1&seriesid=3170&city=340100 做采集分析得出:此URL的整個(gè)源代碼是個(gè)完整的JSON。 所以JSON數(shù)據(jù)源選擇 URL網(wǎng)址然后勾選循環(huán)匹配,就可以采集到整個(gè)JSON里的數(shù)據(jù)。7.3.2 常見抓取數(shù)據(jù)方法第49頁,共85頁。7.3.2 常見抓取數(shù)據(jù)方法 圖7-4 JSON數(shù)據(jù)源第50頁,共85頁。7.3.2 常見抓取數(shù)據(jù)方法2、JSON數(shù)據(jù)源:JSON文本: 另外一種情況,網(wǎng)址里的源碼不全是JSON,而只是

54、一部分代碼是JSON形式,此時(shí)我們需要提取出這段JSON文本,然后再格式化。例如網(wǎng)址 /config/series/3170.html所以我們需要通過多頁的形式,來獲取本頁地址里這部分JSON代碼,然后再設(shè)置JSON表達(dá)式。如圖 7-5第51頁,共85頁。7.3.2 常見抓取數(shù)據(jù)方法按照上面的步驟,兩種JSON提取就完成了,廣大用戶朋友們是不是覺得簡(jiǎn)單又好用,所以抓取網(wǎng)頁數(shù)據(jù)工具首選火車采集器V9,功能全面且易用,新手朋友們多多聯(lián)系,一定能快速上手,如還有疑問或其他問題請(qǐng)隨時(shí)聯(lián)系官方客服為您解答哦!第52頁,共85頁。7.3.3 利用BeautifulSoup來抓取HTML1. 安裝Beaut

55、ifulsoup4pip install beautifulsoup4pip install lxmlpip install html5liblxml 和 html5lib 是解析器2. html上面的html保存html文件The Website Title第53頁,共85頁。7.3.3 利用BeautifulSoup來抓取HTMLDownload my Python book from my website.Learn Python the easy way!By Al Sweigart3.開始解析import bs4exampleFile = open(example.html)exam

56、pleSoup = bs4.BeautifulSoup(exampleFile.read(),html5lib)elems = exampleSoup.select(#author)type(elems)第54頁,共85頁。7.3.3 利用BeautifulSoup來抓取HTMLprint (elems0.getText()結(jié)果輸出 Al SweigartBeautifulSoup 使用select 方法尋找元素,類似jquery的css選擇器soup.select(div) 所有為的元素soup.select(#author) id為author的元素soup.select(.notice)

57、 class 為notice的元素第55頁,共85頁。 7.4 Python網(wǎng)絡(luò)常用模塊第56頁,共85頁。Python的urllib和urllib2模塊都做與請(qǐng)求URL相關(guān)的操作,但他們提供不同的功能。他們兩個(gè)最顯著的差異如下:urllib2可以接受一個(gè)Request對(duì)象,并以此可以來設(shè)置一個(gè)URL的headers,但是urllib只接收一個(gè)URL。這意味著,你不能偽裝你的用戶代理字符串等。urllib模塊可以提供進(jìn)行urlencode的方法,該方法用于GET查詢字符串的生成,urllib2的不具有這樣的功能。這就是urllib與urllib2經(jīng)常在一起使用的原因。urllib是基于http

58、的高層庫,它有以下三個(gè)主要功能:(1)request處理客戶端的請(qǐng)求(2)response處理服務(wù)端的響應(yīng)(3)parse會(huì)解析url7.4.1 urllib和urllib2模塊第57頁,共85頁。下面討論的是requesturllib.request模塊定義了一些打開URLs(一般是HTTP協(xié)議)復(fù)雜操作像是basic 和摘要模式認(rèn)證,重定向,cookies等的方法和類。這個(gè)模塊式模擬文件模塊實(shí)現(xiàn)的,將本地的文件路徑改為遠(yuǎn)程的url。因此函數(shù)返回的是類文件對(duì)象(file-like object)urllib.request.urlopen(url, data=None, timeout, *

59、, cafile=None, capath=None, cadefault=False, context=None)url可以是一個(gè)字符串形式或者Request 對(duì)象如說data參數(shù)有值就是用post方式響應(yīng)否則默認(rèn)為get方式urllib.request 模塊使用HTTP/1.1 的無連接的狀態(tài)協(xié)議7.4.1 urllib和urllib2模塊第58頁,共85頁。urlopen()函數(shù)返回類文件對(duì)象,提供以下內(nèi)建方法:read() , readline() ,readlines() , fileno() , close() :這些方法的使用方式與文件對(duì)象完全一樣info():返回一個(gè)httpl

60、ib.HTTPMessage對(duì)象,表示遠(yuǎn)程服務(wù)器返回的頭信息getcode():返回Http狀態(tài)碼。(詳情參考/html/rfc7231#section-6) 如果是http請(qǐng)求:1xx(informational):請(qǐng)求已經(jīng)收到,正在進(jìn)行中2xx(successful):請(qǐng)求成功接收,解析,完成3xx(Redirection):需要重定向4xx(Client Error):客戶端問題,請(qǐng)求存在語法錯(cuò)誤,網(wǎng)址未找到5xx(Server Error):服務(wù)器問題7.4.1 urllib和urllib2模塊第59頁,共85頁。import reimport urllib2import reques

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論