• 關閉

    Python 爬蟲利器 Selenium 從入門到進階(上)

    發表于:2024-1-18 09:39

    字體: | 上一篇 | 下一篇 | 我要投稿

     作者:編程啊青    來源:今日頭條

      關于數據分析與可視化.
      selenium的簡介與安裝
      selenium是最廣泛使用的開源Web UI自動化測試套件之一,它所支持的語言包括C++、Java、Perl、PHP、PythonRuby,在數據抓取方面也是一把利器,能夠解決大部分網頁的反爬措施,當然它也并非是萬能的,一個比較明顯的一點就在于是它速度比較慢,如果每天數據采集的量并不是很高,倒是可以使用這個框架。
      那么說到安裝,可以直接使用pip在安裝
      pip install selenium
      與此同時呢,我們還需要安裝一個瀏覽器驅動,不同的瀏覽器需要安裝不同的驅動,這邊小編主要推薦的以下這兩個
      ·Firefox瀏覽器驅動: geckodriver
      · Chrome瀏覽器驅動: chromedriver
      小編平常使用的是selenium+chromedriver比較多,所以這里就以Chrome瀏覽器為示例,由于要涉及到chromedriver的版本需要和瀏覽器的版本一致,因此我們先來確認一下瀏覽器的版本是多少?看下圖:
      我們在“關于Chrome”當中找到瀏覽器的版本,然后下載對應版本的chromedriver,當然也要對應自己電腦的操作系統。
      頁面元素的定位
      在談到頁面元素的定位時,小編默認讀者朋友具備了最最基本的前端知識,例如HTML,CSS等。
      ID標簽的定位
      在HTML當中,ID屬性是唯一標識一個元素的屬性,因此在selenium當中,通過ID來進行元素的定位也作為首選,我們以百度首頁為例,搜索框的HTML代碼如下,其ID為“kw”,而“百度一下”這個按鈕的ID為“su”,我們用Python腳本通過ID的標簽來進行元素的定位。
      driver.find_element_by_id("kw")
      driver.find_element_by_id("su")
      NAME標簽的定位
      在HTML當中,Name屬性和ID屬性的功能基本相同,只是Name屬性并不是唯一的,如果遇到沒有ID標簽的時候,我們可以考慮通過Name標簽來進行定位,代碼如下:
      driver.find_element_by_name("wd")
      Xpath定位
      使用Xpath方式來定位幾乎涵蓋了頁面上的任意元素,那什么是Xpath呢?Xpath是一種在XML和HTML文檔中查找信息的語言,當然通過Xpath路徑來定位元素的時候也是分絕對路徑和相對路徑。
      絕對路徑是以單號/來表示,相對路徑是以//來表示,而涉及到Xpath路徑的編寫,小編這里偷個懶,直接選擇復制/粘貼的方式,例如針對下面的HTML代碼:
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Test</title>
      </head>
      <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>
      我們可以這么來做,打開瀏覽器的開發者工具,鼠標移到我們選中的元素,然后右擊檢查,具體看下圖:
      我們還是以百度首頁為例,看一下如何通過Xpath來進行頁面元素的定位,代碼如下:
      driver.find_element_by_xpath('//*[@id="kw"]')
      className標簽定位
      我們也可以基于class屬性來定位元素,尤其是當我們看到有多個并列的元素如list表單,class用的都是共用同一個,如:
      driver.find_element_by_class_name("classname")
      這個時候,我們就可以通過class屬性來定位元素,該方法返回的是一個list列表,而當我們想要定位列表當中的第n個元素時,則可以這樣來安排
      driver.find_elements_by_class_name("classname")[n]
      需要注意的是,這里使用的是find_elements_by_class_name()方法而不是find_element_by_class_name()方法,這里我們還是通過百度首頁的例子,通過className標簽來定位搜索框這個元素。
      driver.find_element_by_class_name('s_ipt')
      CssSelector()方法定位
      其實在Selenium官網當中是更加推薦CssSelector()方法來進行頁面元素的定位的,原因在于相比較于Xpath定位速度更快,Css定位分為四類:ID值、Class屬性、TagName值等等,我們依次來看。
      ·ID方式來定位
      大概有兩種方式,一種是在ID值前面添加TagName的值,另外一種則是不加,代碼如下:
      driver.find_element_by_css_selector("#id_value")  # 不添加前面的`TagName`值
      driver.find_element_by_css_selector("tag_name.class_value")  # 不添加前面的`TagName`值
      當然有時候這個TagName的值非常的冗長,中間可能還有空格,那么這當中的空格就需要用點“.”來替換。
      driver.find_element_by_css_selector("tag_name.class_value1.calss_value2.class_value3")  # 不添加前面的`TagName`值
      我們仍然以百度首頁的搜索框為例,它的HTML代碼如下:
      要是用CssSelector的.class()方式來實現元素的定位的話,Python代碼該這樣來實現,和上面Xpath()的方法一樣,可以稍微偷點懶,通過復制/粘貼的方式從開發者工具當中來獲取元素的位置。
      代碼如下:
      driver.find_element_by_css_selector('#kw')
      linkText()方式來定位
      這個方法直接通過鏈接上面的文字來定位元素,案例如下:
      通過linkText()方法來定位“地圖”這個元素,代碼如下:
      driver.find_element_by_link_text("地圖").click()
      瀏覽器的控制
      修改瀏覽器窗口的大小
      我們可以通過使用set_window_size()這個方法來修改瀏覽器窗口的大小,代碼如下:
      # 修改瀏覽器的大小
      driver.set_window_size(500, 900)
      同時還有maxmize_window()方法是用來實現瀏覽器全屏顯示,代碼如下:
      # 全屏顯示
      driver.maximize_window()
      瀏覽器的前進與后退
      前進與后退用到的方法分別是forward()和back(),代碼如下:
      # 前進與后退
      driver.forward()
      driver.back()
      瀏覽器的刷新
      刷新用到的方法是refresh(),代碼如下:
      # 刷新頁面
      driver.refresh()
      除了上面這些,webdriver的常見操作還有:
      ·關閉瀏覽器:get()
      · 清除文本:clear()
      · 單擊元素:click()
      · 提交表單:submit()
      · 模擬輸入內容:send_keys()
      我們可以嘗試著用上面提到的一些方法來寫段程序:
      from selenium import webdriver
      from time import sleep
      driver = webdriver.Chrome(executable_path="chromedriver.exe")
      driver.get("https://www.baidu.com")
      sleep(3)
      driver.maximize_window()
      sleep(1)
      driver.find_element_by_xpath('//*[@id="s-top-loginbtn"]').click()
      sleep(3)
      driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_11__userName"]').send_keys('12121212')
      sleep(1)
      driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_11__password"]').send_keys('testtest')
      sleep(2)
      driver.refresh()
      sleep(3)
      driver.quit()
      output
      本文內容不用于商業目的,如涉及知識產權問題,請權利人聯系51Testing小編(021-64471599-8017),我們將立即處理
    《2023軟件測試行業現狀調查報告》獨家發布~

    關注51Testing

    聯系我們

    快捷面板 站點地圖 聯系我們 廣告服務 關于我們 站長統計 發展歷程

    法律顧問:上海蘭迪律師事務所 項棋律師
    版權所有 上海博為峰軟件技術股份有限公司 Copyright©51testing.com 2003-2024
    投訴及意見反饋:webmaster@51testing.com; 業務聯系:service@51testing.com 021-64471599-8017

    滬ICP備05003035號

    滬公網安備 31010102002173號

    久久97久久97精品免视_欧洲国产伦久久久久久_91麻豆精品国产自产在线观_伊人久久大香线蕉综合av