python爬蟲---selenium庫的用法


selenium是一個自動化測試工具,支持Firefox,Chrome等眾多瀏覽器

在爬蟲中的應用主要是用來解決JS渲染的問題。

 

1.使用前需要安裝這個第三方庫,CMD下:

pip install selenium

2.為你的測試瀏覽器下載驅動,我用的是Chrome,對應的去百度一下Chrome webdrive下載,並解壓到python安裝目錄scripts下。

 

開始使用

from selenium import webdrive browser = webdriver.Chrome() browser.get('http://www.baidu.com')

運行代碼就會彈出一個Chrome瀏覽器,並執行了一個get請求到達了百度。

如果是像微博這樣的頁面經過大量JS代碼渲染過的,僅僅使用requests來打印頁面源碼,看到的時很簡單的html和少量JS代碼,這就獲取不了我們需要的內容

所以,selenium解決了這個問題,通過模擬瀏覽器的訪問,實現了頁面源碼的完整打印

from selenium import webdrive browser = webdrive.Chrome() browser.get('https://www.zhihu.com/explore') print(browser.page_source)
browser.close() #源碼打印后,可以選擇自動關閉或者手動關閉

這樣的話,頁面完全加載后,源碼全部打印。

 

 

 

元素查找

單個元素查找

查找方法有以下七種:

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

 

以淘寶作為示例,下面是淘寶輸入框的html代碼

<input id="q" name="q" aria-label="請輸入搜索文字" accesskey="s" autofocus="autofocus" autocomplete="off" class="search-combobox-input" aria-haspopup="true" aria-combobox="list" role="combobox" x-webkit-grammar="builtin:translate" tabindex="0">

其中id為q

使用三種方式進行查找

from selenium import webdriver browser = webdriver.Chrome()
browser.get('http://www.taobao.com') input_first
= browser.find_element_by_id('q') input_sec = browser.find_element_by_css_selector('#q') #在進行css選擇時,class以#代替 input_third = browser.find_element_by_xpath('//*[@id="q"]') print(input_first, input_sec, input_third)

 輸出信息:可以看到三者的element值全部相同

<selenium.webdriver.remote.webelement.WebElement (session="058a6d63356b317ab154f05c765c965c", element="0.10777909912780625-1")>

<selenium.webdriver.remote.webelement.WebElement (session="058a6d63356b317ab154f05c765c965c", element="0.10777909912780625-1")>

<selenium.webdriver.remote.webelement.WebElement (session="058a6d63356b317ab154f05c765c965c", element="0.10777909912780625-1")>

 

另一種查找方式:

這種查找方式無非就是將查找方式作為參數傳入,相比還是上一種更簡潔

from selenium import webdriver from selenium.webdriver.common.by import By browser = webdriver.Chrome() browser.get('http://www.taobao.com') input_fir = browser.find_element(By.ID, 'q') input_sec = browser.find_element(By.CSS_SELECTOR, '#q') input_thi = browser.find_element(By.XPATH, '//*[@id="q"]') print(input_fir, input_sec, input_thi)

輸出:三者的element值還是相同的

<selenium.webdriver.remote.webelement.WebElement (session="0b52c54d919026a491c53474b4e148c7", element="0.8407035458653862-1")>

<selenium.webdriver.remote.webelement.WebElement (session="0b52c54d919026a491c53474b4e148c7", element="0.8407035458653862-1")>

<selenium.webdriver.remote.webelement.WebElement (session="0b52c54d919026a491c53474b4e148c7", element="0.8407035458653862-1")>

 

多元素查找

find_elements_by_xxx,find_elements(By.xxxxx)

淘寶元素查找示例,服務導航條的html代碼如下

<ul class="service-bd" role="menubar">
<li data-closeper="" aria-label="查看更多" role="menuitem" aria-haspopup="true" data-groupid="101" class="J_Cat a-all">

 

查找service-bd下級的li標簽

from selenium import webdriver from selenium.webdriver.common.by import By browser = webdriver.Chrome() browser.get('http://www.taobao.com') a = browser.find_elements_by_css_selector('.service-bd li') # b = browser.find_elements(By.CSS_SELECTOR, '.service-bd li') #第二種的參數傳入查找方式

