[Python爬蟲] 04. Selenium 瀏覽器模擬

 · 5 mins read

Selenium 1

Selenium 它能控制你的瀏覽器,多是應用在瀏覽器自動化方面,可依照指令將會像自動機器人一樣確實地執行,並且記錄一切測試的過程與錯誤;但在爬蟲也是個好工具,在一些動態網頁經過執行 js 後才能顯現,Selenium 便是一個很好解決動態網頁爬蟲的工具。



win7 開發環境

  • python 3.5

  • Selenium

      $ pip3 install selenium
    
  • 瀏覽器 Driver

    實體瀏覽器,執行後會開啟一個自動瀏覽器控制;背景瀏覽器則是無介面瀏覽器 [1],若沒有檢視需求,爬蟲用背景瀏覽器即可。

    • 實體瀏覽器 Ie/Firefox/Chrome 下載:

        https://www.seleniumhq.org/download/
      
    • 啟動實體瀏覽器:

        driver = webdriver.Ie('C:\IEDriverServer.exe')
        driver = webdriver.Firefox('C:\geckodriver.exe')
        driver = webdriver.Chrome('C:\chromedriver.exe')
      
    • 背景瀏覽器 Chrome 59 下載:

        $ brew install Caskroom/versions/google-chrome-canary
      
    • 啟動背景瀏覽器:

        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--disable-gpu')
        driver = webdriver.Chrome(chrome_options=chrome_options,executable_path='/Users/xxxx/driver/chromedriver')
      



開一個頁面

  • get URL

      from selenium import webdriver
      driver.get('http://pala.tw/js-example/')  #輸入範例網址,交給瀏覽器
    
  • 取得網頁原始碼

      pageSource = driver.page_source  #取得網頁原始碼
      print(pageSource)
    


查找元素

單個元素

  • find_element_by_id
  • find_element_by_name
  • find_element_by_xpath
  • find_element_by_link_text
  • find_element_by_partial_link_text
  • find_element_by_tag_name
  • find_element_by_class_name
  • find_element_by_css_selector

一次查找多個元素

搜尋結果不只一個(find_elements會形成list),先存起來,需要時在一個一個 print 出。

  • find_elements_by_name
  • find_elements_by_xpath
  • find_elements_by_link_text
  • find_elements_by_partial_link_text
  • find_elements_by_tag_name
  • find_elements_by_class_name
  • find_elements_by_css_selector


By 的一些可用属性

  • ID = “id”
  • XPATH = “xpath”
  • LINK_TEXT = “link text”
  • PARTIAL_LINK_TEXT = “partial link text”
  • NAME = “name”
  • TAG_NAME = “tag name”
  • CLASS_NAME = “class name”
  • CSS_SELECTOR = “css selector”


查找元素

  • 通過 ID 查找元素

    • 示例:

        <form id="loginForm">
      
    • 查找元素:

        driver.find_element_by_id('loginForm')
      
  • 通過 Name 查找元素

    • 示例:

        <input name="password" type="password"/>
      
    • 查找元素:

        driver.find_element_by_name('password')
      
  • 通過 XPath 查找元素

    • 示例:

        <html>
            <body>
                <form id="loginForm">
                    <input name="username" type="text" />
                    <input name="password" type="password" />
                    <input name="continue" type="submit" value="Login" />
                    <input name="continue" type="button" value="Clear" />
                </form>
            </body>
        <html>
      
    • 查找元素:

        driver.find_element_by_xpath("/html/body/form[1]")      #絕對定位
        driver.find_element_by_xpath("//form[1]")               #HTML頁面中的第一個form元素
        driver.find_element_by_xpath("//form[@id='loginForm']") #包含id屬性並且其值為loginForm的form元素
      
  • 通過 tag 查找元素

    • 示例:

        <html>
            <body>
                <h1>Welcome</h1>
                <p>Site content goes here.</p>
            </body>
        <html>
      
    • 查找元素:

        driver.find_element_by_tag_name('h1')
      
  • 通過 Class name 定位元素

    • 示例:

        <p class="content">Site content goes here.</p>
      
    • 查找元素:

        driver.find_element_by_class_name('content')
      
  • 通過 CSS 選擇器 查找元素

    • 示例:

        <p class="content">Site content goes here.</p>
      
    • 查找元素:選擇 class,要在開頭加上句點.

        driver.find_element_by_css_selector('p.content')
      



頁面的動作

  • click():做一些相關滑鼠動作

      driver.find_element_by_id("category").click()
    
  • send_keys():輸入框中輸入一些内容

      element = driver.find_element_by_name("passwd").send_keys("some text")
      driver.find_element_by_id("passwd-id").send_keys(" and some", Keys.ARROW_DOWN) # 輸入方向鍵
    
  • switch_to_window():在不同的視窗和框架之間移動

      driver.switch_to_window("windowName")
    
  • switch_to_alert():彈出對話框

      alert = driver.switch_to_alert()
    
  • forward() & back():訪問瀏覽器歷史紀錄

      driver.forward() #前進
      driver.back() #後退
    



取得值

  • page_source:取得網頁原始碼

      pageSource = driver.page_source  #取得網頁原始碼
      print(pageSource)
    
  • current_url:取得當前網址

      driver.current_url
    
  • get_attribute:取得值

    • HTML

        <input type="text" maxlength="9" name="period_no_short" class="input-txt w120" size="4" value="32" positiveinteger="true">
      
    • get_attribute()

        self.period_no_short = self.driver.find_element_by_xpath(
        '//*[@id="setting_table"]/tbody/tr[5]/td[2]/div/input[1]'
        ).get_attribute("value")
      
        >>>
        32
      
  • text:取得文字

    • HTML

        <td class="tl" bordercolordark="#ffffff" bordercolorlight="#000000"> 
        Jeffery Test Member Client 
        <input type="hidden" name="content" value="Jeffery Test Member Client"> </td>
      
    • text

        driver.find_element_by_xpath('//*[@id="list_table"]/tbody/tr[1]/td[2]').text
      
        >>>
        Jeffery Test Member Client