Python網(wǎng)絡爬蟲技術課件_第1頁
Python網(wǎng)絡爬蟲技術課件_第2頁
Python網(wǎng)絡爬蟲技術課件_第3頁
Python網(wǎng)絡爬蟲技術課件_第4頁
Python網(wǎng)絡爬蟲技術課件_第5頁
已閱讀5頁,還剩249頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Python爬蟲環(huán)境與爬蟲簡介2022/8/20第1頁,共254頁。1認識反爬蟲目錄認識爬蟲2配置Python爬蟲環(huán)境3小結(jié)4第2頁,共254頁。網(wǎng)絡爬蟲也被稱為網(wǎng)絡蜘蛛、網(wǎng)絡機器人,是一個自動下載網(wǎng)頁的計算機程序或自動化腳本。網(wǎng)絡爬蟲就像一只蜘蛛一樣在互聯(lián)網(wǎng)上沿著URL的絲線爬行,下載每一個URL所指向的網(wǎng)頁,分析頁面內(nèi)容。爬蟲的概念第3頁,共254頁。通用網(wǎng)絡爬蟲又稱為全網(wǎng)爬蟲,其爬行對象由一批種子URL擴充至整個Web,該類爬蟲比較適合為搜索引擎搜索廣泛的主題,主要由搜索引擎或大型Web服務提供商使用。深度優(yōu)先策略:按照深度由低到高的順序,依次訪問下一級網(wǎng)頁鏈接,直到無法再深入為止。廣度

2、優(yōu)先策略:按照網(wǎng)頁內(nèi)容目錄層次的深淺來爬行,優(yōu)先爬取較淺層次的頁面。當同一層中的頁面全部爬行完畢后,爬蟲再深入下一層。爬蟲的原理1.通用網(wǎng)絡爬蟲第4頁,共254頁。聚焦網(wǎng)絡爬蟲又被稱作主題網(wǎng)絡爬蟲,其最大的特點是只選擇性地爬行與預設的主題相關的頁面。 基于內(nèi)容評價的爬行策略:該種策略將用戶輸入的查詢詞作為主題,包含查詢詞的頁面被視為與主題相關的頁面。 基于鏈接結(jié)構(gòu)評價的爬行策略:該種策略將包含很多結(jié)構(gòu)信息的半結(jié)構(gòu)化文檔Web頁面用來評價鏈接的重要性,其中一種廣泛使用的算法為PageRank算法?;谠鰪妼W習的爬行策略:該種策略將增強學習引入聚焦爬蟲,利用貝葉斯分類器對超鏈接進行分類,計算出每個

3、鏈接的重要性,按照重要性決定鏈接的訪問順序?;谡Z境圖的爬行策略:該種策略通過建立語境圖學習網(wǎng)頁之間的相關度,計算當前頁面到相關頁面的距離,距離越近的頁面中的鏈接優(yōu)先訪問。爬蟲的原理2. 聚焦網(wǎng)絡爬蟲第5頁,共254頁。增量式網(wǎng)絡爬蟲只對已下載網(wǎng)頁采取增量式更新或只爬行新產(chǎn)生的及已經(jīng)發(fā)生變化的網(wǎng)頁,需要通過重新訪問網(wǎng)頁對本地頁面進行更新,從而保持本地集中存儲的頁面為最新頁面。常用的更新方法如下。統(tǒng)一更新法:以相同的頻率訪問所有網(wǎng)頁,不受網(wǎng)頁本身的改變頻率的影響。個體更新法:根據(jù)個體網(wǎng)頁的改變頻率來決定重新訪問各頁面的頻率?;诜诸惖母路ǎ号老x按照網(wǎng)頁變化頻率分為更新較快和更新較慢的網(wǎng)頁類別,

4、分別設定不同的頻率來訪問這兩類網(wǎng)頁。爬蟲的原理3. 增量式網(wǎng)絡爬蟲第6頁,共254頁。Web頁面按照存在方式可以分為表層頁面和深層頁面兩類。表層頁面指以傳統(tǒng)搜索引擎可以索引到的頁面,深層頁面為大部分內(nèi)容無法通過靜態(tài)鏈接獲取,隱藏在搜索表單后的,需要用戶提交關鍵詞后才能獲得的Web頁面。深層爬蟲的核心部分為表單填寫,包含以下兩種類型。基于領域知識的表單填寫:該種方法一般會維持一個本體庫,通過語義分析來選取合適的關鍵詞填寫表單?;诰W(wǎng)頁結(jié)構(gòu)分析的表單填寫:這種方法一般無領域知識或僅有有限的領域知識,將HTML網(wǎng)頁表示為DOM樹形式,將表單區(qū)分為單屬性表單和多屬性表單,分別進行處理,從中提取表單各字

5、段值。爬蟲的原理4. 深層網(wǎng)絡爬蟲第7頁,共254頁。目前,多數(shù)網(wǎng)站允許將爬蟲爬取的數(shù)據(jù)用于個人使用或者科學研究。但如果將爬取的數(shù)據(jù)用于其他用途,尤其是轉(zhuǎn)載或者商業(yè)用途,嚴重的將會觸犯法律或者引起民事糾紛。以下兩種數(shù)據(jù)是不能爬取的,更不能用于商業(yè)用途。個人隱私數(shù)據(jù):如姓名、手機號碼、年齡、血型、婚姻情況等,爬取此類數(shù)據(jù)將會觸犯個人信息保護法。明確禁止他人訪問的數(shù)據(jù):例如用戶設置了賬號密碼等權(quán)限控制,進行了加密的內(nèi)容。還需注意版權(quán)相關問題,有作者署名的受版權(quán)保護的內(nèi)容不允許爬取后隨意轉(zhuǎn)載或用于商業(yè)用途。爬蟲的合法性與robot.txt協(xié)議1. 爬蟲的合法性第8頁,共254頁。當使用一個爬蟲爬取一

