詳解使用Selenium爬取豆瓣電影前100的愛情片相關信息
什麼是Selenium
Selenium是一個用於測試網站的自動化測試工具,支持各種瀏覽器包括Chrome、Firefox、Safari等主流界面瀏覽器,同時也支持phantomJS無界面瀏覽器。
1.準備工作
由於Selenium的環境配置過程比較繁瑣,我會盡可能詳細的對其進行講解。
1.1 安裝Selenium
由於Selenium的環境配置過程比較繁瑣,我會多花一些篇幅對其進行講解。可以在cmd命令框輸入以下內容安裝Selenium庫。
pip install Selenium
1.2 瀏覽器驅動安裝
Selenium的使用必須有相應瀏覽器的webdriver,以Chrome瀏覽器為例,可以在這個鏈接查看自己的瀏覽器對應的Chromedriver的版本。
1.3 環境變量添加
設置瀏覽器的地址非常簡單。 我們可以手動創建一個存放瀏覽器驅動的目錄, , 將下載的瀏覽器驅動文件丟到該目錄下。然後在我的電腦–>屬性–>系統設置–>高級–>環境變量–>系統變量–>Path,將該目錄添加到Path的值中。如果配置變量有問題,可以參照這個鏈接
註意,如果系統報錯為:
selenium.common.exceptions.SessionNotCreatedException: Message: session not created:This version of ChromeDriver only supports Chrome version***
表示當前下載的Chromedriver的版本與自己瀏覽器的版本無法對應,可以通過Chrome的幫助查看自己的瀏覽器版本
1.4 小試牛刀
接下來就可以測試我們的selenium是不是可以正常使用瞭,以一個簡單的例子開始:驅動瀏覽器打開百度。
from selenium import webdriver url='https://www.baidu.com/' browser=webdriver.Chrome() browser.get(url)
如果到這裡都沒有問題的話,就已經可以開始進行下一步瞭。
2.相關步驟
2.1 引入相關模塊
首先導入本次爬蟲任務需要的相關庫:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.desired_capabilities import DesiredCapabilities import time
其中selenium.webdriver.common.by 主要用於搜尋網頁元素的id信息,用於定位按鈕、輸入框之類的元素,WebDriverWait主要是用於等待網頁響應完成,因為網頁沒有完全加載,就使用find_elements_by_**等方法,就會出現找不到對應元素的情況。
2.2 獲取信息
movies=browser.find_elements_by_class_name('movie-name-text') names=[] for item in movies: if item.text!='': names.append(item.text)
其中find_elements_by_class_name就是通過查找class_name來鎖定影片名稱這個信息。
審查元素後右鍵即可Copy這個元素的JS path,selector等信息,可以鎖定這個元素及其類似的其他元素的信息。以‘霸王別姬’這部影片為例,他的selector就是#content > div > div.article > div.movie-list-panel.pictext > div:nth-child(1) > div > div > div.movie-name > span.movie-name-text > a
那麼就可以用下面的代碼來鎖定影片名稱。
movies=browser.find_elements_by_class_name('#content > div > div.article > div.movie-list-panel.pictext > div:nth-child(1) > div > div > div.movie-name > span.movie-name-text > a')
2.3 設置等待時間
前面已經說過,如果頁面還沒有完全加載出,我們就進行元素的查找,返回的很可能是空列表,所以我們需要設置等待時間。
這裡就涉及到顯示等待和隱式等待的區別。
2.3.1 顯式等待
每隔一段時間檢測一次當前頁面元素是否存在,如果超過設置時間檢測不到則拋出異常(TimeoutException)代碼格式:WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
2.3.2 隱式等待
隱式等待是通過一定的時長等待頁面上某個元素加載完成。如果超出瞭設置的時長元素還沒有被加載,則拋出NoSuchElementException異常。
操作如下:implicitly_wait()
當使用瞭隱式等待執行測試的時候,如果 WebDriver沒有在 DOM中找到元素,將繼續等待,超出設定時間後則拋出找不到元素的異常換句話說,當查找元素或元素並沒有立即出現的時候,隱式等待將等待一段時間再查找 DOM,默認的時間是0,一旦設置瞭隱式等待,則它存在整個 WebDriver 對象實例的聲明周期中,隱式的等到會讓一個正常響應的應用的測試變慢,它將會在尋找每個元素的時候都進行等待,這樣會增加整個測試執行的時間。我們這裡使用的就是隱式等待。
def get_page(): browser.implicitly_wait(10) for i in range(50): time.sleep(0.3) browser.execute_script('window.scrollTo(0,document.body.scrollHeight)') print('正在下滑第{}次'.format(i)) print('-------------') #time.sleep(10) print("*****請等待幾秒*****") time.sleep(10) when=wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'#content > div > div.article > div.movie-list-panel.pictext > div:nth-child(380) > div > a > img')))
2.3.3 強制等待(補充)
強制等待就是使用python自帶的time模塊,設置等待時間,操作如下:time.sleep(time)一般可以用強制等待來限制計算機頻繁訪問目標鏈接導致驗證問題。
2.4 頁面自動下滑
頁面下滑過程比較簡單,不多贅述。其實現過程如下:
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')#下滑操作
2.5 保存文件
爬取出的數據是列表形式,使用pandas的to_csv方法就可以保存到本地瞭。
rate,miscs,actor_list,ranks,playable_sign,names=get_page() datas=pd.DataFrame({'names':names,'rank':ranks,'分類':miscs,'評分':rate}) try: datas.to_csv('機器學習\爬蟲\douban_0327.csv',encoding='utf_8_sig') print("保存成功") print(datas)
3.完整代碼
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.desired_capabilities import DesiredCapabilities import pandas as pd import time url='https://movie.douban.com/typerank?type_name=愛情片&type=13&interval_id=100:90&action=' options=webdriver.ChromeOptions() options.add_argument('lang=zh_CN.UTF-8') options.add_argument('user-agent="Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"') browser=webdriver.Chrome() browser.get(url) wait=WebDriverWait(browser,10) def get_page(): browser.implicitly_wait(10) for i in range(50): time.sleep(0.3) browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')#下滑操作 print('正在下滑第{}次'.format(i)) print('-------------') #time.sleep(10) print("*****請等待幾秒*****") time.sleep(10) when=wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'#content > div > div.article > div.movie-list-panel.pictext > div:nth-child(380) > div > a > img'))) #----------------------------------------------------------------- movies=browser.find_elements_by_class_name('movie-name-text') names=[] for item in movies: if item.text!='': names.append(item.text) print("爬取成功") print(len(names)) #--------------------------------------------------------------- playables=browser.find_elements_by_class_name('playable-sign') playable_sign=[] for sign in playables: if sign.text!='': playable_sign.append(sign.text) print('爬取成功') print(len(playable_sign)) #------------------------------------------------------------ rank_names=browser.find_elements_by_class_name('rank-num') ranks=[] for rank in rank_names: if rank.text!='': ranks.append(rank.text) print('爬取成功') print(len(ranks)) #--------------------------------------------------------- actors=browser.find_elements_by_class_name('movie-crew') actor_list=[] for actor in actors: if actor.text!='': actor_list.append(actor.text) print('爬取成功') print(len(actor_list)) #---------------------------------------------------------- clasic=browser.find_elements_by_class_name('movie-misc') miscs=[] for misc in clasic: if misc.text!='': miscs.append(misc.text) print('爬取成功') print(len(miscs)) #----------------------------------------------------------- rates=browser.find_elements_by_class_name('movie-rating') rate=[] for score in rates: if score.text!='': rate.append(score.text) print('爬取成功') print(len(rate)) #----------------------------------------------------------- ''' links=browser.find_elements_by_class_name('movie-content') for link in links: link_img=link.get_attribute('data-original') print(link_img) ''' return rate,miscs,actor_list,ranks,playable_sign,names if __name__ == "__main__": rate,miscs,actor_list,ranks,playable_sign,names=get_page() datas=pd.DataFrame({'names':names,'rank':ranks,'分類':miscs,'評分':rate}) try: datas.to_csv('機器學習\爬蟲\douban_0327.csv',encoding='utf_8_sig') print("保存成功") print(datas) except: print('保存失敗')
到此這篇關於詳解使用Selenium爬取豆瓣電影前100的愛情片相關信息的文章就介紹到這瞭,更多相關Selenium爬取豆瓣電影內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python爬蟲之Selenium庫的使用方法
- python+selenium對table表和分頁處理
- Python中selenium庫的用法詳解
- python基於selenium爬取鬥魚彈幕
- python Web應用程序測試selenium庫使用用法詳解