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

python爬蟲學習教程,爬取網易云音樂!

系統 1787 0

運行環境

我的運行環境如下:

系統版本

Windows10。

Python版本

Python3.5,推薦使用Anaconda 這個科學計算版本,主要是因為它自帶一個包管理工具,可以解決有些包安裝錯誤的問題。去Anaconda官網,選擇Python3.5版本,然后下載安裝。

IDE

我使用的是PyCharm,是專門為Python開發的IDE。這是JetBrians的產品

實戰

上面提到過,網易云音樂的網頁跟普通的網頁相比主要有兩點不同:

網頁是 js 動態加載的

使用了iframe框架

所以,

首先,網頁請求不能使用requests庫,需要使用Selenium + PhatomJS。

其次,使用Selenium + PhatomJS后,還需要針對 iframe 做特定處理。

廢話不多說,看實際操作步驟:

廢話不多說,看實際操作步驟:
首先打開網頁 http://music.163.com

在右上角的搜索框中輸入“The Beatles”,然后會有一個下拉選項,選擇歌手 The Beatles (紅框中的內容)。

然后看到如下頁面,選擇紅框中的“所有專輯”,點擊。

這樣就會看見所有的專輯列表,以及下方的翻頁按鈕。

我們需要的就是所有專輯的圖片、專輯名和專輯出版時間。看到這就可以構想一下爬蟲的爬取邏輯了。定位到該頁面,然后獲取頁碼,然后挨個請求頁面來爬取頁面中的內容。

點擊一下翻頁按鈕看看url 有沒有什么規律。

點擊第二頁后,看到上面的地址欄!!!看到這個地址欄我都懶得翻頁了。。。

limit 參數是限制一個頁面加載專輯的個數

offset 參數是前面過濾多少個專輯,現在是一頁12個專輯,所以第二頁是offset=12,第三頁offset=24,以此類推。。。

一共9頁,一頁12個,也不到120個。So... ... 改一下url 就不用翻頁了!!

limit 參數等于120,offset 參數 等于0,就搞定了!輸入下面的url,看看是不是所有的專輯都加載出來了。

          
            http://music.163.com/#/artist/album?id=101988&limit=120&offset=0

          
        

下面就開始爬蟲代碼了。
這里我們會用到上一篇博文中寫好的幾個工具方法:

          
            '''
在學習過程中有什么不懂得可以加我的
python學習交流扣扣qun,934109170
群里有不錯的學習教程、開發工具與電子書籍。
與你分享python企業當下人才需求及怎么從零基礎學習好python,和學習什么內容。
'''
    def save_img(self, url, file_name): ##保存圖片
        print('開始請求圖片地址,過程會有點長...')
        img = self.request(url)
        print('開始保存圖片')
        f = open(file_name, 'ab')
        f.write(img.content)
        print(file_name,'圖片保存成功!')
        f.close()
 
    def request(self, url):  #封裝的requests 請求
        r = requests.get(url)  # 像目標url地址發送get請求,返回一個response對象。有沒有headers參數都可以。
        return r
 
    def mkdir(self, path):  ##這個函數創建文件夾
        path = path.strip()
        isExists = os.path.exists(path)
        if not isExists:
            print('創建名字叫做', path, '的文件夾')
            os.makedirs(path)
            print('創建成功!')
            return True
        else:
            print(path, '文件夾已經存在了,不再創建')
            return False
 
    def get_files(self, path): #獲取文件夾中的文件名稱列表
        pic_names = os.listdir(path)
        return pic_names
          
        

OK, 開始我們的爬蟲邏輯部分:

這里值得注意的是,該頁面使用frame 框架,使用Selenium + PhantomJS 后并不會加載iframe 框架中的網頁內容。iframe 框架相當于在頁面中又加載了一個頁面,需要使用Selenium 的 switch_to.frame() 方法加載(官網給的方法是switch_to_frame(),但是IDE提醒使用前面的方法替代該方法)。

看下面的網頁結構,iframe的id是“g_iframe”:

加載 iframe 框架中的內容:

          
            
driver = webdriver.PhantomJS()
driver.get(self.init_url)
driver.switch_to.frame("g_iframe")
html = driver.page_source
          
        

然后找到所有的封面元素:

根據上圖的網頁結構可以看出,所有的專輯信息都在ul 標簽里面,每一個專輯在一個li 標簽里。li 標簽中包含了圖片url、專輯名字、以及專輯時間。

抓取其中的內容就好了。

          
            
all_li = BeautifulSoup(html, 'lxml').find(id='m-song-module').find_all('li')
 
for li in all_li:
    album_img = li.find('img')['src']
    album_name = li.find('p', class_='dec')['title']
    album_date = li.find('span', class_='s-fc3').get_text()
          
        

這里獲取到的圖片url 依然是有圖片寬高參數的,所以要過濾寬高參數:
http://p4.music.126.net/pLA1G...

把問號后面的參數過濾掉:

          
            end_pos = album_img.index('?')  #找到問號的位置
album_img_url = album_img[:end_pos]  #截取問號之前的內容
          
        

圖片命名邏輯:專輯時間 + 專輯名。

專輯名可能有一些特殊字符,需要替換掉!

photo_name = album_date + ' - ' + album_name.replace('/','').replace(':',',') + '.jpg'