6、個網(wǎng)站的數(shù)據(jù)時,需要遵守網(wǎng)站所有者針對所有爬蟲所制定的協(xié)議,這便是robot.txt協(xié)議。該協(xié)議通常存放在網(wǎng)站根目錄下,里面規(guī)定了此網(wǎng)站那些內(nèi)容可以被爬蟲獲取,及哪些網(wǎng)頁是不允許爬蟲獲取的。爬蟲的合法性與robot.txt協(xié)議2. robot.txt協(xié)議第9頁,共254頁。1認識反爬蟲目錄認識爬蟲2配置Python爬蟲環(huán)境3小結(jié)4第10頁,共254頁。瀏覽器在發(fā)送請求的時候,會附帶一部分瀏覽器及當前系統(tǒng)環(huán)境的參數(shù)給服務器,服務器會通過User-Agent的值來區(qū)分不同的瀏覽器。網(wǎng)站反爬蟲的目的與手段1. 通過User-Agent校驗反爬第11頁,共254頁。普通用戶通過瀏覽器訪問網(wǎng)站的速度相對

7、爬蟲而言要慢的多,所以不少網(wǎng)站會利用這一點對訪問頻度設定一個閾值,如果一個IP單位時間內(nèi)訪問頻度超過了預設的閾值,將會對該IP做出訪問限制。通常需要經(jīng)過驗證碼驗證后才能繼續(xù)正常訪問,嚴重的甚至會禁止該IP訪問網(wǎng)站一段時間。網(wǎng)站反爬蟲的目的與手段 2. 通過訪問頻度反爬第12頁,共254頁。有部分網(wǎng)站不論訪問頻度如何,一定要來訪者輸入驗證碼才能繼續(xù)操作。例如12306網(wǎng)站,不管是登陸還是購票,全部需要驗證驗證碼,與訪問頻度無關。網(wǎng)站反爬蟲的目的與手段3. 通過驗證碼校驗反爬第13頁,共254頁。一些社交網(wǎng)站常常會更換網(wǎng)頁結(jié)構(gòu),而爬蟲大部分情況下都需要通過網(wǎng)頁結(jié)構(gòu)來解析需要的數(shù)據(jù),所以這種做法也能

8、起到反爬蟲的作用。在網(wǎng)頁結(jié)構(gòu)變換后,爬蟲往往無法在原本的網(wǎng)頁位置找到原本需要的內(nèi)容。網(wǎng)站反爬蟲的目的與手段4. 通過變換網(wǎng)頁結(jié)構(gòu)反爬第14頁,共254頁。部分網(wǎng)站需要登錄才能繼續(xù)操作,這部分網(wǎng)站雖然并不是為了反爬蟲才要求登錄操作,但確實起到了反爬蟲的作用。例如微博查看評論就需要登錄賬號。網(wǎng)站反爬蟲的目的與手段5. 通過賬號權(quán)限反爬第15頁,共254頁。針對之前介紹的常見的反爬蟲手段,可以制定對應的爬取策略如下。發(fā)送模擬User-Agent:通過發(fā)送模擬User-Agent來通過檢驗,將要發(fā)送至網(wǎng)站服務器的請求的User-Agent值偽裝成一般用戶登錄網(wǎng)站時使用的User-Agent值。調(diào)整訪問

9、頻度:通過備用IP測試網(wǎng)站的訪問頻率閾值,然后設置訪問頻率比閾值略低。這種方法既能保證爬取的穩(wěn)定性,又能使效率又不至于過于低下。通過驗證碼校驗:使用IP代理,更換爬蟲IP;通過算法識別驗證碼;使用cookie繞過驗證碼。應對網(wǎng)站結(jié)構(gòu)變化:只爬取一次時,在其網(wǎng)站結(jié)構(gòu)調(diào)整之前,將需要的數(shù)據(jù)全部爬取下來;使用腳本對網(wǎng)站結(jié)構(gòu)進行監(jiān)測,結(jié)構(gòu)變化時,發(fā)出告警并及時停止爬蟲。通過賬號權(quán)限限制:通過模擬登錄的方法進行規(guī)避,往往也需要通過驗證碼檢驗。通過代理IP規(guī)避:通過代理進行IP更換可有效規(guī)避網(wǎng)站檢測,需注意公用IP代理池是 網(wǎng)站重點監(jiān)測對象。爬取策略制定第16頁,共254頁。1認識反爬蟲目錄認識爬蟲2配置

10、Python爬蟲環(huán)境3小結(jié)4第17頁,共254頁。目前Python有著形形色色的爬蟲相關庫,按照庫的功能,整理如下。Python爬蟲相關庫介紹與配置Python爬蟲相關庫類型庫名簡介通用urllibPython內(nèi)置的HTTP請求庫,提供一系列用于操作URL的功能requests基于urllib,采用Apache2 Licensed開源協(xié)議的HTTP庫urllib 3提供很多Python標準庫里所沒有的重要特性:線程安全,連接池,客戶端SSL/TLS驗證,文件分部編碼上傳,協(xié)助處理重復請求和HTTP重定位,支持壓縮編碼,支持HTTP和SOCKS代理,100%測試覆蓋率框架scrapy一個為了爬取

11、網(wǎng)站數(shù)據(jù),提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應用框架HTML/XML解析器lxmlC語言編寫高效HTML/XML處理庫。支持XPathBeautifulSoup 4純Python實現(xiàn)的HTML/XML處理庫,效率相對較低第18頁,共254頁。MySQL版本為社區(qū)版本mysql-installer-community-,在64位的Windows系統(tǒng)上,安裝該版本的MySQL具體步驟如下。雙擊打開msi安裝包,勾選接受許可條款,單擊“Next”按 鈕后進入產(chǎn)品安裝選擇。配置MySQL數(shù)據(jù)庫1. Windows下MySQL配置第19頁,共254頁。在彈出框中選擇64位版本。配置MySQL數(shù)據(jù)庫1. Window

12、s下MySQL配置第20頁,共254頁。在下方左側(cè)欄內(nèi)選擇需要安裝的程序,單擊右箭頭移至安裝欄內(nèi)。配置MySQL數(shù)據(jù)庫1. Windows下MySQL配置第21頁,共254頁。單擊 “Next”按鈕后,會檢測系統(tǒng)上是否安裝有相關依賴的軟件,若沒有安裝,則會出現(xiàn)類似下圖所示的界面。配置MySQL數(shù)據(jù)庫1. Windows下MySQL配置第22頁,共254頁。 單擊 “Next”按鈕后,進入安裝確認步驟,將被安裝的程序會顯示在框內(nèi),單擊“Execute”按鈕將開始安裝過程。配置MySQL數(shù)據(jù)庫1. Windows下MySQL配置第23頁,共254頁。安裝完成后,還需配置服務,一般用戶類型選擇“De

