調用瀏覽器的爬蟲——selenium

原文地址

分類目錄——爬蟲

在進行網頁爬取時,有些網頁比較難分析,應用的很多動態特性;還有可能會在header中封裝了很多奇奇怪怪的不知道怎麼獲取的數據;這時候可能會想如果能用程序吊起瀏覽器來,自動執行點擊,拖動等動作就好了

selenium就是這樣一個工具包

  • 先看一個例子

    selenium效果示例

    上面所有的操作都是selenium程序控制執行的,當然,執行遇到了問題,卡在了圖片驗證上,這個之後再說,先看一下上述操作是怎麼完成的

    from selenium import webdriver
    import time
    
    options = webdriver.ChromeOptions()
    
    driver = webdriver.Chrome(
        executable_path=r'D:\Anaconda3\envs\others\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe',
        options=options
    )
    # driver = webdriver.Firefox()
    
    driver.get("http://www.jd.com")
    driver.find_element_by_link_text("你好,請登錄").click()  # 就是你在頁面上看到的可點擊元素
    time.sleep(2)   # 限於網絡環境需要適當延遲等網頁刷新頁面
    driver.find_element_by_link_text("賬戶登錄").click()
    driver.find_element_by_name("loginname").send_keys('123456')   # 通過查看源碼獲得的html元素中的name屬性
    driver.find_element_by_name("nloginpwd").send_keys('mimamima')
    driver.find_element_by_id("loginsubmit").click()    # # 通過查看源碼獲得的html元素中的name屬性
    time.sleep(5)
    
  • selenium安裝

    現在很多包的安裝已經很容易了,直接

    pip install selenium
    

    即可

  • 初始化一個selenium.webdirver對象

    後面所有的操作瀏覽器動作將通過這個對象來完成,主要語法如下

    driver = webdriver.Chrome(
        executable_path=r'D:\Anaconda3\envs\others\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe',
        options=options
    )
    

    其中executable_path需要傳入一個本地的瀏覽器驅動路徑,webdirver對象將通過它來操作瀏覽器,關於谷歌的這個驅動,可以參見https://blog.csdn.net/weixin_43746433/article/details/95237254 這篇博客進行下載,我測試時並沒有跟我環境對應的64位驅動,我下載了32位的也可用

    options是用來設置這個對象的操作屬性的,它應該這麼定義

    options = webdriver.ChromeOptions()
    # 可以給options添加一些選項
    options.add_experimental_option('excludeSwitches', ['enable-automation'])
    # 上面這個設置意爲以開發者模式啓動瀏覽器
    # 一些網站能夠識別selenium並進行針對性拒絕訪問,這裏設置options爲開發者模式,防止被網站識別出來使用了Selenium
    # 我實際用了幾次(比如在淘寶和CSDN的登錄上)已經沒有效果了,應該是反爬機制又升級了
    options.add_argument('--headless')  
    # 不啓動瀏覽器操作(默認會啓動瀏覽器窗口)
    

    注意options的聲明要在webdriver之前

    當然,也可以聲明 其他瀏覽器的webdriver對象,such as

    # driver = webdriver.Firefox()
    
  • 這個dirver怎麼用

    • 跳轉到一個網頁

      driver.get("http://www.jd.com")
      
    • 定位到一個html元素

      driver.find_element_by~~~
      # or
      dirver.find_elements_by~~~
      
      find
    • 定位到元素後如何操作

      such as

      driver.find_element_by_link_text("賬戶登錄").click()	# 找到之後點擊
      driver.find_element_by_name("loginname").send_keys('123456')   # 這是向輸入框裏輸入數據
      driver.find_element_by_name("nloginpwd").send_keys('mimamima')
      driver.find_element_by_id("loginsubmit").click()    # 點擊登錄按鈕
      
    • 如果從網頁中獲取多媒體資源

      使用bs4.BeautifulSoup可以方便的對網頁進行解析,這裏以獲取頁面內京東的logo爲例進行程序說明

      background = driver.find_element_by_id('logo').find_element_by_tag_name('img')
      url = background.get_property('src')  # url被卸載了style屬性中
      print(url)
      r = requests.get(url)
      # 這裏通過requests來獲取這張圖片,當然driver也是可以的,但是driver之後當前的dirver處理頁面就變成了這張圖片
      # 再找元素就找不到了,轉回來也會比較麻煩
      with open('./data/logo.png', 'wb') as f:   # 注意文件處理模式爲‘wb’(以二進制寫入)
          f.write(r.content)  # r.content獲取r的二進制形式
      

      這樣圖片就被保存了下來

      logo

      順便也獲取一下上面的圖片驗證的那張圖,這張圖費了些周折,京東的這個頁面弄得七轉八繞的,可以在F12分析源碼的時候通過Ctrl+F搜索.png來快速定位到這張圖片,而且這樣圖不是直接給了他url,是以base64的形式直接出現在html源碼中的

      src = img.get_attribute('src')
      b64 = src.split(',')[-1]    # 從src內容中拆解出圖片的base64碼
      imgdata = base64.b64decode(b64)
      file = open('data/verify.png', 'wb')
      file.write(imgdata)
      file.close()
      
      verify

      這個圖片驗證怎麼通過呢,我之後應該會再寫一些東西,有興趣的可以關注一下

  • 參考文獻

    Selenium-Python中文文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章