爬蟲之Selenium

簡介

selenium最初是一個自動化測試工具,而爬蟲中使用它主要是爲了解決requests沒法直接執行JavaScript代碼的問題 selenium本質是經過驅動瀏覽器,徹底模擬瀏覽器的操做,好比跳轉、輸入、點擊、下拉等,來拿到網頁渲染以後的結果,可支持多種瀏覽器php

做用: 可讓瀏覽器完成相關自動化的操做css

和爬蟲的關聯:html

  • 模擬登錄
  • 能夠獲取動態加載的頁面數據

編碼流程:python

  • 導包
  • 實例化瀏覽器對象(驅動)
  • 制定相關自動化的行爲動做

環境安裝

  • 下載安裝selenium:pip install selenium
  • 下載瀏覽器驅動程序:
    • http://chromedriver.storage.googleapis.com/index.html
  • 查看驅動和瀏覽器版本的映射關係:
    • http://blog.csdn.net/huilan_same/article/details/51896672

簡單使用/效果展現

01:jquery

複製代碼
from selenium import webdriver
from time import sleep
bro = webdriver.Chrome(executable_path='./chromedriver.exe')  
bro.get('https://www.baidu.com')    #獲取的鏈接頁面
sleep(2)
#標籤訂位
tag_input = bro.find_element_by_id('kw')
tag_input.send_keys('人民幣')   #標籤中輸入值
sleep(2)

btn = bro.find_element_by_id('su')   
btn.click()  #標籤點擊事件
sleep(2)

bro.quit()  #退出
複製代碼

02.web

複製代碼
from selenium import webdriver
from time import sleep
bro = webdriver.Chrome(executable_path='./chromedriver.exe')

bro.get('https://xueqiu.com/')
sleep(5)

#執行js實現滾輪向下滑動
js = 'window.scrollTo(0,document.body.scrollHeight)'    #兩個參數一個是X軸,一個是y軸,此時用的是Y軸
bro.execute_script(js)
sleep(2)
bro.execute_script(js)
sleep(2)
bro.execute_script(js)
sleep(2)
bro.execute_script(js)
sleep(2)

a_tag = bro.find_element_by_xpath('//*[@id="app"]/div[3]/div/div[1]/div[2]/div[2]/a')
a_tag.click()
sleep(5)
#獲取當前瀏覽器頁面數據(動態)
print(bro.page_source)    

bro.quit()
複製代碼

 

PhantomJs及谷歌無頭瀏覽器無可視化:

#PhantomJs是一款無可視化界面的瀏覽器(免安裝)
from selenium import webdriver
from time import sleep
bro = webdriver.PhantomJS(executable_path=r'C:\Users\Administrator\Desktop\爬蟲+數據\爬蟲day03\phantomjs-2.1.1-windows\bin\phantomjs.exe')

bro.get('https://xueqiu.com/')
sleep(2)
bro.save_screenshot('./1.png')
#執行js實現滾輪向下滑動
js = 'window.scrollTo(0,document.body.scrollHeight)'
bro.execute_script(js)
sleep(2)
bro.execute_script(js)
sleep(2)
bro.execute_script(js)
sleep(2)
bro.execute_script(js)
sleep(2)
bro.save_screenshot('./2.png')
# a_tag = bro.find_element_by_xpath('//*[@id="app"]/div[3]/div/div[1]/div[2]/div[2]/a')
# bro.save_screenshot('./2.png')
# a_tag.click()
sleep(2)
#獲取當前瀏覽器頁面數據(動態)
print(bro.page_source)

bro.quit()

如今用的不多,知道便可

  

from selenium import webdriver
from time import sleep
from selenium.webdriver.chrome.options import Options
# 建立一個參數對象,用來控制chrome以無界面模式打開
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

bro = webdriver.Chrome(executable_path='./chromedriver.exe',options=chrome_options)
bro.get('https://www.baidu.com')
sleep(2)
bro.save_screenshot('1.png')
#標籤訂位
tag_input = bro.find_element_by_id('kw')
tag_input.send_keys('人民幣')
sleep(2)

