selenium小專案實踐
阿新 • • 發佈:2018-12-03
1. 鬥魚爬蟲
爬取鬥魚直播平臺的所有房間資訊:https://www.douyu.com/directory/all
1.1 思路分析:
-
資料的位置
每個房間的資料都在
id=live-list-contentbox
的ul中 -
實現翻頁和控制程式結束
selenium中通過點選就可以實現翻頁,觀察存在下一頁和不存在下一頁時候標籤的變化
存在下一頁時:
不存在下一頁時:
1.2 參考程式碼
from selenium import webdriver import time class DouYu: def __init__(self): self.start_url = "https://www.douyu.com/directory/all" self.driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver') def get_content_list(self): #提取資料 li_list = self.driver.find_elements_by_xpath("//ul[@id='live-list-contentbox']/li") content_list = [] for li in li_list: item = {} item["title"] = li.find_element_by_xpath("./a").get_attribute("title") item["anchor"] = li.find_element_by_xpath(".//span[@class='dy-name ellipsis fl']").text item["watch_num"] = li.find_element_by_xpath(".//span[@class='dy-num fr']").text # print(item) content_list.append(item) #提取下一頁的元素 next_url = self.driver.find_elements_by_xpath("//a[@class='shark-pager-next']") next_url = next_url[0] if len(next_url)>0 else None return content_list,next_url def save_content_list(self,content_lsit):#儲存 for content in content_lsit: print(content) def run(self): #實現主要邏輯 #1. start_url #2. 傳送請求,獲取響應 self.driver.get(self.start_url) #3. 提取資料 content_list,next_url = self.get_content_list() #4.儲存 self.save_content_list(content_list) # 5. 下一頁資料的提取 while next_url is not None: next_url.click() #頁面沒有完全載入完,會報錯 time.sleep(3) content_list,next_url = self.get_content_list() self.save_content_list(content_list) if __name__ == '__main__': douyu = DouYu() douyu.run()
2. 網易雲音樂爬蟲
完成網易雲音樂的所有列表的名字和url地址 地址:http://music.163.com/#/discover/playlist
2.1 思路分析:
-
確定程式入口的位置
-
確定首頁資料的位置和url地址
-
實現翻頁和程式停止的判斷
2.2 參考程式碼
from selenium import webdriver import time class CloudMuisc(): def __init__(self): self.start_url = 'http://music.163.com/#/discover/playlist' self.driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver') def get_content_list(self): #提取資料 # 切入frame標籤 login_frame = self.driver.find_element_by_id('g_iframe') # 根據id定位 frame元素 self.driver.switch_to.frame(login_frame) # 轉向到該frame中 li_list = self.driver.find_elements_by_xpath('//*[@id="m-pl-container"]/li') print(len(li_list)) content_list = [] for li in li_list: item = {} item["title"] = li.find_element_by_class_name('msk').get_attribute("title") item["href"] = li.find_element_by_xpath('.//a').get_attribute("href") # print(item) content_list.append(item) #提取下一頁的元素 page_url_list = self.driver.find_elements_by_xpath('.//div[@class="u-page"]/a') next_url = page_url_list[-1] if len(page_url_list)>0 else None return content_list, next_url def save_content_list(self,content_lsit):#儲存 for content in content_lsit: print(content) def run(self): #實現主要邏輯 #1. start_url #2. 傳送請求,獲取響應 self.driver.get(self.start_url) time.sleep(3) #3. 提取資料 content_list, next_url = self.get_content_list() #4.儲存 self.save_content_list(content_list) # 5. 下一頁資料的提取 while next_url is not None: js = 'window.scrollTo(0,document.body.scrollHeight)' # js語句:滾動到頁面最底部 self.driver.execute_script(js) # 執行js的方法 print(next_url.get_attribute('href')) next_url.click() #頁面沒有完全載入完,會報錯 time.sleep(3) # 此時在iframe標籤中 程式碼邏輯需要我們先切出 windows = self.driver.window_handles self.driver.switch_to.window(windows[0]) content_list, next_url = self.get_content_list() self.save_content_list(content_list) # 6. 退出driver self.driver.quit() if __name__ == '__main__': spider = CloudMuisc() spider.run()