前期回顧:你要偷偷學Python(第九天)html
依舊是這段啊python
本系列文默認各位有必定的C或C++基礎,由於我是學了點C++的皮毛以後入手的Python。 本系列文默認各位會百度,學習‘模塊’這個模塊的話,仍是建議你們有本身的編輯器和編譯器的,上一篇已經給你們作了推薦啦? 而後呢,本系列的目錄嘛,說實話我我的比較傾向於那兩本 Primer Plus,因此就跟着它們的目錄結構吧。 本系列也會着重培養各位的自主動手能力,畢竟我不可能把全部知識點都給你講到,因此本身解決需求的能力就尤其重要,因此我在文中埋得坑請不要把它們當作坑,那是我留給大家的鍛鍊機會,請各顯神通,自行解決。 1234567
今天干嗎呢?是否是覺得我要寫小餅乾了?非也非也,前天踢到鋼板了,爬下來一堆亂碼,請教了一下前輩,用正則表達式。正則表達式
不少時候吧,並非你能力不行,就是由於你沒那個見地,沒那個眼界而已。
因此要多向不一樣領域的,見多識廣的學長學姐、老師、長輩們請教。json
因此,這裏仍是要說一下咱們這個學習羣啊。瀏覽器
若是你們在學習中遇到困難,想找一個python學習交流環境,能夠加入咱們的python圈,裙號947618024,可領取python學習資料,會節約不少時間,減小不少遇到的難題。網絡
事情的通過是這樣的,昨天個人小爬蟲可憐兮兮的爬回來,看樣子是受委屈了。那我怎麼能忍吶?那必須一頓操做猛如虎啊,因而我就去看究竟是何方神聖。編輯器
爬取林志炫的歌詞,哪首歌?你跟我說哪首?這點小事本身決定就行了。學習
首先就判斷確定不可能給你從網頁上直接抓下來的,因而咱們打開network。爲何不可能?那確定是我失敗過了嘛。jsonp
有兩個頁面能拿歌詞,
一個是還沒放歌的頁面:https://y.qq.com/n/yqq/song/001PGGQ81Xxw9l.html
另外一個是歌詞播放的頁面:https://y.qq.com/portal/player.htmlui
第二個頁面通過嘗試,效果不如第一個頁面,能夠抓一下當作練習。
因而咱們選用第一個頁面:
此處跳過一波查找操做,具體見《第九天》
直接上結果:
import requests import json from bs4 import BeautifulSoup headers = { 'origin':'https://y.qq.com', # 請求來源,本案例中實際上是不須要加這個參數的,只是爲了演示 'referer':'https://y.qq.com/n/yqq/song/004Z8Ihr0JIu5s.html', # 請求來源,攜帶的信息比「origin」更豐富,本案例中實際上是不須要加這個參數的,只是爲了演示 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36', # 標記了請求從什麼設備,什麼瀏覽器上發出 } # 假裝請求頭 #url = 'https://y.qq.com/n/yqq/song/001PGGQ81Xxw9l.html' url = 'https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_yqq.fcg?nobase64=1&musicid=106678944&-=jsonp1&g_tk_new_20200303=5381&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0' res_song = requests.get(url,headers = headers) # 方案一 soup = BeautifulSoup(res_song.text,'html.parser') print(soup) #方案二 # json_res = json.loads(res_song.text) # print(json_res['lyric']) 1234567891011121314151617181920212223242526
好極,咱們來看一下這兩個方案會有什麼結果:
那怎麼辦?好在這倆玩意兒都能當字符串處理,那就,正則吧。
好,接下來咱們來看正則表達式。
正則表達式(Regular Expression)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱爲"元字符")。
正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規則的字符串。
普通字符包括沒有顯式指定爲元字符的全部可打印和不可打印字符。這包括全部大寫和小寫字母、全部數字、全部標點符號和一些其餘符號。
字符釋義[ABC]匹配 […] 中的全部字符,例如 [aeiou] 匹配字符串 「google runoob taobao」 中全部的 e o u a 字母。[^ABC]匹配除了 […] 中字符的全部字符,例如 [^aeiou] 匹配字符串 「google runoob taobao」 中除了 e o u a 字母的全部字母。[A-Z][A-Z] 表示一個區間,匹配全部大寫字母,[a-z] 表示全部小寫字母。.匹配除換行符(\n、\r)以外的任何單個字符,相等於 [^\n\r]。[\s\S]匹配全部。\s 是匹配全部空白符,包括換行,\S 非空白符,包括換行。\w匹配字母、數字、下劃線。等價於 [A-Za-z0-9_]
限定符用來指定正則表達式的一個給定組件必需要出現多少次才能知足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6種。
正則表達式的限定符有:
限定符表達式*匹配前面的子表達式零次或屢次。例如,zo* 能匹配 「z」 以及 「zoo」。* 等價於{0,}。+匹配前面的子表達式一次或屢次。例如,‘zo+’ 能匹配 「zo」 以及 「zoo」,但不能匹配 「z」。+ 等價於 {1,}。?匹配前面的子表達式零次或一次。例如,「do(es)?」 能夠匹配 「do」 、 「does」 中的 「does」 、 「doxy」 中的 「do」 。? 等價於 {0,1}。{n}n 是一個非負整數。匹配肯定的 n 次。例如,‘o{2}’ 不能匹配 「Bob」 中的 ‘o’,可是能匹配 「food」 中的兩個 o。{n,}n 是一個非負整數。至少匹配n 次。例如,‘o{2,}’ 不能匹配 「Bob」 中的 ‘o’,但能匹配 「foooood」 中的全部 o。‘o{1,}’ 等價於 ‘o+’。‘o{0,}’ 則等價於 ‘o*’。{n,m}m 和 n 均爲非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,「o{1,3}」 將匹配 「fooooood」 中的前三個 o。‘o{0,1}’ 等價於 ‘o?’。請注意在逗號和兩個數之間不能有空格。
定位符使您可以將正則表達式固定到行首或行尾。它們還使您可以建立這樣的正則表達式,這些正則表達式出如今一個單詞內、在一個單詞的開頭或者一個單詞的結尾。
定位符用來描述字符串或單詞的邊界,^ 和 $ 分別指字符串的開始與結束,\b 描述單詞的前或後邊界,\B 表示非單詞邊界。
正則表達式的定位符有:
字符描述^匹配輸入字符串開始的位置。若是設置了 RegExp 對象的 Multiline 屬性,^ 還會與 \n 或 \r 以後的位置匹配。$匹配輸入字符串結尾的位置。若是設置了 RegExp 對象的 Multiline 屬性,$ 還會與 \n 或 \r 以前的位置匹配。\b匹配一個單詞邊界,即字與空格間的位置。\B非單詞邊界匹配。
注意:不能將限定符與定位符一塊兒使用。因爲在緊靠換行或者單詞邊界的前面或後面不能有一個以上位置,所以不容許諸如 ^* 之類的表達式。
若要匹配一行文本開始處的文本,請在正則表達式的開始使用 ^ 字符。不要將 ^ 的這種用法與中括號表達式內的用法混淆。
若要匹配一行文本的結束處的文本,請在正則表達式的結束處使用 $ 字符。
用圓括號 () 將全部選擇項括起來,相鄰的選擇項之間用 | 分隔。
正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配。
Python 自1.5版本起增長了re 模塊,它提供 Perl 風格的正則表達式模式。
re 模塊使 Python 語言擁有所有的正則表達式功能。
傳送門
回頭再練練吧,還不是很熟練。。。
今天腦袋疼,就直接放代碼吧,還有點瑕疵,比方說那個:‘詞’ 和填詞人名字應該用:分隔,‘曲’也是這樣。
import re import requests from bs4 import BeautifulSoup headers = { 'origin':'https://y.qq.com', # 請求來源,本案例中實際上是不須要加這個參數的,只是爲了演示 'referer':'https://y.qq.com/n/yqq/song/004Z8Ihr0JIu5s.html', # 請求來源,攜帶的信息比「origin」更豐富,本案例中實際上是不須要加這個參數的,只是爲了演示 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36', # 標記了請求從什麼設備,什麼瀏覽器上發出 } # 假裝請求頭 url = 'https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_yqq.fcg?nobase64=1&musicid=106678944&-=jsonp1&g_tk_new_20200303=5381&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0' res_song = requests.get(url,headers = headers) # 方案一 soup = BeautifulSoup(res_song.text,'html.parser') #print(soup.text) pat=re.compile(r'[\u4e00-\u9fa5]+') result=pat.findall(soup.text) result = '\n'.join(result[5:]) print(result)
最後多說一句,想學習Python可聯繫小編,這裏有我本身整理的整套python學習資料和路線,想要這些資料的均可以進q裙947618024領取。
本文章素材來源於網絡,若有侵權請聯繫刪除。