爬蟲之selenium模塊
阿新 • • 發佈:2019-01-26
cto .cn nload browser 無法 filename document exe try
引入
selenium最初是一個自動化測試工具,而爬蟲中使用它主要是為了解決requests無法直接執行JavaScript代碼的問題
selenium本質是通過驅動瀏覽器,完全模擬瀏覽器的操作,比如跳轉、輸入、點擊、下拉等,來拿到網頁渲染之後的結果,可支持多種瀏覽器
from selenium import webdriver browser=webdriver.Chrome() browser=webdriver.Firefox() browser=webdriver.PhantomJS() browser=webdriver.Safari() browser=webdriver.Edge()
官網:http://selenium-python.readthedocs.io
安裝
安裝selenium:pip install selenium
下載驅動瀏覽器驅動:
有界面瀏覽器:Chrome ,Firefox(geckodriver)
無界面瀏覽器:PhantomJS
驗證:
from selenium import webdriver driver=webdriver.Chrome() # 彈出谷歌瀏覽器 driver.get(‘https://www.baidu.com‘) driver.page_source
基本使用
fromselenium import webdriver from selenium.webdriver.common.by import By #按照什麽方式查找 ID/CSS from selenium.webdriver.common.keys import Keys #鍵盤按鍵操作 from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait #等待頁面加載某些元素 import time browser=webdriver.Chrome() try: browser.get(‘https://www.jd.com‘) input_tag=browser.find_element_by_id(‘key‘) input_tag.send_keys(‘電腦‘) input_tag.send_keys(Keys.ENTER) wait=WebDriverWait(browser,10) wait.until(EC.presence_of_element_located((By.ID,‘J_goodsList‘))) #等到id為J_goodsList的元素加載完畢,最多等10秒 # time.sleep(3) finally: browser.close()
元素定位
尋找元素主要有兩種:
find_element_ # 只匹配一個元素 find_elements_ # 匹配所有元素的列表
如果沒有匹配到元素,selenium模塊會拋出NoSuchElement異常
獲取到了WebElement對象,則可以獲取對象的屬性
延時等待
selenium只是模擬瀏覽器的行為,而瀏覽器解析頁面是需要時間的(執行css,js),一些元素可能需要過一段時間才能加載出來,為了保證能查找到元素,必須等待
等待的方式分兩種:
隱式等待:在browser.get(‘xxx‘)前就設置,針對所有元素有效
from selenium import webdriver from selenium.webdriver.common.by import By #按照什麽方式查找,By.ID,By.CSS_SELECTOR from selenium.webdriver.common.keys import Keys #鍵盤按鍵操作 from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait #等待頁面加載某些元素 browser=webdriver.Chrome() #隱式等待:在查找所有元素時,如果尚未被加載,則等10秒 browser.implicitly_wait(10) browser.get(‘https://www.baidu.com‘) input_tag=browser.find_element_by_id(‘kw‘) input_tag.send_keys(‘美女‘) input_tag.send_keys(Keys.ENTER) contents=browser.find_element_by_id(‘content_left‘) #沒有等待環節而直接查找,找不到則會報錯 print(contents) browser.close()隱式等待
顯式等待:在browser.get(‘xxx‘)之後設置,只針對某個元素有效
from selenium import webdriver from selenium.webdriver.common.by import By #按照什麽方式查找,By.ID,By.CSS_SELECTOR from selenium.webdriver.common.keys import Keys #鍵盤按鍵操作 from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait #等待頁面加載某些元素 browser=webdriver.Chrome() browser.get(‘https://www.baidu.com‘) input_tag=browser.find_element_by_id(‘kw‘) input_tag.send_keys(‘美女‘) input_tag.send_keys(Keys.ENTER) # 顯式等待:顯式地等待某個元素被加載 wait=WebDriverWait(browser,10) wait.until(EC.presence_of_element_located((By.ID,‘content_left‘))) contents=browser.find_element(By.CSS_SELECTOR,‘#content_left‘) print(contents) browser.close()顯示等待
元素交互操作
from selenium import webdriver import time browser = webdriver.Chrome() browser.get(‘https://www.taobao.com‘) input = browser.find_element_by_id(‘q‘) input.send_keys(‘諾基亞‘) time.sleep(1) input.clear() input.send_keys(‘IPhone‘) button = browser.find_element_by_class_name(‘btn-search‘) time.sleep(2) button.click()輸入,清空
from selenium import webdriver from selenium.webdriver import ActionChains import time browser = webdriver.Chrome() url = ‘http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable‘ browser.get(url) browser.switch_to.frame(‘iframeResult‘) source = browser.find_element_by_css_selector(‘#draggable‘) target = browser.find_element_by_css_selector(‘#droppable‘) actions = ActionChains(browser) # actions.drag_and_drop(source, target) actions.click_and_hold(source).perform() time.sleep(1) actions.move_to_element(target).perform() time.sleep(1) actions.move_by_offset(xoffset=50,yoffset=0).perform() actions.release()拖拽操作
from selenium import webdriver browser = webdriver.Chrome() browser.get(‘https://www.jd.com/‘) browser.execute_script(‘window.scrollTo(0, document.body.scrollHeight)‘) browser.execute_script(‘alert("123")‘)執行JavaScript
from selenium import webdriver from selenium.webdriver.common.by import By #按照什麽方式查找,By.ID,By.CSS_SELECTOR from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait #等待頁面加載某些元素 browser=webdriver.Chrome() browser.get(‘https://www.amazon.cn/‘) wait=WebDriverWait(browser,10) wait.until(EC.presence_of_element_located((By.ID,‘cc-lm-tcgShowImgContainer‘))) tag=browser.find_element(By.CSS_SELECTOR,‘#cc-lm-tcgShowImgContainer img‘) #獲取標簽屬性, print(tag.get_attribute(‘src‘)) #獲取標簽ID,位置,名稱,大小(了解) print(tag.id) print(tag.location) print(tag.tag_name) print(tag.size) browser.close()獲取節點信息
其他操作
import time from selenium import webdriver browser=webdriver.Chrome() browser.get(‘https://www.baidu.com‘) browser.get(‘https://www.taobao.com‘) browser.get(‘http://www.peng104.xyz‘) browser.back() time.sleep(10) browser.forward() browser.close()模擬瀏覽器前進後臺
from selenium import webdriver browser=webdriver.Chrome() browser.get(‘https://www.zhihu.com/explore‘) print(browser.get_cookies()) browser.add_cookie({‘k1‘:‘xxx‘,‘k2‘:‘yyy‘}) print(browser.get_cookies()) # browser.delete_all_cookies()cookies
import time from selenium import webdriver browser=webdriver.Chrome() browser.get(‘https://www.baidu.com‘) browser.execute_script(‘window.open()‘) print(browser.window_handles) #獲取所有的選項卡 browser.switch_to_window(browser.window_handles[1]) browser.get(‘https://www.taobao.com‘) time.sleep(10) browser.switch_to_window(browser.window_handles[0]) browser.get(‘http://www.peng104.xyz‘) browser.close()選項卡管理
from selenium import webdriver from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException try: browser=webdriver.Chrome() browser.get(‘http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable‘) browser.switch_to.frame(‘iframssseResult‘) except TimeoutException as e: print(e) except NoSuchFrameException as e: print(e) finally: browser.close()異常處理
來個小栗子
from selenium import webdriver # 初始化driver driver = webdriver.Chrome() # 打開知乎登錄頁面 driver.get(‘https://www.zhihu.com/signup‘) # 默認是註冊界面,這裏需要先找到切換登錄的按鈕 signup_switch_bt = driver.find_element_by_xpath(‘//*[@id="root"]/div/main/div/div/div/div[2]/div[2]/span‘) # 如果內容顯示登錄,則證明在註冊頁面,需要點擊一下切換到登錄頁面 if signup_switch_bt.text == ‘登錄‘: signup_switch_bt.click() # 找到填寫用戶名的輸入框 uname_textfield = driver.find_element_by_xpath( ‘//*[@id="root"]/div/main/div/div/div/div[2]/div[1]/form/div[1]/div[2]/div[1]/input‘) # 找到填寫密碼的輸入框 pwd_textfield = driver.find_element_by_xpath( ‘//*[@id="root"]/div/main/div/div/div/div[2]/div[1]/form/div[2]/div/div[1]/input‘) # 找到登錄按鈕 signup_bt = driver.find_element_by_xpath(‘//*[@id="root"]/div/main/div/div/div/div[2]/div[1]/form/button‘) # 填寫用戶名,需要替換為你的用戶名 uname_textfield.send_keys(‘user_name‘) # 填寫密碼,需要替換為你的密碼 pwd_textfield.send_keys(‘your_password‘) # 點擊登錄 signup_bt.click()自動登錄知乎
爬蟲之selenium模塊