欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python爬蟲之爬取百度音樂的實現方法

系統 1980 0

在上次的爬蟲中,抓取的數據主要用到的是第三方的Beautifulsoup庫,然后對每一個具體的數據在網頁中的selecter來找到它,每一個類別便有一個select方法。對網頁有過接觸的都知道很多有用的數據都放在一個共同的父節點上,只是其子節點不同。在上次爬蟲中,每一類數據都要從其父類(包括其父節點的父節點)上往下尋找ROI數據所在的子節點,這樣就會使爬蟲很臃腫,因為很多數據有相同的父節點,每次都要重復的找到這個父節點。這樣的爬蟲效率很低。

因此,筆者在上次的基礎上,改進了一下爬取的策略,筆者以實例來描述。

python爬蟲之爬取百度音樂的實現方法_第1張圖片

如圖,筆者此次爬取的是百度音樂的頁面,所爬取的類容是上面榜單下的所有內容(歌曲名,歌手,排名)。如果按照上次的爬蟲的方法便要寫上三個select方法,分別抓取歌曲名,歌手,排名,但筆者觀察得知這三項數據皆放在一個li標簽內,如圖:

python爬蟲之爬取百度音樂的實現方法_第2張圖片

這樣我們是不是直接抓取ul標簽,再分析其中的數據便可得到全部數據了?答案是,當然可以。

但Beaufulsoup不能直接提供這樣的方法,但Python無所不能,python里面自帶的re模塊是我見過最迷人的模塊之一。它能在字符串中找到我們讓我們roi的區域,上述的li標簽中包含了我們需要的歌曲名,歌手,排名數據,我們只需要在li標簽中通過re.findall()方法,便可找到我們需要的數據。這樣就能夠大大提升我們爬蟲的效率。

我們先來直接分析代碼:

            
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

上面的代碼是我分析網頁數據的全部代碼,這里不得不說python語言的魅力,數十行代碼便能完成java100行的任務,C/C++1000行的任務。上述函數中,筆者首先通過Beautifulsoup得到該網頁的源代碼,再通過select()方法得到所有li標簽中的數據。

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

上述代碼中,筆者寫了兩個pattern,因為百度音樂的網頁里,li標簽有兩個結構,當用一個pattern在li中找不到數據時,便使用另一個pattern。關于re.findadd()方法,它會返回一個list,里面裝著tuple,但其實我們知道我們找到的數據就是list[0],再將每個數據添加到另一個List中,讓函數返回。

相信很多看到這里的小伙伴已經云里霧里,無奈筆者對re板塊也知道的不多,對python感興趣的同學可以查閱相關資料再來看一下代碼,相信能夠如魚得水。

完整的代碼如下:

        
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)

更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久综合综合久久 | av在线官网 | 国产原创91 | 日本欧美国产精品第一页久久 | 午夜免费福利视频 | 午夜剧场操一操 | 国产精品男人的天堂 | 国内精品一区二区 | 免费一级欧美性大片 | 欧美午夜影院 | 日色视频| 99热这里都是国产精品 | 香蕉福利久久福利久久香蕉 | 婷婷丁香社区 | 91精品国产高清久久久久久91 | 久久草在线精品视频99 | 污网站在线免费看 | 久草免费在线播放 | 亚欧乱色视频小说 | 成人永久免费 | 国产精品久久久久久久久久红粉 | 曰批全过程40分钟免费视频多人 | 欧美一级在线免费 | 亚洲一区二区在线视频 | 欧美成人精品第一区首页 | 激情五月色综合婷婷大片 | 日本免费高清一区 | 日韩精品欧美一区二区三区 | 成人在线观看免费视频 | 波多野结衣免费视频观看 | 日韩字幕无线乱码 | 亚洲特一级毛片 | 亚洲国产日韩欧美高清片a 高清视频在线播放 | 一级黄色a视频 | 女人一级毛片免费视频观看 | 亚洲 中文 欧美 日韩 在线观看 | 99热这里只有精品久久免费 | 美女爽到呻吟久久久久 | 香港三级午夜理伦三级 | 国产亚洲精品日韩香蕉网 | 亚洲午夜在线视频 |