13、velopment Machine”,MySQL的默認端口為3306。配置MySQL數(shù)據(jù)庫1. Windows下MySQL配置第24頁,共254頁。設置root賬戶的密碼,可添加一個具有普通用戶權(quán)限的MySQL用戶賬戶,也可不添加。配置MySQL數(shù)據(jù)庫1. Windows下MySQL配置第25頁,共254頁。勾選“Configure MySQL Server as a Windows Service”后將以系統(tǒng)用戶運行windows服務,在Windows下MySQL默認服務名為mysql56。配置MySQL數(shù)據(jù)庫1. Windows下MySQL配置第26頁,共254頁。最后進入服務配置應用步驟

14、,單擊“Execute”按鈕將開始執(zhí)行。配置MySQL數(shù)據(jù)庫1. Windows下MySQL配置第27頁,共254頁。執(zhí)行成功的服務配置將變?yōu)榫G色的勾選狀態(tài),單擊 “Finish”按鈕完成配置過程。配置MySQL數(shù)據(jù)庫1. Windows下MySQL配置第28頁,共254頁。安裝完成后還需要配置MySQL的環(huán)境變量,步驟如下。打開“環(huán)境變量”對話框。右鍵單擊“我的電腦”圖標,單擊“高級系統(tǒng)設置”按鈕,在彈出的“系統(tǒng)屬性”對話框中單擊“環(huán)境變量”按鈕,即可彈出的“環(huán)境變量”對話框。配置MySQL數(shù)據(jù)庫1. Windows下MySQL配置第29頁,共254頁。設置MySQL的環(huán)境變量:設置環(huán)境變量

15、有兩種方法,以下為第一種。新建環(huán)境變量“MYSQL_HOME”,變量值填寫“C:Program FilesMySQLMySQL Server 5.6”,其中MySQL默認安裝在C:Program Files路徑下。在“Path”變量后面添加“%MYSQL_HOME%bin”。配置MySQL數(shù)據(jù)庫1. Windows下MySQL配置第30頁,共254頁。設置MySQL的環(huán)境變量:第二種設置環(huán)境變量的方法。直接在“Path”變量中添加“C:Program FilesMySQLMySQL Server 5.6bin”。配置MySQL數(shù)據(jù)庫1. Windows下MySQL配置第31頁,共254頁。使用

16、管理員權(quán)限運行命令提示符,使用“net start mysql56”命令啟動MySQL服務,使用“net stop mysql56”可關閉MySQL服務。配置MySQL數(shù)據(jù)庫1. Windows下MySQL配置第32頁,共254頁。Linux版本為CentOS 7,使用“yum”命令安裝mysql-community-5.6.40版本的MySQL數(shù)據(jù)庫。切換至root用戶,使用“rpm -qa | grep mysql”命令查看是否已經(jīng)安裝MySQL數(shù)據(jù)庫,沒有安裝將沒有顯示,若原本有安裝也可使用“rpm -e mysql”命令進行卸載。配置MySQL數(shù)據(jù)庫2. Linux下MySQL配置第3

17、3頁,共254頁。CentOS 7上將MySQL從默認軟件列表中移除,用MariaDB來代替,所以必須要去官網(wǎng)上進行下載,在官網(wǎng)上找到下載鏈接,用“wget”命令打開。配置MySQL數(shù)據(jù)庫2. Linux下MySQL配置第34頁,共254頁。使用“rpm -ivh mysql-community-release-el7-5.noarch.rpm”命令進行加載,之后運行“yum -y install mysql mysql-server mysql-devel” 命令進行安裝。配置MySQL數(shù)據(jù)庫2. Linux下MySQL配置第35頁,共254頁。安裝完成后再次運行“yum -y instal

18、l mysql mysql-server mysql-devel” 命令和“rpm -qa | grep mysql”命令進行確認。配置MySQL數(shù)據(jù)庫2. Linux下MySQL配置第36頁,共254頁。使用“service mysqld start”命令啟用MySQL服務。運行“mysql -u root -p”命令進入MySQL客戶端,密碼默認為空,可使用“help”或“h”命令查看幫助。配置MySQL數(shù)據(jù)庫2. Linux下MySQL配置第37頁,共254頁。使用64位的3.4版本的MongoDB: mongodb-win32-x86_64-2008plus-ssl-v3.4-late

19、st-signed.msi,安裝及具體配置過程如下。打開msi安裝包,勾選同意許可條款,單擊“Next”按鈕。配置MongoDB數(shù)據(jù)庫1. Windows下MongoDB配置第38頁,共254頁。 安裝程序提供兩種安裝模式,完整(Complete)模式會將全部內(nèi)容安裝在C盤路徑且無法更改,若要更改安裝路徑則需要選擇下圖中的定制(Custom)模式。配置MongoDB數(shù)據(jù)庫1. Windows下MongoDB配置第39頁,共254頁。在定制模式下可選擇安裝路徑和需要安裝的部件,單擊“Next”按鈕開始安裝過程。配置MongoDB數(shù)據(jù)庫1. Windows下MongoDB配置第40頁,共254頁。

20、安裝完成后,需進入安裝目錄,建立data和log文件夾分別存放數(shù)據(jù)和log文件,還需創(chuàng)建一個mongo.conf配置文件。配置MongoDB數(shù)據(jù)庫1. Windows下MongoDB配置第41頁,共254頁。在logs文件夾內(nèi)創(chuàng)建一個名為mongo.log的日志文件,內(nèi)容留空即可。在系統(tǒng)變量“Path”中添加MongoDB的路徑,如D:Program FilesMongoDBServer3.4bin。配置MongoDB數(shù)據(jù)庫1. Windows下MongoDB配置第42頁,共254頁。還需安裝MongoDB服務,使用管理員權(quán)限打開cmd啟動控制臺,安裝服務完畢后可使用命令對服務進行開啟和關閉。

21、配置MongoDB數(shù)據(jù)庫1. Windows下MongoDB配置第43頁,共254頁。服務啟動后,在瀏覽器輸入:27017,若出現(xiàn)下圖所示的字樣,則說明啟動成功。配置MongoDB數(shù)據(jù)庫1. Windows下MongoDB配置第44頁,共254頁。在Linux環(huán)境下,選用mongodb-linux-x86_64-rhel70-3.4.11版本的MongoDB數(shù)據(jù)庫,安裝步驟如下。使用“wget”命令從官網(wǎng)獲取MongoDB數(shù)據(jù)庫的tar包。配置MongoDB數(shù)據(jù)庫2.Linux下MongoDB配置第45頁,共254頁。將tar包進行解壓縮,并復制到“/usr/local/”路徑下。配置Mong

