在進行網頁爬取時,有些網頁比較難分析,應用的很多動態特性;還有可能會在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("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~~~
-
定位到元素後如何操作
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()
這個圖片驗證怎麼通過呢,我之後應該會再寫一些東西,有興趣的可以關注一下
-
-
參考文獻