相對於其他靜態網頁常規爬蟲,iframe嵌入式導致我們無法直接獲取iframe內的數據,因此,我使用了seleinum中的.
switch_to.frame()方法 直接定位到對應的iframe內,便可以直接爬取數據了。
下面我就直接展示全部代碼了,主要邏輯思維,我都有註釋:
# author:aspiring
from selenium import webdriver
import json
class Music163_Spider:
def __init__(self):
self.start_url = "https://music.163.com/#/discover/toplist" #1.start_url
self.driver = webdriver.Chrome() # 實例化一個瀏覽器
def get_content_list(self): #3.提取數據
li_list = self.driver.find_elements_by_xpath("//tbody/tr")
content_list = []
for li in li_list:
item = {}
item["num"] = li.find_element_by_xpath(".//span[@class='num']").text
item["songer"] = li.find_element_by_xpath(".//div[@class='text']").get_attribute("title")
item["song"] = li.find_element_by_xpath(".//b").get_attribute("title")
item["song_time"] = li.find_element_by_xpath(".//span[@class='u-dur ']").text
print(item)
content_list.append(item)
return content_list
def save_content_list(self, content_list): #4.保存
with open("files/music163.txt", "w", encoding="utf-8") as f:
for content in content_list:
f.write(json.dumps(content, ensure_ascii=False, indent=2))
f.write("\n")
print("保存成功")
def run(self): # 實現主要邏輯
# 1.start_url
# 2.發送請求,獲取響應
self.driver.get(self.start_url)
self.driver.switch_to.frame("g_iframe") # 切換到iframe
# 3.提取數據
content_list = self.get_content_list()
# 4.保存
self.save_content_list(content_list)
# 退出實例瀏覽器
self.driver.quit()
if __name__ == '__main__':
music163 = Music163_Spider()
music163.run()
而實現的爬取iframe內的數據中重要的一點便是,在#2.發送請求,獲取響應之後,要切換到iframe內,然後再執行#3.提取數據
# 2.發送請求,獲取響應
self.driver.get(self.start_url)
self.driver.switch_to.frame("g_iframe") # 切換到iframe (括號內爲id屬性)
# 3.提取數據
content_list = self.get_content_list()