22、oDB數(shù)據(jù)庫2.Linux下MongoDB配置第46頁,共254頁。切換至“/usr/local/mongodb/bin”路徑下,使用 “sudo vim mongodb.conf” 命令創(chuàng)建MongoDB數(shù)據(jù)庫配置文件。配置MongoDB數(shù)據(jù)庫2.Linux下MongoDB配置第47頁,共254頁。切換回“/usr/local/mongodb”路徑下,依次運行“sudo mkdir data”、“cd data”、“sudo mkdir db”、“sudo mkdir logs”命令創(chuàng)建文件夾。配置MongoDB數(shù)據(jù)庫2.Linux下MongoDB配置第48頁,共254頁。再次切換至“/us

23、r/local/mongodb/bin”路徑下,運行“sudo ./mongod -f mongodb.conf”命令啟動MongoDB。打開瀏覽器輸入“:27017”,出現(xiàn)下圖中的信息,說明啟動成功。配置MongoDB數(shù)據(jù)庫2.Linux下MongoDB配置第49頁,共254頁。1認識反爬蟲目錄認識爬蟲2配置Python爬蟲環(huán)境3小結(jié)4第50頁,共254頁。本章對爬蟲及反爬蟲進行了一個基本概述,同時簡要介紹了Python爬蟲環(huán)境,對本章內(nèi)容做小結(jié)如下。爬蟲是一種可以自動下載網(wǎng)頁的腳本或計算機工具,可大致分為4種運作原理,用于個人或?qū)W術研究的爬蟲通常是合法的。反爬蟲為網(wǎng)站針對爬蟲進行檢測和限制

24、的過程,爬蟲需針對反爬蟲手段制定對應的爬取策略。Python常用的爬蟲庫包含urllib、requests、urllib 3、scrapy、lxml和BeautifulSoup 4等庫,通常需要配套數(shù)據(jù)庫用于存儲爬取的數(shù)據(jù)。小結(jié)第51頁,共254頁。第52頁,共254頁。網(wǎng)頁前端基礎2022/8/20第53頁,共254頁。1認識HTTP協(xié)議目錄認識Python網(wǎng)絡編程2小結(jié)3第54頁,共254頁。網(wǎng)絡上的兩個程序通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)的交換,這個連接的一端稱為一個socket。套接字是socket的通常叫法,用于描述IP地址和端口,是一個通信鏈的句柄,可以用來實現(xiàn)不同虛擬機或不同計算機

25、之間的通信。Python中Socket庫為操作系統(tǒng)的socket實現(xiàn)提供了一個Python接口。Python網(wǎng)絡編程Socket庫套接字(socket)第55頁,共254頁。socket庫中整合了多種協(xié)議類型。Python網(wǎng)絡編程Socket庫1. socket協(xié)議類型socket協(xié)議類型描述socket.AF_UNIX用于同一臺機器上的進程通信(本地通信)socket.AF_INET用于服務器與服務器之間的網(wǎng)絡通信socket.AF_INET6基于IPV6方式的服務器與服務器之間的網(wǎng)絡通信socket.SOCK_STREAM基于TCP的流式socket通信socket.SOCK_DGRAM基

26、于UDP的數(shù)據(jù)報式socket通信socket.SOCK_RAW原始套接字,普通的套接字無法處理ICMP、IGMP等網(wǎng)絡報文,而SOCK_RAW可以;其次SOCK_RAW也可以處理特殊的IPV4報文;此外,利用原始套接字,可以通過IP_HDRINCL套接字選項由用戶構(gòu)造IP頭socket.SOCK_SEQPACKET可靠的連續(xù)數(shù)據(jù)包服務第56頁,共254頁。服務器端Socket函數(shù):socket庫中的服務器端函數(shù)僅供服務器使用。Python網(wǎng)絡編程Socket庫2. socket函數(shù)語法格式描述socket.bind(address)將套接字綁定到地址,在AF_INET協(xié)議下,以tuple(h

27、ost,port)的方式傳入,如socket.bind(host,port),其中host為綁定的地址,port為監(jiān)聽的端口socket.listen(backlog)開始監(jiān)聽TCP傳入連接,backlog指定在拒絕鏈接前,操作系統(tǒng)可以掛起的最大連接數(shù),該值最少為1,大部分應用程序通常設為5socket.accept()接受TCP鏈接并返回(conn,address),其中conn是新的套接字對象,可以用來接收和發(fā)送數(shù)據(jù),address是鏈接客戶端的地址第57頁,共254頁。客戶端Socket函數(shù):socket庫中的客戶端函數(shù)僅供客戶端使用。Python網(wǎng)絡編程Socket庫2. socket

28、函數(shù)語法格式描述socket.connect(address)連接到address處的套接字,一般address的格式為tuple(host,port),若連接出錯,則返回socket.error錯誤socket.connect_ex(address)功能與socket.connect相同,但成功返回0,失敗返回error的值第58頁,共254頁。公共Socket函數(shù):socket庫中的公共函數(shù)即可在服務器端使用也可在客戶端使用,為通用函數(shù)。Python網(wǎng)絡編程Socket庫2. socket函數(shù)語法格式描述socket.recv(buffsize,flag)接受TCP套接字的數(shù)據(jù),數(shù)據(jù)以字符

29、串形式返回,buffsize指定要接受的最大數(shù)據(jù)量,flag提供有關消息的其他信息,通??梢院雎詓ocket.send(string,flag)發(fā)送TCP數(shù)據(jù),將字符串中的數(shù)據(jù)發(fā)送到鏈接的套接字,返回值是要發(fā)送的字節(jié)數(shù)量,該數(shù)量可能小于string的字節(jié)大小socket.sendall(string,flag)完整發(fā)送TCP數(shù)據(jù),將字符串中的數(shù)據(jù)發(fā)送到鏈接的套接字,但在返回之前嘗試發(fā)送所有數(shù)據(jù)。成功返回None,失敗則拋出異常socket.recvfrom(bufsize,flag)接受UDP套接字的數(shù)據(jù),與recv函數(shù)類似,但返回值是tuple(data,address)。其中data是包含