btn = bro.find_element_by_id('su')
btn.click()
sleep(2)

print(bro.page_source)
bro.quit()

谷歌無頭瀏覽器

  

 

前進和後退

#前進和後退
from selenium import webdriver
from time import sleep
bro = webdriver.Chrome(executable_path='./chromedriver.exe')
bro.get('https://www.baidu.com')
sleep(1)
bro.get('http://www.goubanjia.com/')
sleep(1)
bro.get('https://www.taobao.com')
sleep(1)

bro.back()
sleep(1)
bro.forward()
sleep(1)
print(bro.page_source)

bro.quit()

  

 

動做鏈

在上面的實例中,一些交互動做都是針對某個節點執行的。好比,對於輸入框,咱們就調用它的輸入文字和清空文字方法;對於按鈕,就調用它的點擊方法。其實,還有另一些操做,它們沒有特定的執行對象,好比鼠標拖曳、鍵盤按鍵等,這些動做用另外一種方式來執行,那就是動做鏈。chrome

好比,如今實現一個節點的拖曳操做,將某個節點從一處拖曳到另一處,能夠這樣實現:windows

#動做鏈
from selenium import webdriver
from time import sleep
from selenium.webdriver import ChromeOptions
from selenium.webdriver import ActionChains  

option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])

bro = webdriver.Chrome(executable_path='./chromedriver.exe',options=option)
url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
bro.get(url=url)
#若是定位的標籤存在於iframe標籤之中,則必須通過switch_to操做在進行標籤訂位
bro.switch_to.frame('iframeResult')
source_tag = bro.find_element_by_id('draggable')
taget_tag = bro.find_element_by_id('droppable')
#建立一個動做連的對象
action = ActionChains(bro)
action.drag_and_drop(source_tag,taget_tag)
action.perform()
sleep(3)
# bro.quit()

  

 

瀏覽器建立

Selenium支持很是多的瀏覽器,如Chrome、Firefox、Edge等,還有Android、BlackBerry等手機端的瀏覽器。另外,也支持無界面瀏覽器PhantomJS。api

複製代碼
from selenium import webdriver
  
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
複製代碼

元素定位

webdriver 提供了一系列的元素定位方法,經常使用的有如下幾種:瀏覽器

複製代碼
find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()
複製代碼

注意

一、find_element_by_xxx找的是第一個符合條件的標籤,find_elements_by_xxx找的是全部符合條件的標籤。

二、根據ID、CSS選擇器和XPath獲取,它們返回的結果徹底一致。

三、另外,Selenium還提供了通用方法find_element(),它須要傳入兩個參數:查找方式By和值。實際上,它就是find_element_by_id()這種方法的通用函數版本,好比find_element_by_id(id)就等價於find_element(By.ID, id),兩者獲得的結果徹底一致。

節點交互

Selenium能夠驅動瀏覽器來執行一些操做,也就是說可讓瀏覽器模擬執行一些動做。比較常見的用法有:輸入文字時用send_keys()方法,清空文字時用clear()方法,點擊按鈕時用click()方法。示例以下:

複製代碼
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('MAC')
time.sleep(1)
input.clear()
input.send_keys('IPhone')
button = browser.find_element_by_class_name('btn-search')
button.click()
browser.quit()
複製代碼

 

selenium規避被檢測識別

如今很多大網站有對selenium採起了監測機制。好比正常狀況下咱們用瀏覽器訪問淘寶等網站的 window.navigator.webdriver的值爲 
undefined。而使用selenium訪問則該值爲true。那麼如何解決這個問題呢?

只須要設置Chromedriver的啓動參數便可解決問題。在啓動Chromedriver以前,爲Chrome開啓實驗性功能參數excludeSwitches,它的值爲['enable-automation'],完整代碼以下:

from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions

option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option)
相關文章
相關標籤/搜索