呼叫瀏覽器的爬蟲——selenium

ckxllf發表於2020-03-27

  分類目錄——爬蟲

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

  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(")

  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(")

  定位到一個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的二進位制形式

  這樣圖片就被儲存了下來

  順便也獲取一下上面的圖片驗證的那張圖,這張圖費了些周折,京東的這個頁面弄得七轉八繞的,可以在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()


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2682947/,如需轉載,請註明出處,否則將追究法律責任。

相關文章