30、接受數(shù)據(jù)的字符串,address是發(fā)送數(shù)據(jù)的套接字地址socket.sendto(string,flag,address)發(fā)送UDP數(shù)據(jù),將數(shù)據(jù)發(fā)送到套接字,address形式為tuple(ipaddr,port),指定遠程地址發(fā)送,返回值是發(fā)送的字節(jié)數(shù)socket.close()關閉套接字第59頁,共254頁。公共Socket函數(shù):socket庫中的公共函數(shù)即可在服務器端使用也可在客戶端使用,為通用函數(shù)。Python網(wǎng)絡編程Socket庫2. socket函數(shù)語法格式描述socket.getpeername()返回套接字的遠程地址,返回值通常是一個tuple(ipaddr,port)sock

31、et.getsockname()返回套接字自己的地址,返回值通常是一個tuple(ipaddr,port)socket.setsockopt(level,optname,value)設置給定套接字選項的值socket.getsockopt(level,optname,buflen)返回套接字選項的值第60頁,共254頁。公共Socket函數(shù):socket庫中的公共函數(shù)即可在服務器端使用也可在客戶端使用,為通用函數(shù)。Python網(wǎng)絡編程Socket庫2. socket函數(shù)語法格式描述socket.settimeout(timeout)設置套接字操作的超時時間,timeout是一個浮點數(shù),單位是秒

32、,值為None時表示永遠不會超時。超時時間應在剛創(chuàng)建套接字時設置,因為它們可能用于連接的操作,如s.connect()socket.gettimeout()返回當前超時值,單位是秒,如果沒有設置超時則返回Nonesocket.fileno()返回套接字的文件描述socket.makefile()創(chuàng)建一個與該套接字相關的文件第61頁,共254頁。TCP連接由客戶端發(fā)起,服務器對連接進行響應。建立一個服務器,服務器進程需要綁定一個端口并監(jiān)聽來自其他客戶端的連接。若有客戶端發(fā)起連接請求,服務器就與該客戶端建立Socket連接,隨后的通信就通過此Socket連接進行。服務器依賴服務器地址,服務器端口,

33、客戶端地址,客戶端端口這4項來唯一確定一個Socket連接。使用Socket進行TCP編程第62頁,共254頁。建立服務器端的TCP連接,具體步驟如下。在Python中創(chuàng)建一個基于IPv4和TCP協(xié)議的Socket。綁定監(jiān)聽的地址和端口,地址使用本機地址“”或“l(fā)ocal host”,使用大于1024的端口。調(diào)用listen方法開始監(jiān)聽端口,傳入的參數(shù)指定等待連接的最大數(shù)量,設定為5。創(chuàng)建一個tcp函數(shù),該函數(shù)在連接建立后,服務器端首先發(fā)出一條表示連接成功的消息,然后等待客戶端數(shù)據(jù),再加上歡迎信息發(fā)送給客戶端。若客戶端發(fā)送exit字符串,則直接關閉連接。通過一個循環(huán)接受來自客戶端的連接,使用a

34、ccept函數(shù)等待并返回一個客戶端的連接,每個連接都分配一個新線程來處理。使用Socket進行TCP編程1. 服務器端TCP連接第63頁,共254頁。在服務器端TCP連接建立后,建立客戶端TCP連接進行測試,具體步驟如下。與服務器端的協(xié)議保持一致,也建立一個基于IPv4和TCP協(xié)議的Socket。與服務器端建立連接,連接的地址與端口需與服務器端保持一致。使用recv函數(shù)接受服務器提示信息,之后再使用send函數(shù)發(fā)送數(shù)據(jù)至服務器,可看到服務器返回的結(jié)果。使用Socket進行TCP編程2. 客戶端TCP連接第64頁,共254頁。TCP建立的連接可靠,通信雙方以流的形式互相傳送數(shù)據(jù)。相對TCP協(xié)議,

35、UDP則是面向無連接的協(xié)議。使用UDP協(xié)議時,無需建立連接的過程,僅需知道對方的IP地址及端口號,便可直接發(fā)送數(shù)據(jù)包,但無法保證能順利傳達到。雖然用UDP傳輸數(shù)據(jù)不可靠,但其傳輸速度比TCP快,對于不要求可靠到達的數(shù)據(jù),就可以使用UDP協(xié)議。UDP傳輸通常應用在通訊實時性要求更高于可靠性場景,例如網(wǎng)絡游戲。使用Socket進行UDP編程第65頁,共254頁。UDP連接與TCP連接類似,也分為服務器端和客戶端,不同的是UDP連接無需調(diào)用listen方法,直接接受來自任何客戶端的數(shù)據(jù)。建立UDP連接,服務器端同樣需要綁定地址與端口。使用recvfrom方法返回數(shù)據(jù)及客戶端的地址與端口。當服務器收到

36、數(shù)據(jù)后,直接調(diào)用sendto把數(shù)據(jù)用UDP發(fā)給客戶端。使用Socket進行UDP編程1. 服務器端UDP連接第66頁,共254頁??蛻舳耸褂肬DP連接時同樣需要先創(chuàng)建socket。之后無需使用connect方法,直接用sendto方法發(fā)送數(shù)據(jù)至服務器建立UDP連接,服務器端同樣需要綁定地址與端口。UDP連接與TCP連接可同時使用同一端口互不沖突,兩者使用的端口是獨立綁定的。使用Socket進行UDP編程2. 客戶端UDP連接第67頁,共254頁。1認識HTTP協(xié)議目錄認識Python網(wǎng)絡編程2小結(jié)3第68頁,共254頁。爬蟲在爬取數(shù)據(jù)時將會作為客戶端模擬整個HTTP通信過程,該過程也需要通過H

37、TTP協(xié)議實現(xiàn)。HTTP請求過程如下。由HTTP客戶端向服務器發(fā)起一個請求,創(chuàng)建一個到服務器指定端口(默認是80端口)的TCP連接。HTTP服務器從該端口監(jiān)聽客戶端的請求。一旦收到請求,服務器會向客戶端返回一個狀態(tài),比如“HTTP/1.1 200 OK”,以及返回的響應內(nèi)容,如請求的文件、錯誤消息、或其它信息。HTTP請求方式與過程第69頁,共254頁。在HTTP/1.1協(xié)議中共定義了8種方法(也叫“動作”)來以不同方式操作指定的資源,常用方法有GET、HEAD、POST等。HTTP請求方式與過程1. 請求方法請求方法方法描述GET請求指定的頁面信息,并返回實體主體。GET可能會被網(wǎng)絡爬蟲等隨

