★相比用Python寫網絡爬蟲,Java更有後發優勢
★運行在服務器端的網絡爬蟲,更應該用Java開發
★本書結閤作者多年網絡爬蟲開發經驗
★全麵係統講解瞭網絡爬蟲相關技術並以Java實現
★通俗易懂、代碼清晰、案例豐富實用
★一本書全麵掌握網絡爬蟲開發
本書介紹瞭如何開發網絡爬蟲。內容主要包括開發網絡爬蟲所需要的Java語法基礎和網絡爬蟲的工作原理,如何使用開源組件HttpClient和爬蟲框架Crawler4j抓取網頁信息,以及針對抓取到的文本進行有效信息的提取。為瞭擴展抓取能力,本書介紹瞭實現分布式網絡爬蟲的關鍵技術。
本書介紹瞭如何開發網絡爬蟲。內容主要包括開發網絡爬蟲所需要的Java語法基礎和網絡爬蟲的工作原理,如何使用開源組件HttpClient和爬蟲框架Crawler4j抓取網頁信息,以及針對抓另外,本書介紹瞭從圖像和語音等多媒體格式文件中提取文本信息,以及如何使用大數據技術存儲抓取到的信息。
最後,以實戰為例,介紹瞭如何抓取微信和微博,以及在電商、醫藥、金融等領域的案例應用。其中,電商領域的應用介紹瞭使用網絡爬蟲抓取商品信息入庫到網上商店的數據庫錶。醫藥領域的案例介紹瞭抓取PubMed醫藥論文庫。金融領域的案例介紹瞭抓取股票信息,以及從年報PDF文檔中提取錶格等。本書適用於對開發信息采集軟件感興趣的自學者。也可以供有Java或程序設計基礎的開發人員參考。
★羅剛,獵兔搜索創始人,帶領獵兔搜索技術開發團隊先後開發齣獵兔中文分詞係統、獵兔信息提取係統、獵兔智能垂直搜索係統以及網絡信息監測係統等,實現互聯網信息的采集、過濾、搜索和實時監測。曾編寫齣版《自己動手寫搜索引擎》、《自己動手寫網絡爬蟲》、《使用C#開發搜索引擎》,獲得廣泛好評。在北京和上海等地均有獵兔培訓的學員。
第1章 技術基礎 1
1.1 第一個程序 1
1.2 準備開發環境 2
1.2.1 JDK 2
1.2.2 Eclipse 3
1.3 類和對象 4
1.4 常量 5
1.5 命名規範 6
1.6 基本語法 6
1.7 條件判斷 7
1.8 循環 8
1.9 數組 9
1.10 位運算 11
1.11 枚舉類型 13
1.12 比較器 14
1.13 方法 14
1.14 集閤類 15
1.14.1 動態數組 15
1.14.2 散列錶 15
1.15 文件 19
1.15.1 文本文件 19
1.15.2 二進製文件 23
1.16 多綫程 27
1.16.1 基本的多綫程 28
1.16.2 綫程池 30
1.17 摺半查找 31
1.18 處理圖片 34
1.19 本章小結 35
第2章 網絡爬蟲入門 36
2.1 獲取信息 36
2.1.1 提取鏈接 37
2.1.2 采集新聞 37
2.2 各種網絡爬蟲 38
2.2.1 信息采集器 40
2.2.2 廣度優先遍曆 41
2.2.3 分布式爬蟲 42
2.3 爬蟲相關協議 43
2.3.1 網站地圖 44
2.3.2 Robots協議 45
2.4 爬蟲架構 48
2.4.1 基本架構 48
2.4.2 分布式爬蟲架構 51
2.4.3 垂直爬蟲架構 54
2.5 自己寫網絡爬蟲 55
2.6 URL地址查新 57
2.6.1 嵌入式數據庫 58
2.6.2 布隆過濾器 60
2.6.3 實現布隆過濾器 61
2.7 部署爬蟲 63
2.7.1 部署到Windows 64
2.7.2 部署到Linux 64
2.8 本章小結 65
第3章 定嚮采集 69
3.1 下載網頁的基本方法 69
3.1.1 網卡 70
3.1.2 下載網頁 70
3.2 HTTP基礎 75
3.2.1 協議 75
3.2.2 URI 77
3.2.3 DNS 84
3.3 使用HttpClient下載網頁 84
3.3.1 HttpCore 94
3.3.2 狀態碼 98
3.3.3 創建 99
3.3.4 模擬瀏覽器 99
3.3.5 重試 100
3.3.6 抓取壓縮的網頁 102
3.3.7 HttpContext 104
3.3.8 下載中文網站 105
3.3.9 抓取需要登錄的網頁 106
3.3.10 代理 111
3.3.11 DNS緩存 112
3.3.12 並行下載 113
3.4 下載網絡資源 115
3.4.1 重定嚮 115
3.4.2 解決套接字連接限製 118
3.4.3 下載圖片 119
3.4.4 抓取視頻 122
3.4.5 抓取FTP 122
3.4.6 網頁更新 122
3.4.7 抓取限製應對方法 126
3.4.8 URL地址提取 131
3.4.9 解析URL地址 134
3.4.10 歸一化 135
3.4.11 增量采集 135
3.4.12 iframe 136
3.4.13 抓取JavaScript動態頁麵 137
3.4.14 抓取即時信息 141
3.4.15 抓取暗網 141
3.5 PhantomJS 144
3.6 Selenium 145
3.7 信息過濾 146
3.7.1 匹配算法 147
3.7.2 分布式過濾 153
3.8 采集新聞 153
3.8.1 網頁過濾器 154
3.8.2 列錶頁 159
3.8.3 用機器學習的方法抓取新聞 160
3.8.4 自動查找目錄頁 161
3.8.5 詳細頁 162
3.8.6 增量采集 164
3.8.7 處理圖片 164
3.9 遍曆信息 164
3.10 並行抓取 165
3.10.1 多綫程爬蟲 165
3.10.2 垂直搜索的多綫程爬蟲 168
3.10.3 異步IO 172
3.11 分布式爬蟲 176
3.11.1 JGroups 176
3.11.2 監控 179
3.12 增量抓取 180
3.13 管理界麵 180
3.14 本章小結 181
第4章 數據存儲 182
4.1 存儲提取內容 182
4.1.1 SQLite 183
4.1.2 Access數據庫 185
4.1.3 MySQL 186
4.1.4 寫入維基 187
4.2 HBase 187
4.3 Web圖 189
4.4 本章小結 193
第5章 信息提取 194
5.1 從文本提取信息 194
5.2 從HTML文件中提取文本 195
5.2.1 字符集編碼 195
5.2.2 識彆網頁的編碼 198
5.2.3 網頁編碼轉換為字符串編碼 201
5.2.4 使用正則錶達式提取數據 202
5.2.5 結構化信息提取 206
5.2.6 錶格 209
5.2.7 網頁的DOM結構 210
5.2.8 使用Jsoup提取信息 211
5.2.9 使用XPath提取信息 217
5.2.10 HTMLUnit提取數據 219
5.2.11 網頁結構相似度計算 220
5.2.12 提取標題 222
5.2.13 提取日期 224
5.2.14 提取模闆 225
5.2.15 提取RDF信息 227
5.2.16 網頁解析器原理 227
5.3 RSS 229
5.3.1 Jsoup解析RSS 230
5.3.2 ROME 231
5.3.3 抓取流程 231
5.4 網頁去噪 233
5.4.1 NekoHTML 234
5.4.2 Jsoup 238
5.4.3 提取正文 240
5.5 從非HTML文件中提取文本 241
5.5.1 PDF文件 242
5.5.2 Word文件 245
5.5.3 Rtf文件 247
5.5.4 Excel文件 253
5.5.5 PowerPoint文件 254
5.6 提取標題 254
5.6.1 提取標題的一般方法 255
5.6.2 從PDF文件中提取標題 259
5.6.3 從Word文件中提取標題 261
5.6.4 從Rtf文件中提取標題 261
5.6.5 從Excel文件中提取標題 267
5.6.6 從PowerPoint文件中提取標題 270
5.7 圖像的OCR識彆 270
5.7.1 讀入圖像 271
5.7.2 準備訓練集 272
5.7.3 圖像二值化 274
5.7.4 切分圖像 279
5.7.5 SVM分類 283
5.7.6 識彆漢字 287
5.7.7 訓練OCR 289
5.7.8 檢測行 290
5.7.9 識彆驗證碼 291
5.7.10 JavaOCR 292
5.8 提取地域信息 292
5.8.1 IP地址 293
5.8.2 手機 315
5.9 提取新聞 316
5.10 流媒體內容提取 317
5.10.1 音頻流內容提取 317
5.10.2 視頻流內容提取 321
5.11 內容糾錯 322
5.11.1 模糊匹配問題 325
5.11.2 英文拼寫檢查 331
5.11.3 中文拼寫檢查 333
5.12 術語 336
5.13 本章小結 336
第6章 Crawler4j 338
6.1 使用Crawler4j 338
6.1.1 大眾點評 339
6.1.2 日誌 342
6.2 crawler4j原理 342
6.2.1 代碼分析 343
6.2.2 使用Berkeley DB 344
6.2.3 縮短URL地址 347
6.2.4 網頁編碼 349
6.2.5 並發 349
6.3 本章小結 352
第7章 網頁排重 353
7.1 語義指紋 354
7.2 SimHash 357
7.3 分布式文檔排重 367
7.4 本章小結 369
第8章 網頁分類 370
8.1 關鍵詞加權法 371
8.2 機器學習的分類方法 378
8.2.1 特徵提取 380
8.2.2 樸素貝葉斯 384
8.2.3 支持嚮量機 393
8.2.4 多級分類 401
8.2.5 網頁分類 403
8.3 本章小結 403
第9章 案例分析 404
9.1 金融爬蟲 404
9.1.1 中國能源政策數據 404
9.1.2 世界原油現貨交易和期貨交易數據 405
9.1.3 股票數據 405
9.1.4 從PDF文件中提取錶格 408
9.2 商品搜索 408
9.2.1 遍曆商品 410
9.2.2 使用HttpClient 415
9.2.3 提取價格 416
9.2.4 水印 419
9.2.5 數據導入ECShop 420
9.2.6 采集淘寶 423
9.3 自動化行業采集 424
9.4 社會化信息采集 424
9.5 微博爬蟲 424
9.6 微信爬蟲 426
9.7 海關數據 426
9.8 醫藥數據 427
9.9 本章小結 429
後記 430
2.3 爬蟲相關協議
相比於人,爬蟲有更快的檢索速度和更深的層次,所以爬蟲可能使一個站點癱瘓。
抓取網站時,為瞭不影響用戶正常訪問該網站。爬蟲需要有禮貌。例如,它不會不告而訪,它會在自己的“user agent”中聲稱:“我是某某搜索引擎的爬蟲。”
有些網站希望爬蟲避免在白天對其網頁進行抓取,從而不影響白天正常的對外公眾服務,DNS服務提供商也不希望大量的域名解析工作量被搜索爬蟲的域名請求所占用。為瞭避免抓取的網站響應請求的負擔過重,爬蟲需要遵循禮貌性原則,不要同時發起過多的下載網頁請求,這樣纔可能有更多的網站對爬蟲友好。為瞭減少網站對爬蟲的抱怨,建議每秒隻抓取幾次,把抓取任務盡量平均分配到每個時間段,並且避免高峰時段對訪問的網站負擔過重。
2.3.1 網站地圖
為瞭方便爬蟲遍曆和更新網站內容,網站可以設置Sitemap.xml。Sitemap.xml也就是網站地圖,不過這個網站地圖是用XML寫的。例如,http://www.10010.com/Sitemap.xml。
在網站地圖中列齣網站中的網址以及關於每個網址的其他元數據(上次更新的時間、更改的頻率以及相對於網站上其他網址的重要程度等),以便搜索引擎抓取網站。
完整格式如下所示。
XML標簽的含義說明如下。
l Loc:頁麵永久鏈接地址。
l Lastmod:頁麵最後修改時間。
l Changefreq:頁麵內容更新頻率。
l Priority:相對於其他頁麵的優先權。
2.3.2 Robots協議
作為一個爬蟲程序,在網上應該遵守爬蟲的“道德”。何謂爬蟲的“道德”?因為爬蟲會訪問網站,並下載其中的資源。尤其是多綫程爬蟲,可能會在訪問一個網站的時候開啓多個綫程,然後使用很多Session進行連接,爬取網頁,很容易造成網站癱瘓、不能訪問等後果。還有一種情況是網站有很多東西屬於自己的“秘密”,本身就不想讓爬蟲抓取,如果爬蟲隨意抓取,就相當於侵犯網站的“隱私”。
為瞭避免這種情況的發生,互聯網行業采用瞭兩種辦法,第一種是在網站的根目錄下放置一個文件,起名為robots.txt,其中規定瞭哪些內容不想被抓取;另一種是設置Robots Meta標簽。
robots.txt文件必須放置在站點的根目錄下,而且文件名必須小寫。該文件包含一條或更多的記錄,這些記錄用空行分開(以CR、CR/NL或者NL作為結束符),在該文件中可以用#進行注解,具體使用方法和UNIX中的慣例一樣。該文件中的記錄通常以一行或多行User-agent開始,後麵加上若乾Disallow行,詳細情況如下。
l User-agent:該項的值用於描述搜索引擎robots的名字。在robots.txt文件中,如果有多條User-agent記錄,說明有多個robots會受到該協議的限製,對該文件來說,至少要有一條User-agent記錄。如果User-agent的值設為*,則該協議對任何機器人均有效,在robots.txt文件中,“User-agent:*”這樣的記錄隻能有一條。
l Disallow:該項的值用於描述不希望被訪問到的URL,這個URL可以是一條完整的路徑,也可以是部分路徑,任何以Disallow開頭的URL均不會被robots訪問到。
任何一條Disallow記錄為空,說明該網站的所有部分都允許被訪問,在robots.txt文件中,至少要有一條Disallow記錄。如果robots.txt是一個空文件,則該網站對於所有的搜索引擎Robots,都是開放的。一個robots.txt的例子如下所示。
以上例子錶明這個網站的Robots協議對每個爬蟲都適用,並且不允許爬取/cgi-bin/、/tmp/和/private/下的文件。
當一個爬蟲訪問一個站點時,它會首先檢查該站點根目錄下是否存在robots.txt,如果存在,爬蟲就會按照該文件中的內容來確定訪問的範圍;如果該文件不存在,所有的爬蟲將能夠訪問網站上所有沒有被口令保護的頁麵。
在HttpClient包中,當執行get或者post方法時,會默認提供對robots.txt的支持,不抓取Disallow規定的目錄下的網頁。當然,HttpClient也設置瞭默認選項,可以讓編寫的爬蟲不受 robots.txt協議的限製,但是,作為一個網絡爬蟲作者,我們還是提倡有“道德”的抓取,以保障互聯網行業健康發展。
現在我們討論第二種方法,即通過設置Robots Meta的值來限製爬蟲的訪問。這種方法是一種細粒度的方法,能夠把限製細化到每個網頁。和其他的Meta標簽(如使用的語言、頁麵的描述、關鍵詞等)一樣,Robots Meta標簽也放在頁麵的<head></head>中,專門用來告訴搜索引擎Robots如何抓取該頁的內容。
Robots Meta標簽中沒有大小寫之分,name=“Robots”錶示所有的搜索引擎,可以針對某個具體搜索引擎寫為name=“BaiduSpider”。Content部分有4個指令選項:INDEX、NOINDEX、FOLLOW和NOFOLLOW,指令間以“,”分隔。
前 言
現代社會,有效信息對人來說就像氧氣一樣不可或缺。互聯網讓有效信息的收集工作變得更容易。當你在網上衝浪時,網絡爬蟲也在網絡中穿梭,自動收集互聯網上有用的信息。
自動收集和篩選信息的網絡爬蟲讓有效信息的流動性增強,讓我們更加高效地獲取信息。隨著越來越多的信息顯現於網絡,網絡爬蟲也越來越有用。
各行業都離不開對信息的采集和加工處理。例如,農業需要抓取氣象數據、農産品行情數據等實現精準農業。機械行業需要抓取零件、圖紙信息作為設計參考。醫藥行業需要抓取一些疾病的治療方法信息。金融行業需要抓取上市公司基本麵和技術麵等相關信息作為股市漲跌的參考,例如,太鋼生産齣圓珠筆頭,導緻它的股票“太鋼不銹”上漲。此外,金融行業也需要抓取股民對市場的參與度,作為市場大勢判斷的依據。
每個人都可以用網絡爬蟲技術獲得更好的生存策略,避免一些糟糕的情況齣現,讓自己生活得更加幸福和快樂。例如,網絡爬蟲可以收集到二甲雙胍等可能抗衰老的藥物,從而讓人生活得更加健康。
本書的很多內容來源於搜索引擎、自然語言處理、金融等領域的項目開發和教學實踐。感謝開源軟件的開發者們,他們無私的工作豐富瞭本書的內容。
本書從開發網絡爬蟲所需要的Java語法開始講解,然後介紹基本的爬蟲原理。通過介紹優先級隊列、寬度優先搜索等內容,引領讀者入門,之後根據當前風起雲湧的雲計算熱潮,重點講述瞭雲計算的相關內容及其在爬蟲中的應用,以及信息抽取、鏈接分析等內容。接下來介紹瞭有關爬蟲的Web數據挖掘等內容。為瞭讓讀者更深入地瞭解爬蟲的實際應用,最後一章是案例分析。本書相關的代碼在讀者QQ群(294737705)的共享文件中可以找到。
本書適閤需要具體實現網絡爬蟲的程序員使用,對於信息檢索等相關領域的研究人員也有一定的參考價值,同時獵兔搜索技術團隊已經開發齣以本書為基礎的專門培訓課程和商業軟件。目前的一些網絡爬蟲軟件仍有很多功能有待完善,作者真誠地希望通過本書把讀者帶入網絡爬蟲開發的大門並認識更多的朋友。
感謝早期閤著者、閤作夥伴、員工、學員、傢人的支持,他們給我們提供瞭良好的工作基礎,這是一個持久可用的工作基礎。在將來,希望我們的網絡爬蟲代碼和技術能夠像植物一樣快速生長。
參與本書編寫的還有崔智傑、石天盈、張繼紅、張進威、劉宇、何淑琴、任通通、高丹丹、徐友峰、孫寬,在此一並錶示感謝。
羅 剛
2017年2月
對於一個非技術背景,但又對信息分析極感興趣的讀者來說,這本書絕對是一次令人驚喜的閱讀體驗。作者用一種非常友好的方式,將那些聽起來高深莫測的技術概念,轉化為瞭我能夠理解和運用的工具。我之前總覺得網絡爬蟲是程序員的專屬領域,自己望塵莫及,但這本書讓我發現,通過學習它,我也能掌握一門強大的信息獲取技能。書中關於數據清洗和預處理的章節,對我來說尤為實用。爬取到的原始數據往往是混亂不堪的,如何有效地將這些數據轉化為有價值的信息,是很多數據分析項目中的關鍵。作者在這方麵提供瞭很多實用的技巧和思路,比如如何去除重復數據,如何處理缺失值,如何將不同格式的數據統一起來等等。這些內容讓我看到瞭爬蟲技術在商業分析、市場調研等領域的巨大潛力。另外,作者在書中也強調瞭閤法閤規的重要性,提醒我們在獲取和使用數據時,要遵守相關的法律法規和道德規範,這讓我感到非常安心。總的來說,這本書不僅教會瞭我技術,更教會瞭我如何負責任地使用技術。
評分這本書給我帶來瞭全新的視角,讓我對數據世界的構建和信息的獲取有瞭更深入的理解。我一直對網絡上浩如煙海的信息感到好奇,但又不知道如何有效地組織和提取。這本書就像一把鑰匙,為我打開瞭一扇通往數據寶藏的大門。它並沒有簡單地羅列代碼,而是循序漸進地講解瞭網絡爬蟲的基本原理,從HTTP請求的底層機製,到HTML、XML等數據格式的解析,再到各種反爬蟲策略的應對。我尤其欣賞作者在講解過程中穿插的實際案例,這些案例並非照搬照抄,而是經過提煉和優化,能夠清晰地展現技術在解決實際問題中的應用。例如,書中對某個電商平颱數據抓取的分析,不僅介紹瞭如何繞過簡單的驗證碼,還深入探討瞭如何處理動態加載的數據,這讓我驚嘆於技術的巧妙和開發者思維的嚴謹。我原本以為網絡爬蟲隻是枯燥的技術堆砌,但這本書讓我看到瞭其中蘊含的邏輯之美和創新之處。它不僅僅是關於“如何做”,更是關於“為何要這樣做”,以及“如何做得更好”。這種由淺入深、由點及麵的講解方式,讓我在學習過程中充滿瞭探索的樂趣,也激發瞭我進一步深入研究的動力。
評分讀完這本書,我纔真正認識到網絡爬蟲的深度和廣度。我一直認為爬蟲就是簡單地復製粘貼代碼,然後執行。但這本書徹底顛覆瞭我的認知。作者不僅僅講解瞭基礎的爬取技術,更深入地剖析瞭爬蟲背後的原理,比如TCP/IP協議棧是如何工作的,DNS解析的過程是怎樣的,以及HTTP協議的各種狀態碼和報文結構。這些底層知識的講解,讓我能夠更透徹地理解爬蟲行為的本質,從而更好地進行調試和優化。書中對各種數據提取方式的對比分析也相當精彩,無論是正則錶達式、CSS選擇器,還是XPath,作者都給齣瞭詳細的用法和適用場景,讓我能夠根據數據的不同結構選擇最有效的方式。而且,我之前一直睏擾於如何處理Ajax動態加載的數據,這本書給瞭我非常清晰的解決方案,通過分析網絡請求,模擬JavaScript的執行,我終於能夠成功抓取到我想要的數據瞭。更讓我印象深刻的是,作者還分享瞭構建分布式爬蟲係統的思路,這讓我看到瞭將爬蟲技術規模化的可能性,也為我未來的學習和實踐指明瞭方嚮。這本書的知識密度非常高,但講解的邏輯性極強,絲毫不會讓人覺得雜亂無章。
評分這本書的文字風格非常接地氣,絲毫沒有學術論文的那種枯燥感,反而像是一位經驗豐富的技術前輩在娓娓道來,分享著他一路走來的心得體會。我本身不是科班齣身,之前接觸網絡爬蟲隻是零散地看過一些網上的教程,很多地方都模棱兩可,理解起來費勁。但這本書就不一樣瞭,它從最基礎的概念講起,比如什麼是爬蟲,它的工作流程是怎樣的,為什麼要使用爬蟲,這些看似簡單的問題,作者卻能用生動形象的比喻來解釋,讓我一下子就豁然開朗。特彆是關於爬蟲倫理的部分,作者並沒有迴避,而是深入探討瞭閤理抓取、尊重 robots.txt 協議的重要性,以及數據使用的邊界,這讓我感到非常受教。在技術細節方麵,書中對不同爬蟲框架的優缺點分析也非常到位,讓我能夠根據自己的需求做齣更明智的選擇。我尤其喜歡作者對於一些常見問題的排查思路的講解,比如“為什麼我的爬蟲抓不到數據?”“為什麼我被網站封禁瞭?”等等,這些都是我在實踐中經常遇到的睏境,而書中的解答條理清晰,直擊要害,大大節省瞭我摸索的時間。總而言之,這是一本非常適閤初學者入門,也能夠讓有一定基礎的開發者受益匪淺的書籍。
評分坦白說,我一開始對這本書並沒有抱太高的期望,想著可能就是市麵上那些泛泛而談的爬蟲教程。但當我翻開第一頁,就被作者嚴謹而又生動的筆觸吸引住瞭。這本書的結構設計非常閤理,從基礎概念到高級技巧,再到實際應用,層層遞進,讓人感覺每一步都走得很紮實。我特彆贊賞作者對於“反爬蟲”這一塊的深入分析。以前我總覺得反爬蟲是高不可攀的技術壁壘,但通過本書的學習,我纔明白,很多反爬蟲機製背後都有其邏輯和原理,隻要掌握瞭正確的方法,是可以被剋服的。書中對IP代理、User-Agent輪換、驗證碼識彆等技術的講解,我都覺得非常透徹,而且還提供瞭多種實現方案供我參考。更重要的是,作者在講解技術的同時,並沒有忽略對“道”的探討。他反復強調瞭爬蟲的邊界和責任,比如如何避免對目標網站造成過大的壓力,如何保護用戶隱私等等。這讓我覺得這本書不僅是一本技術書籍,更是一本關於如何“優雅”地進行網絡信息獲取的指南。這種將“術”與“道”相結閤的講解方式,是我在這類書籍中第一次遇到,也是我最欣賞的地方。
評分東西很好啊,下次還要來買
評分還不錯,但是總體比較粗糙,先看看
評分此用戶未及時填寫評價內容,係統默認好評!
評分東西很好,很方便,物流快。
評分全是乾貨,看得懂,能上手,邏輯清晰,不講廢話,贊?
評分很好很實用,就是想要的。
評分不錯推薦大傢購買哈
評分書的質量很好,運送速度也很快,支持
評分對於沒有學習過編程語言的人可以買
本站所有內容均為互聯網搜尋引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度,google,bing,sogou 等
© 2025 book.cndgn.com All Rights Reserved. 新城书站 版權所有