print(a)

結果:li標簽的值仍然是相同的,多元素查找時,返回的時list集合

[<selenium.webdriver.remote.webelement.WebElement (session="387a43bf87c016a86c80f072f4a62aca", element="0.4632603097227008-1")>,

<selenium.webdriver.remote.webelement.WebElement (session="387a43bf87c016a86c80f072f4a62aca", element="0.4632603097227008-2")>,

<selenium.webdriver.remote.webelement.WebElement (session="387a43bf87c016a86c80f072f4a62aca", element="0.4632603097227008-3")>,

.......]

 

 

元素交互操作

由網頁get--->>>元素查找---->>>鍵值插入及刪除--->>>點擊事件

以下代碼實現的過程是:到達淘寶--->>>查找輸入框id為q的元素--->>>鍵入值---等待---重新鍵入值-----提交按鈕元素查找---點擊

from selenium import webdriver import time browser = webdriver.Chrome() browser.get('http://www.taobao.com') input = browser.find_element_by_id('q') input.send_keys('iPhone') time.sleep(2) input.clear() input.send_keys('gigabyte') button = browser.find_element_by_class_name('btn-search') button.click() print(browser.current_url)  # 打印當前頁面的url

 

 

執行JS語句

from selenium import webdriver #執行js語句:實現一個網頁下拉動作
browser = webdriver.Chrome() browser.get('http://www.zhihu.com/explore') browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') browser.execute_script('alert("succ")')

 

前進與后退操作

>>> from selenium import webdriver >>> driver = webdriver.Chrome() >>> driver.get('http://www.baidu.com') >>> driver.get('http://www.sina.com') >>> driver.back() >>> driver.forward()

 

標簽頁的增加

from selenium import webdriver driver = webdriver.Chrome() driver.get('http://www.zhihu.com/explore') driver.execute_script('window.open()') print(driver.window_handles) driver.switch_to.window(driver.window_handles[0]) driver.get('http://www.taobao.com') driver.switch_to.window(driver.window_handles[1]) driver.get('http://m.weibo.com') driver.close()

今天博客園抽風了,截圖上傳不了...

我用selenium做了模擬登陸百度,不過驗證碼需要自己手打

驗證碼問題的解決需要依賴PIL庫,我還沒學習過。。

from selenium import webdriver import time #聲明瀏覽器對象
browser = webdriver.Chrome() browser.get('https://passport.baidu.com/v2/?login&fr=old&login&tpl=mn') username = browser.find_element_by_id('TANGRAM__PSP_3__userName') username.send_keys('account') password = browser.find_element_by_id('TANGRAM__PSP_3__password') password.send_keys('passwd') time.sleep(5) button = browser.find_element_by_id('TANGRAM__PSP_3__submit') button.click() # sendcode = browser.find_element_by_class_name('forceverify-button forceverify-button-send') # sendcode.click() #  # time.sleep(10) #  # finalogin = browser.find_element_by_id('TANGRAM__28__button_submit') # finalogin.click()

 如果不需要顯示的調用瀏覽器,可以使用第三方瀏覽器:PhantomJS

phantomjs介紹

     (1)一個基於webkit內核的無頭瀏覽器,即沒有UI界面,即它就是一個瀏覽器,只是其內的點擊、翻頁等人為相關操作需要程序設計實現。

     (2)提供javascript API接口,即通過編寫js程序可以直接與webkit內核交互,在此之上可以結合java語言等,通過java調用js等相關操作,從而解決了以前c/c++才能比較好的基於webkit開發優質采集器的限制。

     (3)提供windows、linux、mac等不同os的安裝使用包,也就是說可以在不同平台上二次開發采集項目或是自動項目測試等工作。

Windows下安裝使用:

pip install PhantomJS

用法

from selenium import webdriver browser = webdriver.PhantomJS()

只有聲明瀏覽器對象時不同,其他用法全部相同

異常的捕獲:

http://selenium-python.readthedocs.io/index.html



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM