/子磬
時至今日,無論對于專業人士,還是一般樂迷,復古樂派的演奏(或稱“本真演奏”)已經不是什么旁門左道的事情了。我的朋友中,就有在歐洲深造學習巴洛克小提琴或羽管鍵琴演奏的。近年國內的演出與唱片市場中,也常常可領略到復古樂團或演奏家的風采。但是,在二三十年前,萊昂哈特、霍格伍德、平諾克、戈貝爾、加德納、薩瓦爾等復古樂派大師們最活躍的時代,這些復古樂派大師及演奏方式在國內卻鮮為人知。我得益于當時的所謂打口碟,接觸到這一學派,并成為了這一學派的忠實粉絲。希望我的切身感受和思考能給大家帶來一些啟發與幫助。
大致是1995年前后,那時我還不知道什么是“復古”。我收到一張據說比較特別的唱片,是小號演奏家斯蒂爾-帕金斯(Crispian Steele-Perkins)與宴席古樂團(Tafelmusik Baroque Orchestra)錄制的《為小號與樂隊而作的音樂》。當時也只是留意到那些作曲家都是巴洛克時代的,包括阿爾比諾尼、比貝爾、亨德爾、斯特拉代拉、泰勒曼和維瓦爾第的作品。尤其是斯特拉代拉(Stradella,1642-1682)與比貝爾(Biber ,1644-1704)更為早期,但“特別”僅此而已嗎?打開唱片的說明書,看到內頁的一張照片,我茅塞頓開——那是斯蒂爾-帕金斯收藏并用于演奏的小號,其型制非常特別,是現代小號定型前的各種款式。為什么要用這樣的小號呢?仔細研讀說明書和相關資料才發現,不僅是獨奏家的樂器,整個宴席古樂團所用的都是所謂的“時代樂器”(period instrument)。這些樂器大多來自17、18世紀,或由現代樂器制造師按照當時的樣式仿制。他們力圖恢復使用當時的樂器、樂團編制、演奏方式,以求復原作曲家創作音樂時代的演奏原貌,這就是復古樂派的主張與實踐。
復原當時樂器的使用
斯蒂爾-帕金斯的《為小號與樂團而作的音樂》這張唱片非常迷人,不僅泰勒曼、維瓦爾第、阿爾比諾尼的樂曲效果比現代小號與樂團的版本更好,而且斯特拉代拉和比貝爾的作品凸顯出古雅與質樸的一面,帶給人一片澄澈而清新的天地,完全刷新了我對小號的認知。雖然現代小號無論是音量還是演奏便捷等方面都要優于古代的,而不帶閥鍵的巴洛克自然小號增加了演奏的難度,也就更加考驗演奏者的能力,但是按照著名小號演奏家艾麗森·巴爾松的說法,演奏這種小號更像是發自肺腑。對于巴洛克時期的作品而言,使用自然小號恰到好處,尤其在某些樂句中,如果使用了閥鍵,則失去自然的美感。至于音量方面,巴洛克樂團的編制比現代樂團的人數少,音量比較弱,巴洛克小號的音量可與之匹配。巴洛克小號與復古樂團的整體效果,讓人感覺更加典雅,既有宮廷之莊重矜持,又不失嘹亮璀璨的巴洛克式華美。
通常來說,樂器的改良總體是好的,但也會留下一點遺憾。比如小號這種樂器本來就是戰斗的號角,強吹的時候須凸顯戰斗的氣氛。現代小號改良之后,要達到與古代小號同樣效果的音色,則需演奏者鼓足力氣才能吹出,其音量巨大,完全覆蓋了整個現代管弦樂團。所以指揮家加德納在介紹其革命與浪漫樂團演奏的貝多芬交響曲的時候,就用小號來舉例子,表明在渲染激烈斗爭與激昂氣氛的時候,古代小號其實更有優勢。同樣的一個表達斗爭的動機,自然小號能夠很好地呈現出應有的音色,現代小號則不能。
嘗到巴洛克小號的甜頭之后,我就開始探索復古樂派的神秘園地了。對于巴洛克樂器的復古,巴洛克提琴和羽管鍵琴應該是最重要的。我們先來聊聊小提琴。在斯特拉迪瓦里的時代,小提琴的制造技術盡管已達巔峰,然而現在的小提琴無論是琴弦、指板、琴馬、琴頸,還是琴弓,都是有所改良的。我們現在能聽到的斯特拉迪瓦里名琴,其指板、琴馬和琴弦大多不是當時的款式。如果用當時的指板,高把位的音符不能演奏;用當時的琴弦和琴馬,浪漫時代的強力揉弦以及各種富有表現力的弓法也將無法完成。如此說來,我們為什么要復古呢?且說羊腸弦,雖然這種材質的琴弦音量較弱,而且非常容易斷,但當時用的就是這種琴弦。在19世紀前,貴族宮廷和市民階層的社交性演奏場景中,對樂器音量的要求不高,羊腸弦足以滿足當時的需求,而且其柔美的效果更能迎合貴族的審美。至于較平的巴洛克時代琴馬,對于演奏諸如巴赫《恰空》這樣的作品來說反而更有優勢,因為較平的琴馬演奏和弦更加方便。再說說巴洛克弓,它確實弱點不少,比如太短、弓段音量不均勻。歐洲的教授巴洛克小提琴的老師會這樣說:下弓(往下運弓)是“好的”,上弓(往上運弓)是“壞的”。從現代的角度看,下弓強,上弓弱,弓根強,弓尖弱,這明顯是不合格產品。但是,如果節奏是“強-弱-強-弱”,若以巴洛克弓演奏,則完全不用刻意營造,弓子本身的特點自然而然地產生出這種輕盈跳躍的效果。再加上巴洛克弓的握弓方式,演奏的效果必然是輕盈優雅的,所以你會很容易就感受到,演奏維瓦爾第的那些歡快而雅致的樂曲時,復古樂器有其明顯的優點。
再說羽管鍵琴。在以“強弱琴”(fortepiano)為名的現代鋼琴出現前,以羽毛管撥琴弦的羽管鍵琴,在很長時間內是古鋼琴的主流之一。雖然,這種古鋼琴不具備通過觸鍵的力度演奏出音符的強弱,但是它的音色卻代表著巴洛克時代璀璨的特質。我第一次聽到用羽管鍵琴演奏的巴赫《意大利協奏曲》的時候,就被這種琴的音色迷住了。不過各花入各眼,學鋼琴的同學覺得這種樂器聲音太單薄,尤其是低音的音量不足,不但沒有渾厚的感覺,反而其泛音又過于突出。這種樂器肯定不能用于演奏莫扎特中后期及隨后各作曲家的樂曲(除非是專門為羽管鍵琴而作)。甚至我也認為,對于巴赫那些“前衛”的鍵盤樂曲,現代鋼琴有現代鋼琴的好,羽管鍵琴演奏當然也不錯。但諸如拉莫、庫泊蘭、斯卡拉蒂等作曲家的作品,就比較明顯地必須以羽管鍵琴演奏。
復原當時樂團的編制
說到羽管鍵琴,讓我們隨之再看看當時樂團編制的情況。與現代管弦樂團不同,巴洛克時代的樂團大多是圍繞著羽管鍵琴,再加上各個管弦樂聲部組成的。羽管鍵琴的演奏者在當時經常充當指揮的角色;至于羽管鍵琴在樂曲中的作用,則大多是作為通奏低音。但由于羽管鍵琴的低音音量不足,作為通奏低音通常還需要維奧爾琴的補充,甚至在室內樂重奏組合中也需要這樣處理。那么,羽管鍵琴豈不是很尷尬?對于聽眾來說,其實更能注意到羽管鍵琴的高頻泛音音色,那些高頻泛音很能呈現節奏節拍的效果。巴洛克樂團如果沒有了羽管鍵琴璀璨的泛音,就好像巴洛克宮廷中沒有了那些金碧輝煌的裝飾。而對于巴洛克時期的作品來說,如果沒有了羽管鍵琴的存在,樂曲的節奏、推進的動力、活潑的生機,將大為遜色。一些現代樂器的樂團在演奏巴洛克樂曲的時候,雖然也配備了羽管鍵琴,但由于其他樂器音量過大,羽管鍵琴的聲音就顯得過于微弱,甚至連其高頻泛音都幾乎被湮沒,巴洛克音樂原本應有的活力因此大打折扣。
現代管弦樂團的編制形式在19世紀才相對固定下來,而在巴洛克時代和古典主義早中期,樂團的編制都不固定的,往往是根據樂曲的需要,靈活組編其所需的樂隊。對于巴洛克的那些耳熟能詳的樂曲來說,比如維瓦爾第的《四季》、巴赫的《勃蘭登堡協奏曲》和亨德爾的《水上音樂》等,我初次聆聽的版本均是現代樂團的。當我找到復古樂團演奏的版本聆聽之時,驚喜地發現,復古樂團輕盈、雅致、活躍的特質,更能出色地表現巴洛克中后時期的這些樂曲。聽完復古樂團的演奏后,便覺得現代樂團的那些演奏過于厚重、遲滯,缺乏活力,頗有拖泥帶水的感覺。
之所以會有這種情況,一方面是由于二者樂器的特質不同,另一方面則緣于復古樂團各個聲部的樂器數量大幅減少——甚至第一、第二小提琴聲部僅各有一把或兩把小提琴,且此編配屢見不鮮。根據復古樂派學者們的考究,即便是巴洛克時代富有的王公們,其樂隊的規模也是有限的,這種樂器數量其實是復原了當時的實際情況。對于喜歡現代大型管弦樂團的那種鋪天蓋地的樂器“群感”的樂迷來說,初聽復古樂團的演奏,其聲音的厚度肯定會令其感覺有點不大適應。不過對于巴洛克時代的樂曲、甚至莫扎特及其之前的古典早期作曲家的作品來說,這其實是非常恰當的。甚至對于貝多芬、舒伯特和柏遼茲來說,復原當時的樂器與樂團編制、演奏出當時應有的效果、最大限度地還原當時存在的可能性,也是非常必要的。只是這種“存在”能否與各位聽眾心目中已有的“存在”并置,就是見仁見智了。
復原當時的演奏方式
在復原當時的樂器以及樂團編制之外,更重要的是復原當時的演奏方式——甚至不采用當時的樂器,而只是嚴格按照“時代方式”來演奏,其效果也是非常突出的。例如英國指揮家羅格·諾靈頓擔任德國斯圖加特廣播交響樂團的首席指揮時,就盡最大可能地把這支現代樂團調教成“復古”的樣式;我非常喜歡他們演繹的海頓交響曲。至于諾靈頓為我們復原的那位在浪漫時期追求古典主義精神的勃拉姆斯,則摒棄了很多浪漫的演奏方式,比如強烈的揉弦、音符內力度的變化與自由速度變化等。估計對于很多聽眾來說,擺脫固有版本的印象是頗有難度的。回想勃拉姆斯當年曾表示,他從來不聽當時的演奏家或樂團演奏的莫扎特作品,認為他們演奏的根本不是莫扎特。那么,我們現在聽的勃拉姆斯是不是真正的勃拉姆斯呢?諾靈頓指揮斯圖加特廣播交響樂團演奏的勃拉姆斯交響曲,雖然讓聽慣了其他版本的各位樂迷——也包括我自己,都感覺無所適從,但他為我們還原出了勃拉姆斯交響曲的一種存在的可能性,或許這才是“本真”的。
為什么要復原當時的演奏方式呢?這是因為后來的很多演奏方式是隨著樂器的改良以及時代精神的改變才出現的,比如較強的揉弦、漸強與漸弱、踩踏板(鋼琴)等。還有些情況則是由于現在的標準確立之后造成作曲家當時的標記與現在的標記之間產生了差異所致,比如巴洛克時代標“快板”的樂曲,其速度實際上可能比現在“快板”演奏的速度還要快。甚至標準的A音,巴洛克時代可能是430Hz、也可能是415Hz,而不是現代的440Hz。如果按照復古樂派大師的考究,越是早期的樂曲,復原其當時的演奏方式,得到的效果就越是明顯,甚至是讓人大為驚訝:原來這樂曲是這樣的!
例如維瓦爾第的《a小調小提琴協奏曲》(Op.3 No.6,RV356)——學過小提琴的人肯定很熟悉它,我的女兒也學習過此曲。它出自曲集《和諧的靈感》,是維瓦爾第較早被關注的作品之一。早在20世紀初,它就作為協奏曲學習的入門曲目被編入教材中,并且作為小提琴初級協奏曲的練習與比賽曲目一直延續至今。在日本小提琴家教育家鈴木鎮一所編撰的小提琴教材中,維瓦爾第的這首樂曲的樂譜上即比原版增加了很多標記,比如漸強漸弱、突強、保持音等,而且弓法也有特殊的要求;以這種方式演奏的唱片錄音版本也不少,比如謝林、帕爾曼。樂曲開頭的“mi-la-la-la-la”就更明顯了,后期修訂譜上標記有保持音記號,要求拉得飽滿,具有歌唱性,保持充分的時值,稍微加強一些力度,最好還要揉弦,并奏出略帶浪漫的感覺。將這些供給初學者練習小提琴技法雖然也未嘗不可,然而我覺得此種演奏方式挺奇怪的——這不是維瓦爾第吧?!起碼不是我心目之中的維瓦爾第。我們再聽聽復古樂派的版本,這幾個“la”明顯是輕盈跳動的,而且速度較快,并沒有被過分強調與突出。這一樂句應該是舞蹈性的而不是歌唱性的,我認為這樣才符合這一樂章的特點,而且這種方式才是維瓦爾第的,才是節奏強烈、跳躍的巴洛克音樂風格。
專業演奏者若用復古方式演奏巴洛克時代以及古典主義早中期的樂曲,要克制很多已有的習慣。然而各種限制并不是要將一首樂曲變成清湯寡水,而是力求還原其本來應有的存在。這一方面有點像粵菜,追求的是食材本身的味道。糖、味精以及各式香料加與不加,分量的把握,都是很有考究的。雖然你不一定很喜歡粵菜,但“食在廣州”是名不虛傳的。復古樂派的大師們力求還原的是音樂原有的一種存在的可能性,或是還原這種存在的恰當演繹。演奏音樂用何種樂器、何種編制、何種方式,就如同炮制美味佳肴,如何用料、如何搭配、如何烹制。至于你喜歡與否,就要看個人的口味了。對于食客來說,粵菜自然不能放過;而對于樂迷來說,也請別錯過復古樂派的演奏。
上方藍字“國際循環”關注我們,
然后點右上角“…”菜單,選擇“”
要點概覽
一項美國的隊列研究,對比了心臟再同步治療(CRT-D)與植入ICD雙腔起搏器(DC-ICD)在需要心室起搏老年患者中的應用差異
一項韓國的隊列研究,評價了接受口服抗凝劑治療的亞洲房顫患者的體重指數(BMI)與臨床結局之間的關系
VENUS試驗的二次分析中,進一步評價了持續性房顫導管消融術中Marshall靜脈注射乙醇對預后影響的決定因素
一項美國的回顧性隊列研究,總結了接受羥基氯喹/阿奇霉素(HCQ/AZM)治療的COVID-19患者QT延長的臨床特征
雙腔或心臟再同步治療除顫器在需要心室起搏老年患者中的應用和結局
頻繁的右心室(RV)起搏可導致并加重心力衰竭。心臟再同步治療(CRT)已被證明與需要頻繁右心室起搏的左室射血分數降低患者的預后改善相關,但CRT與雙腔(DC)設備的使用模式以及這些患者在臨床實踐中的相關預后尚不清楚。
這項回顧性隊列研究使用了美國國家心血管數據注冊中心(NCDR)ICD數據,共分析了3100例在2010年至2016年間首次植入CRT除顫器(CRT-D)或DC-ICD的患者,這些患者具有I或II級指南室性心動過緩起搏指征,但沒有CRT的I級指征。
納入分析的患者平均年齡為76.3歲,男性占80.6%。相較于DC-ICD治療患者,CRT-D治療患者的3度房室傳導阻滯(48.8% vs 30.8%,P<0.001)、非缺血性心肌病(29.9% vs 18.2%;P<0.001)以及既往有心力衰竭住院(41.4% vs 30.0%;P<0.001)的比例更高(圖1)。
圖1.(未調整)DC-ICD和CRT-D的死亡率、再住院率
調整后,相較于DC-ICD,CRT-D與較低的1年死亡率(HR=0.70;95%CI:0.57~0.87;P=0.001)和心力衰竭住院率(HR=0.77;95%CI:0.61~0.97;P=0.02)相關(圖2),并發癥方面無顯著差異。醫院對CRT的使用存在差異(中位OR=2.00),并且隨著時間的推移,該隊列中CRT的使用率更高(2010年為48.4%,2016年為60.9%;P<0.001,圖3)。
圖2. CRT-D治療患者的住院頻率
圖3. DC-ICD和CRT-D治療的時間趨勢
小 結
這項隊列研究顯示,在有心動過緩起搏指征但沒有CRT I級指征的,并且接受ICD植入的老年患者中,CRT-D與DC裝置相比具有更好的結果。研究還觀察到設備類型使用的變異性,CRT植入率隨著時間的推移而增加。
接受口服抗凝治療的亞洲房顫患者的體重指數和臨床結果
體重指數(BMI)對房顫患者臨床結局的影響仍然存在爭議,尤其是在亞洲人中。為了評估接受口服抗凝劑治療的亞洲房顫患者的體重指數與臨床結局之間的關系,這項研究利用2015年1月至2017年12月的韓國國家健康保險數據庫(圖4),分析了缺血性卒中、顱內出血、胃腸道出血住院、大出血、全因死亡以及根據BMI分類的復合臨床結局。
圖4. 研究入排標準及分組流程
共有43 173例患者被納入BMI分類(kg/m2):低體重(BMI<18.5)占3%,正常體重(BMI 18.5~23)占28%,超重(BMI 23~25)占24%,Ⅰ級肥胖(BMI 25~30)占39%,Ⅱ級肥胖(BMI ≥30)占6%(圖5)。
圖5.患者的BMI分布情況
結果顯示,較高的BMI(每增加5 kg/m2)與缺血性卒中(HR=0.891,95%CI:0.801~0.992)、胃腸道出血住院(HR=0.785,95%CI:0.658~0.937)、大出血(HR=0.794,95%CI:0.686~0.919)、全因死亡(HR=0.658,95%CI:0.605~0.716)和復合臨床結局(HR=0.751,95%CI:0.706~0.799)顯著相關,但與顱內出血(HR=0.815,95%CI:0.627~1.061)除外(圖6)。
另一方面,體重不足也與綜合臨床結局的風險增加相關(HR=1.398,95%CI:1.170~1.671),主要由全因死亡風險增加驅動(圖7)。非維生素K拮抗劑口服抗凝劑與華法林對不同BMI組患者臨床結局的影響相似。
圖6. BMJ作為臨床結局連續變量的校正危險比
圖7. 不同BMI患者的臨床結局
小 結
該研究表明,BMI越高,缺血性中風、大出血的風險越低,生存越好。體重不足的患者有更高的全因死亡和復合臨床結局風險。房顫患者的最佳體重指數應根據綜合護理路徑確定和管理。
持續性房顫導管消融術中Marshall靜脈注射乙醇對預后影響的決定因素:VENUS試驗的二次分析
2020年ACC報道的VENUS試驗表明,在導管消融(CA)治療中,通過Marshall靜脈(VOM)灌注乙醇可改善持續性房顫(AF)的消融效果。VOM乙醇灌注對心律控制的影響存在顯著的異質性。該研究旨在評價二尖瓣周圍雙向傳導阻滯的成功率和手術容積與預后的關系。
研究將343例持續性房顫患者隨機分為CA聯合VOM乙醇灌注組(VOM-CA)和單獨CA組。主要結局(單次手術后30秒以上無房顫或房速)按2類進行分析:(1)成功 vs 無二尖瓣周圍阻滯;(2)高容量中心(入組>20名患者) vs 低容量中心(圖8)。
圖8. 研究設計
結果顯示,在二尖瓣周圍阻滯患者中,VOM-CA組達到主要結局的比例為54.3%,CA組為37%(P=0.01)。在無二尖瓣周圍阻滯的患者中,VOM-CA術后無房顫/房速的比例為34.0%,CA組為為37.0%(P=0.583)(圖9)。
圖9. 二尖瓣周圍阻滯與臨床結局
在高容量手術中心,VOM-CA組達到主要結局的比例為56.4%,CA組為40.2%(P=0.01)。在低容量手術中心,VOM-CA組無房顫/房速的比例為30.77%,CA組為32.61%(P=0.84)。在高容量中心成功實施二尖瓣周圍阻滯的患者中,VOM-CA組的主要結局比例為59%,CA組為39.1%(P=0.01)。相互作用檢驗具有顯著性(二尖瓣周圍阻滯P=0.002,中心容量P=0.04)(圖10)。
圖10. 手術中心的容量與臨床結局
小 結
對于持續性房顫的導管消融,在有二尖瓣周圍阻滯的患者中,加入Marshall靜脈的乙醇關注,并且在高容量手術中心進行時,對患者預后有較大影響。二尖瓣周圍阻滯可以作為VOM手術的一部分。
羥基氯喹/阿奇霉素治療COVID-19患者的QT間期延長
羥基氯喹/阿奇霉素(HCQ/AZM)已廣泛用于治療COVID-19,但其在該人群中QT間期延長和心律失常的風險未知。本研究旨在描述HCQ/AZM治療的COVID-19住院患者隊列中QT(QTc)延長的臨床特征(圖11)。
研究回顧性分析了415例接受HCQ/AZM治療的COVID-19住院患者。QTc間期在給藥前和給藥后的前5天計算。主要終點是QTc延長的幅度以及與QTc延長相關的因素。次要終點是持續性室速或室顫的發生率和全因死亡率。
圖11. QT間期檢測的機構策略
在納入分析的415例患者中,QTc從443±25 ms增加到473±40 ms(87例QTc≥500 ms)。QTc延長≥500 ms的相關因素有年齡(P<0.001)、體重指數<30 kg/m2(P=0.005)、心力衰竭(P<0.001)、肌酐升高(P=0.005)和肌鈣蛋白峰值(P<0.001)(表1)。在一個死亡率已經很高的人群中,QTc的變化與短期內的死亡無關(HR=0.998;P=0.607)(圖12)。未觀察到原發性高級別室性心律失常。
圖12. COVID-19住院患者QTc間期延長的研究
表1.與QTc延長≥500ms獨立相關的臨床因素
小 結
該研究表明,接受HCQ/AZM治療的COVID-19住院患者存在QTc延長。其中,年齡、BMI、心衰、肌酐、肌鈣蛋白等臨床因素與QTc延長有關;但QTc的改變與死亡風險的增加無關。
▼參考文獻
[1]Borne RT, MasoudiFA, Curtis JP, et al. Use and Outcomes of Dual Chamber or CardiacResynchronization Therapy Defibrillators Among Older Patients RequiringVentricular Pacing in the National Cardiovascular Data Registry ImplantableCardioverter Defibrillator Registry. JAMA Netw Open. 2021;4(1):e2035470.Published 2021 Jan 4. doi:10.1001/jamanetworkopen.2020.35470
[2]Lee SR, Choi EK,Jung JH, et al. Body Mass Index and Clinical Outcomes in Asian Patients WithAtrial Fibrillation Receiving Oral Anticoagulation. Stroke. 2021;52(2):521-530.doi:10.1161/STROKEAHA.120.030356
[3]Lador A, PetersonLE, Swarup V, et al. Determinants of outcome impact of Vein of Marshall Ethanolinfusion when added to catheter ablation of persistent atrial fibrillation: Asecondary analysis of the VENUS randomized clinical trial [published onlineahead of print, 2021 Jan 19]. Heart Rhythm. 2021;S1547-5271(21)00005-9.doi:10.1016/j.hrthm.2021.01.005
[4]O'Connell TF,Bradley CJ, Abbas AE, et al. Hydroxychloroquine/Azithromycin Therapy and QTProlongation in Hospitalized Patients With COVID-19. JACC Clin Electrophysiol.2021;7(1):16-25. doi:10.1016/j.jacep.2020.07.016
(來源:《國際循環》編輯部)
版
權
聲
明
版權屬《國際循環》所有。歡迎個人轉發分享。其他任何媒體、網站如需轉載或引用本網版權所有之內容須在醒目位置處注明“轉自《國際循環》”
點分享
點收藏
者:ssw
來源:Python 技術
上班摸魚看了2個星期車評,還是一頭霧水,選合資還是國產?發動機cvt好還是雙離合好?艾瑞澤5 GT動力足,但腰線和前臉讓人吐槽,真的可靠嗎。國產選長安逸動還是吉利帝豪?標志408出來了,還有艾瑞澤8很漂亮。看會視頻吧,同質化嚴重,講來將去就是車內車外介紹一遍。
熱門視頻下通常有幾百條評論,我一般會翻看一遍,七個八個視頻就是幾千條評論,信息蕪雜,沒個定準,所以干脆不看了!我決定從評分入手,爬下懂車帝看到底有多少個汽車品牌。長安、吉利、奇瑞它們有多少車型,高分段的車型多不,每家熱銷的車子分數排在哪個段位。所以用scrapy爬了3655條數據。
正好前段時間在python技術分享過一篇《不止高效,原來pandas表格可以更美的!》 ,結合里面介紹過的排序分組配色,對我們的數據進行分析。通過這些數據,可以看出廠商的產品布局和銷售優勢。
比如馬路上很多別克牌子,我又對它沒啥印象,除了知道威朗在緊湊型轎車中排名靠前,還有其它熱銷車型嗎?所以特意看了下別克的數據:
好家伙,居然有排名第一的!再比如韓國車企在中國沒落了,落寞成什么樣子呢,
可以看到,現代和起亞在小型轎車和中型MPV是有銷量的,悅納曾經也是月銷過萬的主流合資轎車,這里它雖然位于小型橋車銷量NO.10,但8月僅銷售303輛。確實有點慘淡啊,除了伊蘭特,8月銷量超過1千輛的只有一個庫斯途,其它最多的的月銷也只有1到3百輛,它們曾經非常受歡迎,不過隨著汽車行業的更新換代,逐漸淡出了消費者們的視野。
再舉個,我想知道486個品牌中,每個品牌評分最高的車型
486個品牌的車型評分,已上傳,http://ssw.fit/file/ 。由于部分品牌沒有車型,如“眾泰”沒一款車型,所以爬的時候不會把這種寫入csv文件中。一共3655條數據,也就是3655個車型。
對car.csv進行處理:
import pandas as pd
df2=pd.read_csv("D:/桌面/car.csv",encoding='gb18030')
#取出評分大于0的(也就是去掉懂車帝上顯示“暫無評分”的)
x=df2.groupby('評分').filter(lambda x:x['評分'].mean() > 0)
#取各組品牌中評分最高的
t=x.sort_values('評分',ascending=False).groupby('品牌', as_index=False).first()
t.sort_values('評分',ascending=False,inplace=True)
t.to_csv('評分榜.csv', index=True)
輸出如下:
可以看到,所有品牌中,評分最高的車型是勞斯萊斯的“幻影”,4.74分,這個分數很高了。要知道國產長安最高3.88(長安UNI-K),吉利最高3.9(星越L),日產最高也沒超過4分。
下面開始整活。先說明幾個地方:
好了,先從觀察頁面開始。
觀察它的url。首先來個十八連猜,猜下它尾部的18個“x”分別代表什么意思?
https://www.dongchedi.com/auto/library/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x
我先猜一個,倒數第3個x代表汽車品牌,不信嗎,修改數字的話,第二個紅框會出現不同的品牌:
所以url的倒數第三位,數字3代表奔馳,2為奧迪,4是寶馬。其它你可以試一下,能搜索到結果的數字大概在600以內。我猜汽車品牌數也在600內吧。當然不能這么一個個猜, 還是趕緊干正事,找出每個品牌對應的數字,這樣才好向相關品牌的頁面發送請求。
一共有6個屬性為layout_label__1qfS8的span標簽,我們要找的是第6個,即找到“已知條件”這個span標簽。
這個時候下面腳本中的條件condition[5]才成立,BeautifulSoup才找得到:
soup=BeautifulSoup(rep.text,'html.parser')
condition=soup.find_all('span', class_='layout_label__1qfS8')
# 當num大于500時,有可能沒這個品牌,condition[5]會報錯
try:
condition[5].next_sibling.a.text
except Exception as e:
pass
因為數字大于500時,很可能沒這個品牌,頁面上不會出現“已知條件”,而是提示“0車系符合條件”
上面的next_sibling屬性用來查詢兄弟節點,也就是“已選條件”那個span的下一個span;next_sibling.a.text,下一個span的a標簽里的文字就是品牌的名字
BeautifulSoup找到數據后,因為品牌對應的url較多,使用multiprocessing.dummy多線程加快速度。另外,數字大于500時,很可能找不到品牌,所以循環1000以內的數字基本能覆蓋到所有品牌
pool=ThreadPool(10)
pool.map(get_brand_id,[i for i in range(1,1000)])
綜上,獲取品牌對應id的完整腳本:
# -*- coding: utf-8 -*-
import json,re,requests,ssl
from bs4 import BeautifulSoup
from multiprocessing.dummy import Pool as ThreadPool
num_list=[]
brand_dict={}
def get_brand_id(num):
x='https://www.dongchedi.com/auto/library/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-%s-x-x' % num
rep=requests.get(x,timeout=10)
soup=BeautifulSoup(rep.text,'html.parser')
condition=soup.find_all('span', class_='layout_label__1qfS8')
# 當num大于500時,有可能沒這個品牌,condition[5]會報錯
try:
s=condition[5].next_sibling.a.text
print('s111', s)
except Exception as e:
pass
for span in condition:
if span.string=='已選條件':
print('ok')
brand_dict[s]=num
num_list.append(num)
pool=ThreadPool(10)
pool.map(get_brand_id,[i for i in range(1,1000)])
print(num_list)
print(brand_dict)
輸出結果如下,總共486個汽車品牌:
{
前面略...
'雪佛蘭': 6,
'雪鐵龍': 21,
'零跑汽車': 207,
'雷丁': 282,
'雷克薩斯': 22,
'雷諾': 46,
'雷諾三星': 301,
'雷達汽車': 514,
'霍頓': 278,
'領克': 174,
'領志': 309,
'領途汽車': 247,
'飛凡汽車': 401,
'飛碟汽車': 404,
'首望': 340,
'馬自達': 15,
'馭勝': 167,
'騏鈴汽車': 104,
'高合': 249,
'魏牌': 66,
'黃海': 132,
'龍程汽車': 415
}
品牌對應的url如下,我們可以挑選自己感興趣的品牌url發送請求:
[
前面略...
'https://www.dongchedi.com/auto/library/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-101-x-x',
'https://www.dongchedi.com/auto/library/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-76-x-x',
'https://www.dongchedi.com/auto/library/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-1-x-x',
'https://www.dongchedi.com/auto/library/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-126-x-x',
]
下面會用scrapy爬蟲框架對這些url發起請求,數據寫入csv
整個目錄結構如下:
#創建scrapy項目
scrapy startproject dcd
cd dcd
#生成一個爬蟲
scrapy genspider car "https://www.dongchedi.com/"
# 是否遵守協議,設置false
ROBOTSTXT_OBEY=False
#設置請求頭
DEFAULT_REQUEST_HEADERS={
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0'
}
#下載中間件
DOWNLOADER_MIDDLEWARES={
'dcd.chrom_middlewares.DcdDownloaderMiddleware': 543,
}
ITEM_PIPELINES={
'dcd.pipelines.DcdPipeline': 300,
}
第2步DOWNLOADER_MIDDLEWARES設置的下載中間件,我們自己編寫:chrom_middlewares.py
import time
from selenium import webdriver
from scrapy.http.response.html import HtmlResponse
class DcdDownloaderMiddleware(object):
def __init__(self):
# selenium加載瀏覽器
options=webdriver.ChromeOptions()
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
options.add_argument('--ignore-certificate-errors')
options.add_argument('--ignore-ssl-errors')
self.driver=webdriver.Chrome(executable_path=r"C:\drf2\drf2\chromedriver.exe",options=options)
self.driver.maximize_window()
#重寫process_request方法
def process_request(self, request, spider):
print('request.url',request.url)
self.driver.get(request.url)
js='return document.body.scrollHeight;'
height=0
#selenium模擬頁面向下滾動加載全部頁面
if request.url !='https://www.dongchedi.com/auto/library/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x':
while True:
new_height=self.driver.execute_script(js)
if new_height > height:
self.driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
height=new_height
time.sleep(1)
else:
print("滾動條已經處于頁面最下方!")
break
source=self.driver.page_source
# 創建一個response對象,把頁面信息都封裝在reponse對象中
response=HtmlResponse(url=self.driver.current_url,body=source,request=request,encoding="utf-8")
return response
對process_request說明一點:
如果車型多,需要滾動鼠標分一次或多次才能加載完畢,這個時候需要selenium模擬頁面向下滾動加載全部車型,否則取到的車型是不全的。
while True:
new_height=self.driver.execute_script(js)
if new_height > height:
self.driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
height=new_height
time.sleep(1)
else:
print("滾動條已經處于頁面最下方!")
break
import scrapy
class DcdItem(scrapy.Item):
#品牌
brand=scrapy.Field()
#車型
name=scrapy.Field()
#評分
score=scrapy.Field()
#特點
title=scrapy.Field()
這幾個字段的意思用箭頭標明了:
import scrapy
from lxml import etree
from dcd.items import DcdItem
import os,csv
if os.path.exists('D:/桌面/car.csv'):
print('delete?')
os.remove('D:/桌面/car.csv')
f=open('D:/桌面/car.csv', 'a+', newline='', encoding='gb18030')
f_csv=csv.writer(f)
f_csv.writerow(['品牌','車型', '評分', '特點'])
class RainSpider(scrapy.Spider):
name='car'
allowed_domains=['https://www.dongchedi.com/']
start_urls=['https://www.dongchedi.com/auto/library/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-11-x-x','https://www.dongchedi.com/auto/library/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-13-x-x']
def parse(self, response):
print('html111')
html=etree.HTML(response.text)
item=DcdItem()
brand=html.xpath('//*[@id="__next"]/div[1]/div[2]/div/div[4]/span[2]/div/div/a/text()')[0]
lis=html.xpath('//*[@id="__next"]/div[1]/div[2]/div/ul/li[position()>=1]')
print('111 lis',lis)
for li in lis:
name=li.xpath('./div/a[1]/text()')[0]
try:
#有評分
score=li.xpath('./div/a[2]/text()')[0].split('分')[0]
except Exception as e:
#無評分
score=0
try:
#有標題
title=li.xpath('./div/span/text()')[0]
# print('title111',title)
except Exception as e:
#無標題
title='無'
print(name,score,title)
f_csv.writerow([brand,name,score,title])
item['name']=name
item['score']=score
item['title']=title
yield item
下面對car.py的2個地方進行說明
5.1 獲取品牌
brand=html.xpath('//*[@id="__next"]/div[1]/div[2]/div/div[4]/span[2]/div/div/a/text()')[0]
xpath路徑,在edge瀏覽器中可以通過右鍵“檢查”找到元素,再右鍵選擇“復制”->"復制 Xpath"
按crtl+F鍵可以粘貼剛才復制的xpath,按回車鍵,頁面上會突出顯示對應的元素。
5.2 獲取所有的li標簽,代表一輛輛汽車信息
然后循壞這些li標簽,獲取到車型、評分、左上角的藍色說明文字,寫入csv文件
lis=html.xpath('//*[@id="__next"]/div[1]/div[2]/div/ul/li[position()>=1]')
from scrapy.cmdline import execute
execute('scrapy crawl car'.split(' '))
文件位置:
在pycharm中右擊即可運行爬蟲:
參考上文提到的《不止高效,原來pandas表格可以更美的!》
假如你想了解長安吉利奇瑞這3個品牌,那么在car.py中填寫對應的url
#url中的73代表吉利,18是奇瑞,35是長安,對這3個品牌發起請求
start_urls=['https://www.dongchedi.com/auto/library/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-73-x-x','https://www.dongchedi.com/auto/library/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-18-x-x','https://www.dongchedi.com/auto/library/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-35-x-x']
這樣car.csv中就只有這3個品牌的數據了,方便我們配色和對比
import pandas as pd
from datetime import datetime,timedelta
df2=pd.read_csv("D:/桌面/car.csv",encoding='gb18030')
#取出評分大于0的(也就是去掉懂車帝上顯示“暫無評分”的)
x=df2.groupby('評分').filter(lambda x:x['評分'].mean() > 0)
x.sort_values('評分',ascending=True,inplace=True)
new=x.groupby(['品牌','評分','車型','特點'],as_index=False)
new3=new.all()
#給每種品牌加上顏色
#評分大于3.8的,用黃色標注
new3.style.highlight_between(left='吉利汽車',right='吉利汽車',subset=['品牌'],props='background:#ffa5a5')\
.highlight_between(left='奇瑞',right='奇瑞',subset=['品牌'],props='background:#a1eafb')\
.highlight_between(left='長安',right='長安',subset=['品牌'],props='background:#71c9ce')\
.highlight_between(left=3.8,right=5,subset=['評分'],props='background:#f9ed69')
輸出結果如下:
從數據可以看出,國內一線品牌產品線豐富,吉利在小型SUV、緊湊型轎車、緊湊型SUV都有熱銷產品,奇瑞僅瑞虎3x和瑞虎5x位于銷量榜前10(怎么沒有出口汽車?),看來理工男從產品受歡迎程度上來說離一線品牌還有差距。可以根據自己的喜好,給想看的品牌配上它們的logo色,看看它們的數據是否有驚喜。