日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

python爬蟲(chóng)之爬取百度音樂(lè)的實(shí)現(xiàn)方法

系統(tǒng) 2049 0

在上次的爬蟲(chóng)中,抓取的數(shù)據(jù)主要用到的是第三方的Beautifulsoup庫(kù),然后對(duì)每一個(gè)具體的數(shù)據(jù)在網(wǎng)頁(yè)中的selecter來(lái)找到它,每一個(gè)類(lèi)別便有一個(gè)select方法。對(duì)網(wǎng)頁(yè)有過(guò)接觸的都知道很多有用的數(shù)據(jù)都放在一個(gè)共同的父節(jié)點(diǎn)上,只是其子節(jié)點(diǎn)不同。在上次爬蟲(chóng)中,每一類(lèi)數(shù)據(jù)都要從其父類(lèi)(包括其父節(jié)點(diǎn)的父節(jié)點(diǎn))上往下尋找ROI數(shù)據(jù)所在的子節(jié)點(diǎn),這樣就會(huì)使爬蟲(chóng)很臃腫,因?yàn)楹芏鄶?shù)據(jù)有相同的父節(jié)點(diǎn),每次都要重復(fù)的找到這個(gè)父節(jié)點(diǎn)。這樣的爬蟲(chóng)效率很低。

因此,筆者在上次的基礎(chǔ)上,改進(jìn)了一下爬取的策略,筆者以實(shí)例來(lái)描述。

python爬蟲(chóng)之爬取百度音樂(lè)的實(shí)現(xiàn)方法_第1張圖片

如圖,筆者此次爬取的是百度音樂(lè)的頁(yè)面,所爬取的類(lèi)容是上面榜單下的所有內(nèi)容(歌曲名,歌手,排名)。如果按照上次的爬蟲(chóng)的方法便要寫(xiě)上三個(gè)select方法,分別抓取歌曲名,歌手,排名,但筆者觀察得知這三項(xiàng)數(shù)據(jù)皆放在一個(gè)li標(biāo)簽內(nèi),如圖:

python爬蟲(chóng)之爬取百度音樂(lè)的實(shí)現(xiàn)方法_第2張圖片

這樣我們是不是直接抓取ul標(biāo)簽,再分析其中的數(shù)據(jù)便可得到全部數(shù)據(jù)了?答案是,當(dāng)然可以。

但Beaufulsoup不能直接提供這樣的方法,但Python無(wú)所不能,python里面自帶的re模塊是我見(jiàn)過(guò)最迷人的模塊之一。它能在字符串中找到我們讓我們r(jià)oi的區(qū)域,上述的li標(biāo)簽中包含了我們需要的歌曲名,歌手,排名數(shù)據(jù),我們只需要在li標(biāo)簽中通過(guò)re.findall()方法,便可找到我們需要的數(shù)據(jù)。這樣就能夠大大提升我們爬蟲(chóng)的效率。

