摘要:其次,使用后,還需要針對做特定處理。看到這就可以構想一下爬蟲的爬取邏輯了。
運行環境
我的運行環境如下:
系統版本
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:DTheBeatles" #想要存放的文件目錄 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()
執行結果:
看看文件夾里面什么樣:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105643.html
摘要:其次,使用后,還需要針對做特定處理。看到這就可以構想一下爬蟲的爬取邏輯了。 運行環境 我的運行環境如下: 系統版本 Windows10。 Python版本 Python3.5,推薦使用Anaconda 這個科學計算版本,主要是因為它自帶一個包管理工具,可以解決有些包安裝錯誤的問題。去Anaconda官網,選擇Python3.5版本,然后下載安裝。 IDE 我使用的是PyCharm,是專...
摘要:完整代碼如下正在下載根據網易云歌曲的直接下載歌曲上安裝爬取網易云歌曲源碼地址 首發知乎:https://zhuanlan.zhihu.com/p/... 目標 偶然的一次機會聽到了房東的貓的《云煙成雨》,瞬間迷上了這慵懶的嗓音和學生氣的歌詞,然后一直去循環聽她們的歌。然后還特意去刷了動漫《我是江小白》,好期待第二季... 我多想在見你,哪怕匆匆一眼就別離... 好了,不說廢話了。這次...
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
摘要:通常這種加密都是通過加密的,所以首先要找到這個有加密算法的。追蹤函數,發現它指向一個叫的函數,仔細研究許久后大概知道加密算法經兩次加密獲得,模式為,偏移量為。 前言 某寶評論區已經成功爬取了,jd的也是差不多的方法,說實話也沒什么好玩的,我是看上它們分析簡單,又沒加密才拿來試手的。如果真的要看些有趣的評論的話,我會選擇網易云音樂,里面匯聚了哲學家,小說家,story-teller,皮皮...
閱讀 2025·2023-04-26 00:16
閱讀 3474·2021-11-15 11:38
閱讀 3167·2019-08-30 12:50
閱讀 3178·2019-08-29 13:59
閱讀 749·2019-08-29 13:54
閱讀 2496·2019-08-29 13:42
閱讀 3304·2019-08-26 11:45
閱讀 2186·2019-08-26 11:36