38、意訪問,因此GET方法應該只用在讀取數(shù)據(jù),而不應當被用于產(chǎn)生“副作用”的操作中,例如在Web Application中HEAD與GET方法一樣,都是向服務器發(fā)出指定資源的請求。只不過服務器將不傳回具體的內(nèi)容,使用這個方法可以在不必傳輸全部內(nèi)容的情況下,就可以獲取其中該資源的相關信息(元信息或稱元數(shù)據(jù))POST向指定資源提交數(shù)據(jù),請求服務器進行處理(例如提交表單或者上傳文件)。數(shù)據(jù)會被包含在請求中,這個請求可能會創(chuàng)建新的資源或修改現(xiàn)有資源,或二者皆有PUT從客戶端上傳指定資源的最新內(nèi)容,即更新服務器端的指定資源。第70頁,共254頁。HTTP協(xié)議采用了請求響應模型??蛻舳讼蚍掌靼l(fā)送一個請求報文

39、,請求報文包含請求的方法、URL、協(xié)議版本、請求頭部和請求數(shù)據(jù)。服務器以一個狀態(tài)行作為響應,響應的內(nèi)容包括協(xié)議的版本、響應狀態(tài)、服務器信息、響應頭部和響應數(shù)據(jù)。HTTP請求方式與過程2. 請求(request)與響應(response)第71頁,共254頁。客戶端與服務器間的請求與響應的具體步驟如下。連接Web服務器:由一個HTTP客戶端發(fā)起連接,與Web服務器的HTTP端口(默認為80)建立一個TCP套接字連接。發(fā)送HTTP請求:客戶端經(jīng)TCP套接字向Web服務器發(fā)送一個文本的請求報文。服務器接受請求并返回HTTP響應:Web服務器解析請求,定位該次的請求資源。之后將資源復本寫至TCP套接字

40、,由客戶端進行讀取。釋放連接TCP連接:若連接的connection模式為close,則由服務器主動關閉TCP連接,客戶端將被動關閉連接,釋放TCP連接;若connection模式為keepalive,則該連接會保持一段時間??蛻舳私馕鯤TML內(nèi)容:客戶端首先會對狀態(tài)行進行解析,之后解析每一個響應頭,最后讀取響應數(shù)據(jù)。HTTP請求方式與過程2. 請求(request)與響應(response)第72頁,共254頁。HTTP狀態(tài)碼是用來表示網(wǎng)頁服務器響應狀態(tài)的3位數(shù)字代碼,按首位數(shù)字分為5類狀態(tài)碼。常見HTTP狀態(tài)碼1. HTTP狀態(tài)碼種類狀態(tài)碼類型狀態(tài)碼意義1XX表示請求已被接受,需接后續(xù)處理

41、。這類響應是臨時響應,只包含狀態(tài)行和某些可選的響應頭信息,并以空行結(jié)束2XX表示請求已成功被服務器接收、理解并接受3XX表示需要客戶端采取進一步的操作才能完成請求。通常用來重定向,重定向目標需在本次響應中指明4XX表示客戶端可能發(fā)生了錯誤,妨礙了服務器的處理。5XX表示服務器在處理請求的過程中有錯誤或者異常狀態(tài)發(fā)生,也有可能是服務器以當前的軟硬件資源無法完成對請求的處理。第73頁,共254頁。HTTP狀態(tài)碼共有67種狀態(tài)碼,常見的狀態(tài)碼如下。常見HTTP狀態(tài)碼2. 常見HTTP狀態(tài)碼常見狀態(tài)碼狀態(tài)碼含義200 OK請求成功,請求所希望的響應頭或數(shù)據(jù)體將隨此響應返回。400 Bad Reques

42、t由于客戶端的語法錯誤、無效的請求或欺騙性路由請求,服務器不會處理該請求403 Forbidden服務器已經(jīng)理解該請求,但是拒絕執(zhí)行,將在返回的實體內(nèi)描述拒絕的原因,也可以不描述僅返回404響應404 Not Found請求失敗,請求所希望得到的資源未被在服務器上發(fā)現(xiàn),但允許用戶的后續(xù)請求500 Internal Server Error通用錯誤消息,服務器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理,不會給出具體錯誤信息503 Service Unavailable由于臨時的服務器維護或者過載,服務器當前無法處理請求。這個狀況是暫時的,并且將在一段時間以后恢復第74頁,共254頁。

43、HTTP頭部信息(HTTP header fields)是指在超文本傳輸協(xié)議(HTTP)的請求和響應消息中的消息頭部分。頭部信息定義了一個超文本傳輸協(xié)議事務中的操作參數(shù)。在爬蟲中需要使用頭部信息向服務器發(fā)送模擬信息,通過發(fā)送模擬的頭部信息將自己偽裝成一般的客戶端。HTTP頭部信息第75頁,共254頁。HTTP頭部類型按用途可分為:通用頭,請求頭,響應頭,實體頭。通用頭:既適用于客戶端的請求頭,也適用于服務端的響應頭。與HTTP消息體內(nèi)最終傳輸?shù)臄?shù)據(jù)是無關的,只適用于要發(fā)送的消息。請求頭:提供更為精確的描述信息,其對象為所請求的資源或請求本身。新版HTTP增加的請求頭不能在更低版本的HTTP中使

44、用,但服務器和客戶端若都能對相關頭進行處理,則可以在請求中使用。響應頭:為響應消息提供了更多信息。例如,關于資源位置的描述Location字段,以及關于服務器本身的描述使用Server字段等。與請求頭類似,新版增加的響應頭也不能在更低版本的HTTP版本中使用。實體頭:提供了關于消息體的描述。如消息體的長度Content-Length,消息體的MIME類型Content-Type。新版的實體頭可以在更低版本的HTTP版本中使用。HTTP頭部信息1. HTTP頭部類型第76頁,共254頁。HTTP頭字段根據(jù)實際用途被分為4種類型:通用頭字段(General Header Fields),請求頭字段