再使用上一篇博文例子中的去重邏輯,修改后的爬蟲邏輯部分如下:

          
            def spider(self):
        print("Start!")
        driver = webdriver.PhantomJS()
        driver.get(self.init_url)
        driver.switch_to.frame("g_iframe")
        html = driver.page_source
 
        self.mkdir(self.folder_path)  # 創建文件夾
        print('開始切換文件夾')
        os.chdir(self.folder_path)  # 切換路徑至上面創建的文件夾
 
        file_names = self.get_files(self.folder_path)  # 獲取文件夾中的所有文件名,類型是list
 
        all_li = BeautifulSoup(html, 'lxml').find(id='m-song-module').find_all('li')
        # print(type(all_li))
 
        for li in all_li:
            album_img = li.find('img')['src']
            album_name = li.find('p', class_='dec')['title']
            album_date = li.find('span', class_='s-fc3').get_text()
            end_pos = album_img.index('?')
            album_img_url = album_img[:end_pos]
 
            photo_name = album_date + ' - ' + album_name.replace('/','').replace(':',',') + '.jpg'
            print(album_img_url, photo_name)
 
            if photo_name in file_names:
                print('圖片已經存在,不再重新下載')
            else:
                self.save_img(album_img_url, photo_name)
          
        

其實相對于上篇博文的例子,這個爬蟲的邏輯部分還是挺簡潔的。

          
            from selenium import webdriver
from bs4 import BeautifulSoup
import requests
import os
class AlbumCover():
 
    def __init__(self):
        self.init_url = "http://music.163.com/#/artist/album?id=101988&limit=120&offset=0" #請求網址
        self.folder_path = "C:\D\TheBeatles" #想要存放的文件目錄
 
    def save_img(self, url, file_name):  ##保存圖片
        print('開始請求圖片地址,過程會有點長...')
        img = self.request(url)
        print('開始保存圖片')
        f = open(file_name, 'ab')
        f.write(img.content)
        print(file_name, '圖片保存成功!')
        f.close()
 
    def request(self, url):  # 封裝的requests 請求
        r = requests.get(url)  # 像目標url地址發送get請求,返回一個response對象。有沒有headers參數都可以。
        return r
 
    def mkdir(self, path):  ##這個函數創建文件夾
        path = path.strip()
        isExists = os.path.exists(path)
        if not isExists:
            print('創建名字叫做', path, '的文件夾')
            os.makedirs(path)
            print('創建成功!')
            return True
        else:
            print(path, '文件夾已經存在了,不再創建')
            return False
 
    def get_files(self, path):  # 獲取文件夾中的文件名稱列表
        pic_names = os.listdir(path)
        return pic_names
 
    def spider(self):
        print("Start!")
        driver = webdriver.PhantomJS()
        driver.get(self.init_url)
        driver.switch_to.frame("g_iframe")
        html = driver.page_source
 
        self.mkdir(self.folder_path)  # 創建文件夾
        print('開始切換文件夾')
        os.chdir(self.folder_path)  # 切換路徑至上面創建的文件夾
 
        file_names = self.get_files(self.folder_path)  # 獲取文件夾中的所有文件名,類型是list
 
        all_li = BeautifulSoup(html, 'lxml').find(id='m-song-module').find_all('li')
        # print(type(all_li))
 
        for li in all_li:
            album_img = li.find('img')['src']
            album_name = li.find('p', class_='dec')['title']
            album_date = li.find('span', class_='s-fc3').get_text()
            end_pos = album_img.index('?')
            album_img_url = album_img[:end_pos]
 
            photo_name = album_date + ' - ' + album_name.replace('/', '').replace(':', ',') + '.jpg'
            print(album_img_url, photo_name)
 
            if photo_name in file_names:
                print('圖片已經存在,不再重新下載')
            else:
                self.save_img(album_img_url, photo_name)
 
album_cover = AlbumCover()
album_cover.spider()
          
        

執行結果:

看看文件夾里面什么樣:


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 精品一区二区三区三区 | 国产视频99 | 日本一区二区视频 | jizz视频 | 国产精品岛国久久久久久 | 梦中人在线观看免费完整版 | 久久久一区二区 | 欧美 日本 国产 | 久久精品免费 | 日日日日干 | 国产女人与拘做受视频 | 国产亚洲综合一区二区在线 | free国产hd老熟bbw | 国产精品国产精品 | 日本AAAA片毛片免费观 | 日操夜操天天操 | 91国在线观看 | 魔法骑士在线观看免费完整版 | 国产欧美性综合视频性刺激 | 99精品在线观看 | 91视频精选 | 久久久人成影片一区二区三区 | 精品久久成人免费第三区 | 国产香港一级毛片在线看 | 成人福利视频网站 | 国产高清在线精品一区αpp | 亚洲狠狠干 | 尤物视频在线观看 | 5252sese| 欧美性生活区 | 双凤奇案| 亚洲欧洲日产国码在线观看 | 尤物国产在线精品福利一区 | 国产亚洲欧美另类第一页 | 欧美zozozo人禽交免费观看 | 成人18免费观看的软件 | 国产精品毛片一区二区三区 | 亚洲精品国产不卡在线观看 | 日韩三及片 | 国产一区网址 | 久久中字 |