1. 程式人生 > >爬蟲之selenium模塊

爬蟲之selenium模塊

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

基本使用

from
selenium 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模塊