45、(Request Header Fields),響應頭字段(Response Header Fields),實體頭字段(Entity Header Fields)。HTTP頭部信息2. 常用頭字段字段名說明示例Accept可接受的響應內(nèi)容類型(Content-Types)Accept: text/plainAccept-Charset可接受的字符集Accept-Charset:utf-8Accept-Encoding可接受的響應內(nèi)容的編碼方式Accept-Encoding:gzip,deflateAccept-Language可接受的響應內(nèi)容語言列表Accept-Language:en-USC

46、ookie由之前服務器通過Set-Cookie設置的一個HTTP協(xié)議CookieCookie:$Version=1;Skin=new;Referer設置前一個頁面的地址,并且前一個頁面中的連接指向當前請求,意思就是如果當前請求是在A頁面中發(fā)送的,那么referer就是A頁面的url地址Referer:/wiki/Main_PageUser-Agent用戶代理的字符串值User-Agent:Mozilla/5.0(X11;Linuxx86_64;rv:12.0)Gecko/20100101Firefox/21.0第77頁,共254頁。HTTP是一種無狀態(tài)的協(xié)議,客戶端與服務器建立連接并傳輸數(shù)據(jù),

47、在數(shù)據(jù)傳輸完成后,本次的連接將會關閉,并不會留存相關記錄。服務器無法依據(jù)連接來跟蹤會話,也無法從連接上知曉用戶的歷史操作。這嚴重阻礙了基于Web應用程序的交互,也影響用戶的交互體驗。某些網(wǎng)站需要用戶登錄才進一步操作,用戶在輸入賬號密碼登錄后,才能瀏覽頁面。對于服務器而言,由于HTTP的無狀態(tài)性,服務器并不知道用戶有沒有登錄過,當用戶退出當前頁面訪問其他頁面時,又需重新再次輸入賬號及密碼。熟悉Cookie第78頁,共254頁。為解決HTTP的無狀態(tài)性帶來的負面作用,Cookie機制應運而生。Cookie本質(zhì)上是一段文本信息。當客戶端請求服務器時,若服務器需要記錄用戶狀態(tài),就在響應用戶請求時發(fā)送一

48、段Cookie信息??蛻舳藶g覽器會保存該Cookie信息,當用戶再次訪問該網(wǎng)站時,瀏覽器會把Cookie做為請求信息的一部分提交給服務器。服務器對Cookie進行驗證,以此來判斷用戶狀態(tài),當且僅當該Cookie合法且未過期時,用戶才可直接登錄網(wǎng)站。熟悉Cookie1. Cookie機制第79頁,共254頁。Cookie由用戶客戶端瀏覽器進行保存,按其存儲位置可分為內(nèi)存式存儲和硬盤式存儲。內(nèi)存式存儲將Cookie保存在內(nèi)存中,在瀏覽器關閉后就會消失,由于其存儲時間較短,因此也被稱為非持久Cookie或會話Cookie。硬盤式存儲將Cookie保存在硬盤中,其不會隨瀏覽器的關閉而消失,除非用戶手工

49、清理或到了過期時間。由于硬盤式Cookie存儲時間是長期的,因此也被稱為持久Cookie。熟悉Cookie2. Cookie的存儲方式第80頁,共254頁。客戶端與服務器間的Cookie實現(xiàn)過程的具體步驟如下??蛻舳苏埱蠓掌鳎嚎蛻舳苏埱缶W(wǎng)站頁面服務器響應請求:Cookie是一種字符串,為key=value形式,服務器需要記錄這個客戶端請求的狀態(tài),在響應頭中增加一個Set-Cookie字段??蛻舳嗽俅握埱蠓掌鳎嚎蛻舳藭Ψ掌黜憫腟et-Cookie頭信息進行存儲。當再次請求時,將會在請求頭中包含服務器響應的Cookie信息。熟悉Cookie3. Cookie的實現(xiàn)過程第81頁,共254頁

50、。1認識HTTP協(xié)議目錄認識Python網(wǎng)絡編程2小結(jié)3第82頁,共254頁。本章介紹了Python中的底層Socket庫,及運用socket庫建立TCP和UDP連接。并對超文本傳輸協(xié)議(HTTP)及其相關機制進行了簡要介紹。對本章做小結(jié)如下。 Socket庫提供多種協(xié)議類型和函數(shù),可用于建立TCP和UDP連接。HTTP協(xié)議基于TCP協(xié)議進行客戶端與服務器間的通訊,由客戶端發(fā)起請求,服務器進行應答。HTTP狀態(tài)碼由3位數(shù)字構(gòu)成,按首位數(shù)字可分為5類狀態(tài)碼。HTTP頭部信息為HTTP協(xié)議的請求與響應消息中的消息頭部分,其定義了該次傳輸事務中的操作參數(shù)。 Cookie機制可記錄用戶狀態(tài),服務器可依

51、據(jù)Cookie對用戶狀態(tài)進行記錄與識別。小結(jié)第83頁,共254頁。第84頁,共254頁。簡單靜態(tài)網(wǎng)頁爬取2022/8/20第85頁,共254頁。1解析網(wǎng)頁目錄實現(xiàn)HTTP請求2數(shù)據(jù)存儲3小結(jié)4第86頁,共254頁。許多Python的原生系統(tǒng)已經(jīng)開始使用urllib3庫,其提供了很多python標準庫里所沒有的重要特性。使用urllib3庫實現(xiàn)連接特性連接特性線程安全管理連接池客戶端SSLTLS驗證使用分部編碼上傳文件協(xié)助處理重復請求和HTTP重定位支持壓縮編碼支持HTTP和SOCKS代理測試覆蓋率達到100%第87頁,共254頁。通過request方法即可創(chuàng)建一個請求,該方法返回一個HTTP響

52、應對象。Reques語法格式如下。 reques方法常用的參數(shù)及其說明如下。使用urllib3庫實現(xiàn)1. 生成請求參數(shù)說明method接收string。表示請求的類型,如“GET”、“HEAD”、“DELETE”等。無默認值url接收string。表示字符串形式的網(wǎng)址。無默認值fields接收dict。表示請求類型所帶的參數(shù)。默認為Noneheaders接收dict。表示請求頭所帶參數(shù)。默認為None*urlopen_kw接收dict或其他Python中的類型的數(shù)據(jù)。依據(jù)具體需要及請求的類型可添加的參數(shù),通常參數(shù)賦值為字典類型或為具體數(shù)據(jù)。無默認值urllib3.request(method,

53、url,fields=None,headers=None,*urlopen_kw)第88頁,共254頁。在request方法中,如果需要傳入headers參數(shù),可通過定義一個字典類型實現(xiàn)。定義一個包含User-Agent信息的字典,使用瀏覽器為火狐和chrome瀏覽器,操作系統(tǒng)為“Windows NT 6.1; Win64; x64”,向網(wǎng)站“/tipdm/index.html”發(fā)送帶headers參數(shù)的GET請求,hearders參數(shù)為定義的User-Agent字典。使用urllib3庫實現(xiàn)2. 請求頭處理第89頁,共254頁。為防止因為網(wǎng)絡不穩(wěn)定、服務器不穩(wěn)定等問題造成連接不穩(wěn)定時的丟包,

