互聯(lián)網(wǎng)是絕對大量的數(shù)據(jù)源。不幸的是,如果沒有方便組織的CSV文件可供下載和分析,則絕大部分。如果要從許多網(wǎng)站捕獲數(shù)據(jù),則需要嘗試進(jìn)行網(wǎng)絡(luò)抓取。
如果您還是一個初學(xué)者,請不要擔(dān)心-在數(shù)據(jù)分析如何使用python中Beautiful Soup進(jìn)行WEB抓取中,我們將從頭開始介紹如何使用Python從頭開始進(jìn)行Web抓取,首先回答一些有關(guān)Web抓取的常見問題。
如果您已經(jīng)熟悉了該概念,請隨意滾動瀏覽這些內(nèi)容,然后直接進(jìn)入數(shù)據(jù)分析如何使用python中Beautiful Soup進(jìn)行WEB抓取!
什么是Python中的網(wǎng)頁搜刮?
一些網(wǎng)站提供的數(shù)據(jù)集可以CSV格式下載,也可以通過應(yīng)用程序編程接口(API)訪問。但是許多具有有用數(shù)據(jù)的網(wǎng)站卻沒有提供這些方便的選擇。
例如,考慮國家氣象局的網(wǎng)站。它包含每個位置的最新天氣預(yù)報,但是無法通過CSV或API訪問該天氣數(shù)據(jù)。
如果我們想分析這些數(shù)據(jù),或者下載它以便在其他應(yīng)用程序中使用,我們將不會刻意復(fù)制粘貼所有內(nèi)容。Web抓取是一項使我們能夠使用編程來完成繁重工作的技術(shù)。我們將編寫一些代碼,這些代碼將在NWS站點上查找,僅獲取我們要使用的數(shù)據(jù),然后以所需的格式輸出。
在數(shù)據(jù)分析如何使用python中Beautiful Soup進(jìn)行WEB抓取中,我們將向您展示如何使用Python 3和Beautiful Soup庫執(zhí)行網(wǎng)絡(luò)抓取。我們將從國家氣象局抓取天氣預(yù)報,然后使用pandas庫進(jìn)行分析。
Web爬網(wǎng)如何工作?
抓取網(wǎng)絡(luò)時,我們編寫代碼將請求發(fā)送到托管我們指定頁面的服務(wù)器。通常,我們的代碼會像瀏覽器一樣下載該頁面的源代碼。但是,它不是在視覺上顯示頁面,而是在頁面中進(jìn)行過濾以查找我們指定的HTML元素,并提取我們指示其提取的任何內(nèi)容。
例如,如果我們想從網(wǎng)站獲取H2標(biāo)簽內(nèi)的所有標(biāo)題,則可以編寫一些代碼來實現(xiàn)。我們的代碼將從其服務(wù)器請求網(wǎng)站的內(nèi)容并下載。然后,它將通過頁面的HTML查找H2標(biāo)簽。只要找到H2標(biāo)簽,它就會復(fù)制標(biāo)簽內(nèi)的所有文本,并以我們指定的任何格式輸出。
需要注意的一件事:從服務(wù)器的角度來看,通過Web抓取請求頁面與在Web瀏覽器中加載頁面相同。當(dāng)我們使用代碼提交這些請求時,我們可能比普通用戶更快地“加載”頁面,從而很快耗盡了網(wǎng)站所有者的服務(wù)器資源。
為什么要使用Python進(jìn)行網(wǎng)頁爬取?
可以使用許多其他編程語言進(jìn)行Web抓取。例如,我們也有使用R進(jìn)行網(wǎng)絡(luò)抓取的教程。
但是,使用Python和Beautiful Soup庫是最流行的Web抓取方法之一。這就意味著,一旦您掌握了Beautiful Soup的基礎(chǔ)知識,那里就會有很多教程,操作視頻和一些示例代碼,可幫助您加深知識。
我們將在數(shù)據(jù)分析如何使用python中Beautiful Soup進(jìn)行WEB抓取結(jié)尾介紹其他一些Web抓取常見問題解答,但現(xiàn)在是時候開始研究我們的Web抓取項目!每個網(wǎng)絡(luò)抓取項目都應(yīng)從回答以下問題開始:
網(wǎng)站搜刮合法嗎?
不幸的是,這里沒有一個簡單的答案。一些網(wǎng)站明確允許網(wǎng)頁抓取。其他人明確禁止這樣做。許多網(wǎng)站沒有以一種方式或另一種方式提供任何明確的指導(dǎo)。
在抓取任何網(wǎng)站之前,我們應(yīng)該查看一個條款和條件頁面,以查看是否有關(guān)于抓取的明確規(guī)則。如果有,我們應(yīng)該跟隨他們。如果沒有,那么它就更像是一個判斷。
但是請記住,Web抓取會消耗主機(jī)網(wǎng)站的服務(wù)器資源。如果我們只刮一頁,那不會造成問題。但是,如果我們的代碼每十分鐘刮一次1,000頁,那么對于網(wǎng)站所有者而言,這可能很快就會變得昂貴。
因此,除了遵循網(wǎng)站上發(fā)布的所有和所有有關(guān)網(wǎng)絡(luò)抓取的明確規(guī)則之外,遵循以下最佳做法也是一個好主意:
1)永遠(yuǎn)不要比您需要的刮擦次數(shù)更多
2)考慮緩存您抓取的內(nèi)容,以便在處理用于過濾和分析它的代碼時僅下載一次,而不是每次運行代碼時都重新下載
3)考慮使用功能time.sleep()來在代碼中構(gòu)建暫停,例如在太短的時間內(nèi)避免過多的請求使不堪重負(fù)的服務(wù)器癱瘓。
在數(shù)據(jù)分析如何使用python中Beautiful Soup進(jìn)行WEB抓取的案例中,NWS的數(shù)據(jù)是公共領(lǐng)域的,其術(shù)語不禁止Web抓取,因此我們可以繼續(xù)進(jìn)行。
網(wǎng)頁的組成部分
當(dāng)我們訪問網(wǎng)頁時,我們的網(wǎng)絡(luò)瀏覽器會向網(wǎng)絡(luò)服務(wù)器發(fā)出請求。此請求稱為GET請求,因為我們正在從服務(wù)器獲取文件。然后,服務(wù)器發(fā)回文件,這些文件告訴我們的瀏覽器如何為我們呈現(xiàn)頁面。文件分為幾種主要類型:
1)HTML —包含頁面的主要內(nèi)容。
2)CSS —添加樣式以使頁面看起來更好。
3)JS — Javascript文件為網(wǎng)頁增加了交互性。
4)圖片-JPG和PNG等圖片格式允許網(wǎng)頁顯示圖片。
瀏覽器收到所有文件后,它將呈現(xiàn)頁面并將其顯示給我們。要使頁面漂亮地呈現(xiàn),在幕后發(fā)生了很多事情,但是當(dāng)我們進(jìn)行網(wǎng)頁抓取時,我們不需要擔(dān)心其中的大多數(shù)問題。進(jìn)行網(wǎng)頁抓取時,我們會對網(wǎng)頁的主要內(nèi)容感興趣,因此我們看一下HTML。
HTML
超文本標(biāo)記語言(HyperText Markup Language,HTML)是用于創(chuàng)建網(wǎng)頁的一種語言。HTML不是像Python這樣的編程語言,而是一種標(biāo)記語言,它告訴瀏覽器如何布局內(nèi)容。HTML使您可以執(zhí)行與Microsoft Word等字處理器中類似的操作-使文本加粗,創(chuàng)建段落等。因為HTML不是一種編程語言,所以它幾乎不像Python那樣復(fù)雜。
讓我們快速瀏覽一下HTML,以便我們了解足夠有效地進(jìn)行抓取。HTML由稱為標(biāo)簽的元素組成。最基本的標(biāo)簽是標(biāo)簽。此標(biāo)記告訴Web瀏覽器,其中的所有內(nèi)容都是HTML。我們可以使用以下標(biāo)記來制作一個簡單的HTML文檔:
我們尚未在頁面上添加任何內(nèi)容,因此,如果我們在Web瀏覽器中查看HTML文檔,則不會看到任何內(nèi)容:
在html標(biāo)簽內(nèi),我們放置了另外兩個標(biāo)簽,head標(biāo)簽和body標(biāo)簽。網(wǎng)頁的主要內(nèi)容進(jìn)入body標(biāo)記。該head標(biāo)簽包含有關(guān)網(wǎng)頁標(biāo)題,以及其它信息一般不會在網(wǎng)頁抓取有用的數(shù)據(jù):
我們?nèi)匀粵]有在頁面中添加任何內(nèi)容(位于body標(biāo)記內(nèi)),因此我們再也看不到任何內(nèi)容:
您可能在上面已經(jīng)注意到,我們將head和body標(biāo)記放在了html標(biāo)記內(nèi)。在HTML中,標(biāo)簽是嵌套的,可以放在其他標(biāo)簽內(nèi)。
現(xiàn)在,我們將以p標(biāo)簽的形式將我們的第一個內(nèi)容添加到頁面。所述p標(biāo)記定義一個段,并在標(biāo)簽內(nèi)的任何文本顯示為一個單獨的段落:
外觀如下:
標(biāo)簽的常用名稱取決于它們相對于其他標(biāo)簽的位置:
1)child—孩子是另一個標(biāo)簽內(nèi)的標(biāo)簽。因此,p上面的兩個標(biāo)簽都是該body標(biāo)簽的子級。
2)parent—父標(biāo)簽是另一個標(biāo)簽在其中的標(biāo)簽。在上方,html標(biāo)簽是標(biāo)簽的父級body。
3)sibiling—同胞是與另一個標(biāo)簽嵌套在同一父對象中的標(biāo)簽。例如,head和body是兄弟姐妹,因為它們都在內(nèi)部html。這兩個p標(biāo)簽都是同級標(biāo)簽,因為它們都在內(nèi)部body。
我們還可以向HTML標(biāo)記添加屬性以更改其行為:
外觀如下:
在上面的示例中,我們添加了兩個a標(biāo)簽。a標(biāo)簽是鏈接,并告訴瀏覽器呈現(xiàn)到另一個網(wǎng)頁的鏈接。href標(biāo)簽的屬性確定鏈接的位置。
a并且p是極為常見的html標(biāo)簽。以下是一些其他內(nèi)容:
1)div —表示頁面的劃分或區(qū)域。
2)b -加粗其中的任何文本。
3)i —斜體顯示里面的任何文本。
4)table —創(chuàng)建一個表格。
5)form -創(chuàng)建輸入表單。
有關(guān)標(biāo)簽的完整列表,請參見此處。
在進(jìn)行實際的Web抓取之前,讓我們了解class和id屬性。這些特殊屬性賦予HTML元素名稱,并使它們在我們抓取時更易于與之交互。一個元素可以具有多個類,并且一個類可以在元素之間共享。每個元素只能有一個ID,并且一個ID在頁面上只能使用一次。類和ID是可選的,并非所有元素都具有它們。
我們可以在示例中添加類和ID:
外觀如下:
請求庫
我們要抓取網(wǎng)頁的第一件事就是下載網(wǎng)頁。我們可以使用Python 請求庫下載頁面。請求庫將向GET網(wǎng)絡(luò)服務(wù)器發(fā)出請求,該服務(wù)器將為我們下載給定網(wǎng)頁的HTML內(nèi)容。我們可以使用幾種不同類型的請求requests,其中GET只有一種。如果您想了解更多信息,請查看我們的API教程。
讓我們嘗試下載一個簡單的示例網(wǎng)站http://5wd995.cn/data/2642.html。我們需要先使用request.get方法下載它。
運行請求后,我們得到一個Response對象。該對象具有一個status_code屬性,該屬性指示頁面是否已成功下載:
A status_codeof 200表示頁面下載成功。這里我們不會完全探討狀態(tài)代碼,但是以“ a”開頭的狀態(tài)代碼2通常表示成功,而以“ a” 4或“ a” 開頭的代碼5表示錯誤。
我們可以使用content屬性輸出頁面的HTML內(nèi)容:
使用BeautifulSoup解析頁面
如您在上面看到的,我們現(xiàn)在已經(jīng)下載了一個HTML文檔。
我們可以使用BeautifulSoup庫來解析此文檔,并從p標(biāo)記中提取文本。我們首先必須導(dǎo)入庫,并創(chuàng)建BeautifulSoup該類的實例來解析我們的文檔:
現(xiàn)在,我們可以使用對象prettify上的方法,打印出格式良好的頁面HTML內(nèi)容BeautifulSoup:
由于所有標(biāo)簽都是嵌套的,因此我們可以一次在整個結(jié)構(gòu)中移動一層。我們可以首先使用children屬性來選擇頁面頂層的所有元素soup。請注意,它children返回一個列表生成器,因此我們需要list在其上調(diào)用該函數(shù):
上面告訴我們,在頁面的頂層有兩個標(biāo)簽-初始標(biāo)簽和標(biāo)簽。n列表中也有換行符()。讓我們看看列表中每個元素的類型是:
如您所見,所有項目都是BeautifulSoup對象。第一個是Doctype對象,其中包含有關(guān)文檔類型的信息。第二個是NavigableString,表示在HTML文檔中找到的文本。最后一項是一個Tag對象,其中包含其他嵌套標(biāo)簽。對象,也是我們最常處理的最重要的對象類型Tag。
該Tag對象使我們可以瀏覽HTML文檔,并提取其他標(biāo)簽和文本。您可以在此處了解有關(guān)各種BeautifulSoup對象的更多信息。
現(xiàn)在,我們可以通過選擇html列表中的第三項來選擇標(biāo)簽及其子元素:
該children屬性返回的列表中的每個項目也是一個BeautifulSoup對象,因此我們也可以在children上調(diào)用方法html。
現(xiàn)在,我們可以在html標(biāo)記內(nèi)找到子代:
如您在上方看到的,這里有兩個標(biāo)簽head,和body。我們想要提取p標(biāo)簽內(nèi)的文本,因此我們將深入研究正文:
現(xiàn)在,我們可以p通過找到body標(biāo)簽的子標(biāo)簽來獲得標(biāo)簽:
現(xiàn)在我們可以隔離p標(biāo)簽:
隔離標(biāo)簽后,我們可以使用get_text方法提取標(biāo)簽內(nèi)的所有文本:
一次查找標(biāo)簽的所有實例
上面我們做的事情對于弄清楚如何導(dǎo)航頁面很有用,但是花了很多命令才能完成相當(dāng)簡單的事情。如果要提取單個標(biāo)簽,則可以改用find_all方法,該方法將在頁面上找到標(biāo)簽的所有實例。
請注意,這會find_all返回一個列表,因此我們必須遍歷或使用列表索引來提取文本:
如果只想查找標(biāo)簽的第一個實例,則可以使用find方法,該方法將返回一個BeautifulSoup對象:
按類別和ID搜索標(biāo)簽
我們之前介紹了類和id,但是可能不清楚它們?yōu)槭裁从杏?。CSS使用類和ID來確定將某些樣式應(yīng)用于哪些HTML元素。在抓取時,我們也可以使用它們來指定要抓取的特定元素。為了說明這一原理,我們將使用以下頁面:
我們可以通過URL訪問上述文檔http://5wd995.cn/data/2642.html。首先下載頁面并創(chuàng)建一個BeautifulSoup對象:
現(xiàn)在,我們可以使用該find_all方法按類或ID搜索項目。在以下示例中,我們將搜索p具有class的所有標(biāo)簽outer-text:
在下面的示例中,我們將查找具有class的所有標(biāo)簽outer-text:
我們還可以通過id搜索元素:
使用CSS選擇器
您也可以使用CSS選擇器搜索項目。這些選擇器是CSS語言允許開發(fā)人員指定樣式的HTML標(biāo)簽的方式。這里有些例子:
1)p a—查找a標(biāo)簽內(nèi)的所有標(biāo)簽p。
2)body p a-找到所有a一個內(nèi)部標(biāo)簽p上標(biāo)簽內(nèi)body的標(biāo)簽。
3)html body—查找body標(biāo)簽內(nèi)的所有標(biāo)簽html。
4)p.outer-text—查找所有p帶有類別的標(biāo)簽outer-text。
5)p#first—查找pID為的所有標(biāo)簽first。
6)body p.outer-text—查找p標(biāo)簽outer-text內(nèi)部具有類的所有body標(biāo)簽。
您可以在此處了解有關(guān)CSS選擇器的更多信息。
BeautifulSoup對象支持使用select方法通過CSS選擇器搜索頁面。我們可以使用CSS選擇器p在頁面中找到所有位于這樣的標(biāo)簽div:
請注意,上述select方法會返回BeautifulSoup對象列表,就像find和一樣find_all。
下載天氣數(shù)據(jù)
現(xiàn)在,我們已經(jīng)足夠了解,可以從國家氣象局的網(wǎng)站上提取有關(guān)當(dāng)?shù)靥鞖獾男畔?。第一步是找到我們要抓取的頁面。我們將從此頁面提取有關(guān)天氣信息。
我們將提取有關(guān)擴(kuò)展預(yù)測的數(shù)據(jù)。
從圖像中可以看到,該頁面包含有關(guān)下周擴(kuò)展預(yù)報的信息,包括一天中的時間,溫度和條件的簡要說明。
使用Chrome DevTools探索頁面結(jié)構(gòu)
我們需要做的第一件事是使用Chrome Devtools檢查頁面。如果您使用的是其他瀏覽器,則Firefox和Safari具有等效功能。建議還是使用Chrome。
您可以通過單擊啟動Chrome中的開發(fā)人員工具View -> Developer -> Developer Tools。您應(yīng)該最終在瀏覽器底部看到一個面板,如下所示。確保Elements面板突出顯示:
Chrome開發(fā)者工具。
元素面板將在頁面上顯示所有HTML標(biāo)記,并讓您瀏覽它們。這是一個非常方便的功能!
右鍵單擊“擴(kuò)展的預(yù)測”附近的頁面,然后單擊“檢查”,我們將在元素面板中打開包含文本“擴(kuò)展的預(yù)測”的標(biāo)簽:
擴(kuò)展的預(yù)測文本。
然后,我們可以在“元素”面板中向上滾動以找到“最外面的”元素,其中包含與擴(kuò)展的預(yù)測相對應(yīng)的所有文本。在這種情況下,它是一個divID 為的標(biāo)簽seven-day-forecast:
包含擴(kuò)展預(yù)測項目的div。
如果您在控制臺上單擊鼠標(biāo)并瀏覽div,您將發(fā)現(xiàn)div該類中包含了每個預(yù)測項(例如“ Tonight”,“ Thursday”和“ Thursday Night”)tombstone-container。
現(xiàn)在我們知道足夠的信息來下載頁面并開始對其進(jìn)行解析。在下面的代碼中,我們:
1)下載包含預(yù)測的網(wǎng)頁。
2)創(chuàng)建一個BeautifulSoup類來分析頁面。
3)找到divID為的seven-day-forecast,并分配給seven_day
4)在中seven_day,找到每個單獨的預(yù)測項目。
5)提取并打印第一個預(yù)測項目。
從頁面中提取信息
如您所見,預(yù)測項內(nèi)tonight是我們想要的所有信息。還有4,我們可以提取信息:
1)預(yù)測項目的名稱-在這種情況下為Tonight。
2)條件的說明-存儲在的title屬性中img。
3)條件的簡短說明-在這種情況下為Mostly Clear。
4)溫度低-在這種情況下,49度。
我們將首先提取預(yù)測項的名稱,簡短描述和溫度,因為它們都相似:
現(xiàn)在,我們可以title從img標(biāo)記中提取屬性。為此,我們只將BeautifulSoup對象視為字典,然后將想要的屬性作為鍵傳遞:
從頁面中提取所有信息
現(xiàn)在,我們知道如何提取每條信息,可以將我們的知識與CSS選擇器和列表推導(dǎo)相結(jié)合,以一次提取所有信息。
在下面的代碼中,我們:
1)選擇與類的所有項目period-name與類物品內(nèi)部tombstone-container在seven_day。
2)使用列表推導(dǎo)get_text對每個BeautifulSoup對象調(diào)用該方法。
如您在上面看到的,我們的技術(shù)按順序為我們獲取了每個期間名稱。我們可以應(yīng)用相同的技術(shù)來獲取其他3字段:
將我們的數(shù)據(jù)合并到Pandas Dataframe中
現(xiàn)在,我們可以將數(shù)據(jù)合并到Pandas DataFrame中并進(jìn)行分析。DataFrame是可以存儲表格數(shù)據(jù)的對象,從而使數(shù)據(jù)分析變得容易。如果您想了解有關(guān)pandas的更多信息,請在此處免費試用我們的課程。
為了做到這一點,我們將調(diào)用DataFrame類,并傳入我們擁有的每個項目列表。我們將它們作為字典的一部分傳遞。每個字典鍵將成為DataFrame中的一列,每個列表將成為該列中的值:
現(xiàn)在,我們可以對數(shù)據(jù)進(jìn)行一些分析。例如,我們可以使用正則表達(dá)式和Series.str.extract方法提取數(shù)字溫度值:
然后,我們可以找到所有高溫和低溫的平均值:
我們也只能選擇夜間發(fā)生的行:
此Web爬網(wǎng)項目的后續(xù)步驟
您現(xiàn)在應(yīng)該對如何抓取網(wǎng)頁和提取數(shù)據(jù)有了很好的了解。下一步不錯的選擇是選擇一個網(wǎng)站,然后嘗試自己進(jìn)行一些網(wǎng)絡(luò)抓取。一些要抓取的數(shù)據(jù)的好例子是:
1)新聞文章
2)體育比分
3)天氣預(yù)報
4)股票價格
5)網(wǎng)上零售商價格
您可能還想繼續(xù)抓取國家氣象局,并查看可以從頁面或您自己的城市中提取的其他數(shù)據(jù)。
還有問題嗎?讓我們看一下其他一些Web抓取常見問題解答:
為什么要進(jìn)行網(wǎng)絡(luò)爬網(wǎng)?何時需要?
如果沒有組織格式的數(shù)據(jù)可用,則需要進(jìn)行網(wǎng)絡(luò)抓取以解鎖更強大的分析。
這對于各種個人項目可能很有用。例如,您可能想要抓取體育網(wǎng)站來分析與您最喜歡的球隊相關(guān)的統(tǒng)計信息。
但是,在業(yè)務(wù)環(huán)境中,Web抓取對于數(shù)據(jù)分析師和數(shù)據(jù)科學(xué)家也很重要。除非您將其抓取(或不費力氣地手工將其復(fù)制到電子表格中進(jìn)行分析),否則網(wǎng)絡(luò)上的大量數(shù)據(jù)根本無法獲得。當(dāng)這些數(shù)據(jù)可能包含對您的公司或您的行業(yè)有價值的見解時,您將不得不轉(zhuǎn)向網(wǎng)絡(luò)抓取。
我可以用網(wǎng)頁爬蟲做什么?
使用網(wǎng)絡(luò)抓取時,最大的限制可能是您可以做什么,而不是可以做什么。有了正確的代碼,幾乎所有公共網(wǎng)站上的數(shù)據(jù)都可以通過網(wǎng)絡(luò)抓取進(jìn)行下載,過濾和格式化。
但是,是否允許甚至合法是另一回事。
正如我們在數(shù)據(jù)分析如何使用python中Beautiful Soup進(jìn)行WEB抓取開頭所提到的,在嘗試抓取網(wǎng)站之前,確定網(wǎng)站的網(wǎng)站抓取政策非常重要。如果允許抓取,則應(yīng)確保遵循數(shù)據(jù)分析如何使用python中Beautiful Soup進(jìn)行WEB抓取前面概述的最佳做法,以確保您不會對相關(guān)網(wǎng)站造成過大的負(fù)擔(dān)。
用于Web搜尋的Python庫
1)請求 -這個關(guān)鍵庫實際上是將數(shù)據(jù)從Web服務(wù)器獲取到您的計算機(jī)所必需的,并且它還包含其他一些很酷的功能,例如緩存。
2)Beautiful Soup 4-這是我們在這里使用的庫,它旨在使基于HTML標(biāo)簽的數(shù)據(jù)過濾變得簡單。
3)lmxl —快速的HTML和XML解析器(現(xiàn)在也與Beautiful Soup集成!)
4)Selenium —一種Web驅(qū)動程序工具,當(dāng)您需要從請求庫無法訪問的網(wǎng)站獲取數(shù)據(jù)時非常有用,因為它被隱藏在諸如登錄表單或強制單擊鼠標(biāo)之類的內(nèi)容之后。
5)Scrapy-一個完整的Web抓取框架,對于一次性數(shù)據(jù)分析項目來說可能會過時,但是當(dāng)生產(chǎn)項目,管道等需要抓取時,它非常適合。
如果您想了解有關(guān)此處涵蓋的任何主題的更多信息,請查看我們免費提供的交互式課程:Python中的Web Scraping
填寫下面表單即可預(yù)約申請免費試聽!怕錢不夠?可先就業(yè)掙錢后再付學(xué)費! 怕學(xué)不會?助教全程陪讀,隨時解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可推薦就業(yè)!
?2007-2022/ 5wd995.cn 北京漫動者數(shù)字科技有限公司 備案號: 京ICP備12034770號 監(jiān)督電話:010-53672995 郵箱:bjaaa@aaaedu.cc