我們先來(lái)直接分析代碼:

            
def parse_one_page(html): 
 soup = BeautifulSoup(html, 'lxml') 
 data = soup.select('div.ranklist-wrapper.clearfix div.bd ul.song-list li') 
 pattern1 = re.compile(r'
            
              (.*?)
            
          
.*?title="(.*?)".*?title="(.*?)".*?', re.S) pattern2 = re.compile(r' (.*?)
.*?title="(.*?)".*?target="_blank">(.*?)', re.S) wants = [] for item in data: # print(item) final = re.findall(pattern1, str(item)) if len(final) == 1: # print(final[0]) wants.append(final[0]) else: other = re.findall(pattern2, str(item)) # print(other[0]) wants.append(other[0]) return wants

上面的代碼是我分析網(wǎng)頁(yè)數(shù)據(jù)的全部代碼,這里不得不說(shuō)python語(yǔ)言的魅力,數(shù)十行代碼便能完成java100行的任務(wù),C/C++1000行的任務(wù)。上述函數(shù)中,筆者首先通過(guò)Beautifulsoup得到該網(wǎng)頁(yè)的源代碼,再通過(guò)select()方法得到所有l(wèi)i標(biāo)簽中的數(shù)據(jù)。

到這里,這個(gè)爬蟲(chóng)便要進(jìn)入到最重要的環(huán)節(jié)了,相信很多不懂re模塊的童靴們有點(diǎn)慌張,在這里筆者真的是強(qiáng)烈推薦對(duì)python有興趣的童靴們一定要學(xué)習(xí)這個(gè)非常重要的一環(huán)。首先,我們知道re的方法大多只針對(duì)string型數(shù)據(jù),因此我們調(diào)用str()方法將每個(gè)list中的數(shù)據(jù)(即item)轉(zhuǎn)換為string型。然后便是定義re的pattern了,這是個(gè)稍顯復(fù)雜的東西,其中主要用到re.compile()函數(shù)得到要在string中配對(duì)的pattern,這里筆者便不累述了,感興趣的童靴可以去網(wǎng)上查閱一下資料。

上述代碼中,筆者寫(xiě)了兩個(gè)pattern,因?yàn)榘俣纫魳?lè)的網(wǎng)頁(yè)里,li標(biāo)簽有兩個(gè)結(jié)構(gòu),當(dāng)用一個(gè)pattern在li中找不到數(shù)據(jù)時(shí),便使用另一個(gè)pattern。關(guān)于re.findadd()方法,它會(huì)返回一個(gè)list,里面裝著tuple,但其實(shí)我們知道我們找到的數(shù)據(jù)就是list[0],再將每個(gè)數(shù)據(jù)添加到另一個(gè)List中,讓函數(shù)返回。

相信很多看到這里的小伙伴已經(jīng)云里霧里,無(wú)奈筆者對(duì)re板塊也知道的不多,對(duì)python感興趣的同學(xué)可以查閱相關(guān)資料再來(lái)看一下代碼,相信能夠如魚(yú)得水。

完整的代碼如下:

        
import requests 
from bs4 import BeautifulSoup 
import re 
 
 
def get_one_page(url): 
 wb_data = requests.get(url) 
 wb_data.encoding = wb_data.apparent_encoding 
 if wb_data.status_code == 200: 
  return wb_data.text 
 else: 
  return None 
 
 
def parse_one_page(html): 
 soup = BeautifulSoup(html, 'lxml') 
 data = soup.select('div.ranklist-wrapper.clearfix div.bd ul.song-list li') 
 pattern1 = re.compile(r'
        
          (.*?)
        
      
.*?title="(.*?)".*?title="(.*?)".*?', re.S) pattern2 = re.compile(r' (.*?)
.*?title="(.*?)".*?target="_blank">(.*?)', re.S) wants = [] for item in data: # print(item) final = re.findall(pattern1, str(item)) if len(final) == 1: # print(final[0]) wants.append(final[0]) else: other = re.findall(pattern2, str(item)) # print(other[0]) wants.append(other[0]) return wants if __name__ == '__main__': url = 'http://music.baidu.com/' html = get_one_page(url) data = parse_one_page(html) for item in data: dict = { '序列': item[0], '歌名': item[1], '歌手': item[2] } print(dict)

更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 澳门| 叙永县| 峡江县| 封丘县| 武夷山市| 克什克腾旗| 石渠县| 宁强县| 平度市| 通州区| 梧州市| 高密市| 扬中市| 辽阳市| 阳泉市| 山东省| 东平县| 平江县| 延津县| 桃源县| 苍南县| 镶黄旗| 高要市| 浦江县| 湘西| 郧西县| 望都县| 大兴区| 微博| 珲春市| 富源县| 蓬安县| 色达县| 通化市| 柘城县| 兰考县| 祁门县| 临城县| 山东省| 桐城市| 宿迁市|