54、可以在請求中增加timeout參數(shù)設置,通常為浮點數(shù)。依據(jù)不同需求,timeout參數(shù)提供多種設置方法,可直接在URL后設置該次請求的全部timeout參數(shù),也可分別設置該次請求的連接與讀取timeout參數(shù),在PoolManager實例中設置timeout參數(shù)可應用至該實例的全部請求中。使用urllib3庫實現(xiàn)3. Timeout設置第90頁,共254頁。urllib3庫可以通過設置retries參數(shù)對重試進行控制。默認進行3次請求重試,并進行3次重定向。自定義重試次數(shù)通過賦值一個整型給retries參數(shù)實現(xiàn),可通過定義retries實例來定制請求重試次數(shù)及重定向次數(shù)。若需要同時關閉請求重試

55、及重定向則可以將retries參數(shù)賦值為False,僅關閉重定向則將redirect參數(shù)賦值為False。與Timeout設置類似,可以在PoolManager實例中設置retries參數(shù)控制全部該實例下的請求重試策略。5. 生成完整HTTP請求使用urllib3庫實現(xiàn)生成一個完整的請求,該請求應當包含鏈接、請求頭、超時時間和重試次數(shù)設置。使用urllib3庫實現(xiàn)4.請求重試設置第91頁,共254頁。requests庫是一個原生的HTTP庫,比urllib3庫更為容易使用。requests庫發(fā)送原生的HTTP 1.1請求,無需手動為URL添加查詢字串,也不需要對POST數(shù)據(jù)進行表單編碼。相對于

56、urllib3庫,requests庫擁有完全自動化Keep-alive和HTTP連接池的功能。requests庫包含的特性如下。使用requests庫實現(xiàn)連接特性連接特性連接特性Keep-Alive&連接池基本摘要式的身份認證文件分塊上傳國際化域名和URL優(yōu)雅的keyvalue Cookie流下載帶持久Cookie的會話自動解壓連接超時瀏覽器式的SSL認證Unicode響應體分塊請求自動內(nèi)容解碼HTTP(S)代理支持支持.netrc第92頁,共254頁。requests庫生成請求的代碼非常便利,其使用的request方法的語法格式如下。 request方法常用的參數(shù)及其說明如下。 使用requ

57、ests庫實現(xiàn)1. 生成請求參數(shù)說明method接收string。表示請求的類型,如“GET”、“HEAD”、“DELETE”等。無默認值url接收string。表示字符串形式的網(wǎng)址。無默認值*kwargs接收dict或其他Python中的類型的數(shù)據(jù)。依據(jù)具體需要及請求的類型可添加的參數(shù),通常參數(shù)賦值為字典類型或為具體數(shù)據(jù)requests.request.method(url,*kwargs)第93頁,共254頁。需要注意的是,當requests庫猜測錯時,需要手動指定encoding編碼,避免返回的網(wǎng)頁內(nèi)容解析出現(xiàn)亂碼。手動指定的方法并不靈活,無法自適應對應爬取過程中不同網(wǎng)頁的編碼,而使用c

58、hardet庫比較簡便靈活,chardet庫是一個非常優(yōu)秀的字符串文件編碼檢測模塊。chardet庫使用detect方法檢測給定字符串的編碼,detect方法常用的參數(shù)及其說明如下。使用requests庫實現(xiàn)2. 查看狀態(tài)碼與編碼參數(shù)說明byte_str接收string。表示需要檢測編碼的字符串。無默認值第94頁,共254頁。requests庫中對請求頭的處理與urllib3庫類似,也使用headers參數(shù)在GET請求中上傳參數(shù),參數(shù)形式為字典。使用headers屬性即可查看服務器返回的響應頭,通常響應頭返回的結(jié)果會與上傳的請求參數(shù)對應。4. Timeout設置為避免因等待服務器響應造成程序永

59、久失去響應,通常需要給程序設置一個時間作為限制,超過該時間后程序?qū)詣油V沟却?。在requests庫中通過設置timeout這個參數(shù)實現(xiàn),超過該參數(shù)設定的秒數(shù)后,程序會停止等待。使用requests庫實現(xiàn)3. 請求頭與響應頭處理第95頁,共254頁。使用requests庫的request方法向網(wǎng)站“/tipdm/index.html”發(fā)送一個完整的GET請求,該請求包含鏈接、請求頭、響應頭、超時時間和狀態(tài)碼,并且編碼應正確設置。使用requests庫實現(xiàn)5. 生成完整HTTP請求第96頁,共254頁。1解析網(wǎng)頁目錄實現(xiàn)HTTP請求2數(shù)據(jù)儲存3小結(jié)4第97頁,共254頁。chrome瀏覽器提供

60、了一個非常便利的開發(fā)者工具,供廣大web開發(fā)者使用,該工具提供包括查看網(wǎng)頁元素、查看請求資源列表、調(diào)試JS等功能。該工具其中一個打開方式可通過右鍵單擊chrome瀏覽器頁面,在彈出菜單中單擊圖所示的“檢查”選項打開。 使用chrome開發(fā)者工具查看網(wǎng)頁第98頁,共254頁。也可以單擊chrome瀏覽器右上角快捷菜單,如圖所示,單擊“更多工具”選項中的“開發(fā)者工具”選項,或使用快捷鍵組合Ctrl+Shift+I。使用chrome開發(fā)者工具查看網(wǎng)頁第99頁,共254頁。chrome開發(fā)者工具目前包括了9個面板,界面如圖所示。使用chrome開發(fā)者工具查看網(wǎng)頁第100頁,共254頁。chrome開發(fā)

溫馨提示

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

評論

0/150

提交評論