原文地址:https://program-park.top/2023/10/16/reptile_3/
本文章中所有內(nèi)容僅供學(xué)習(xí)交流使用,不用于其他任何目的,嚴(yán)禁用于商業(yè)用途和非法用途,否則由此產(chǎn)生的一切后果均與作者無(wú)關(guān)。
1. Selenium簡(jiǎn)介
??Selenium 是一個(gè)用于 Web 應(yīng)用程序測(cè)試的工具。最初是為網(wǎng)站自動(dòng)化測(cè)試而開(kāi)發(fā)的,可以直接運(yùn)行在瀏覽器上,支持的瀏覽器包括 IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera 和 Edge 等。
??爬蟲中使用它是為了解決 requests 無(wú)法直接執(zhí)行 JavaScript 代碼的問(wèn)題。Selenium 本質(zhì)上是通過(guò)驅(qū)動(dòng)瀏覽器,徹底模擬瀏覽器的操作,好比跳轉(zhuǎn)、輸入、點(diǎn)擊、下拉等,來(lái)拿到網(wǎng)頁(yè)渲染之后的結(jié)果。Selenium 是 Python 的一個(gè)第三方庫(kù),對(duì)外提供的接口能夠操作瀏覽器,從而讓瀏覽器完成自動(dòng)化的操作。
2. 為什么使用Selenium?
??Selenium 能模擬瀏覽器功能自動(dòng)執(zhí)行網(wǎng)頁(yè)中的 JavaScript 代碼,實(shí)現(xiàn)動(dòng)態(tài)加載。
3. Selenium的安裝
??谷歌瀏覽器驅(qū)動(dòng)下載地址:https://registry.npmmirror.com/binary.html?path=chromedriver/
??查看自己谷歌瀏覽器的版本,我這里的版本是正式版本116.0.5845.188
,驅(qū)動(dòng)下載地址最新的只有114.0.5735.90
,所以只能去官網(wǎng)的測(cè)試頁(yè)面下載118.0.5993.70
版本的驅(qū)動(dòng)(https://googlechromelabs.github.io/chrome-for-testing/#stable,版本向下兼容),然后把下載的壓縮包解壓,將exe
文件放入 PyCharm 項(xiàng)目的根目錄下。
??之后執(zhí)行pip install selenium
命令,安裝 selenium 庫(kù)。
4. Selenium的使用
from selenium import webdriver
# 創(chuàng)建瀏覽器操作對(duì)象
path = 'chromedriver.exe'
browser= webdriver.Chrome(path)
# 訪問(wèn)網(wǎng)站
url = 'https://www.baidu.com'
browser.get(url)
# content = browser.page_source
# print(content)
??需要注意的是,如果你的 selenium 是4.11.2
以上的版本,不需要設(shè)置driver.exe
的路徑,selenium 可以自己處理瀏覽器的驅(qū)動(dòng)程序,因此代碼直接改為brower = webdriver.Chrome()
即可。
??運(yùn)行代碼,得到下面的效果:
5. Selenium的元素定位
??自動(dòng)化工具要做的就是模擬鼠標(biāo)和鍵盤來(lái)操作點(diǎn)擊、輸入等等元素,但是操作這些元素的前提是找到它們,WebDriver 提供了很多元素定位的方法:
-
根據(jù)標(biāo)簽 id 獲取元素:
from selenium import webdriver from selenium.webdriver.common.by import By # 創(chuàng)建瀏覽器操作對(duì)象 # path = 'chromedriver.exe' browser= webdriver.Chrome() # 訪問(wèn)網(wǎng)站 url = 'https://www.baidu.com' browser.get(url) button = browser.find_element(By.ID, 'su') # button = browser.find_elements(By.ID, 'su') print(button)
-
根據(jù)標(biāo)簽 name 屬性的值獲取元素:
button = browser.find_element(By.NAME, 'wd') print(button)
-
根據(jù) Xpath 語(yǔ)句獲取元素;
button = browser.find_element(By.XPATH, '//input[@id="su"]') print(button)
-
根據(jù)標(biāo)簽名獲取元素:
button = browser.find_elements(By.TAG_NAME, 'input') print(button)
-
根據(jù) bs4 語(yǔ)法獲取元素:
button = browser.find_elements(By.CSS_SELECTOR, '#su') print(button)
-
根據(jù)標(biāo)簽的文本獲取元素(精確定位):
button = browser.find_elements(By.LINK_TEXT, '地圖') print(button)
-
根據(jù)標(biāo)簽的文本獲取元素(模糊定位):
button = browser.find_elements(By.PARTIAL_LINK_TEXT, '地') print(button)
-
根據(jù) class 屬性獲取元素:
button = browser.find_element(By.CLASS_NAME, 'wrapper_new') print(button)
??當(dāng)我們定位到元素之后,自然就要考慮如何獲取到元素的各種信息,selenium 給我們提供了獲取元素不同信息的方法:
-
獲取元素屬性:
from selenium import webdriver from selenium.webdriver.common.by import By # 創(chuàng)建瀏覽器操作對(duì)象 # path = 'chromedriver.exe' browser= webdriver.Chrome() # 訪問(wèn)網(wǎng)站 url = 'https://www.baidu.com' browser.get(url) button = browser.find_element(By.ID, 'su') print(input.get_attribute('class'))
-
獲取元素標(biāo)簽名:
input = browser.find_element(By.ID, 'su') print(input.tag_name)
-
獲取元素文本:
input = browser.find_element(By.ID, 'su') print(input.text)
-
獲取元素位置:
input = browser.find_element(By.ID, 'su') print(input.location)
-
獲取元素大?。?/strong>
input = browser.find_element(By.ID, 'su') print(input.size)
6. Selenium的交互
??頁(yè)面交互指的是我們平時(shí)在瀏覽器上的各種操作,比如輸入文本、點(diǎn)擊鏈接、回車、下拉框等,下面就演示 selenium 是如何進(jìn)行頁(yè)面交互的。
-
輸入文本:
from selenium import webdriver from selenium.webdriver.common.by import By import time # 創(chuàng)建瀏覽器操作對(duì)象 # path = 'chromedriver.exe' browser = webdriver.Chrome() # 訪問(wèn)網(wǎng)站 url = 'https://www.baidu.com' browser.get(url) # 定位輸入框 input = browser.find_element(By.ID, 'kw') # 輸入文本selenium input.send_keys('selenium') time.sleep(2) # 關(guān)閉瀏覽器 browser.close()
-
點(diǎn)擊:
from selenium import webdriver from selenium.webdriver.common.by import By import time # 創(chuàng)建瀏覽器操作對(duì)象 # path = 'chromedriver.exe' browser = webdriver.Chrome() # 訪問(wèn)網(wǎng)站 url = 'https://www.baidu.com' browser.get(url) # 定位輸入框 input = browser.find_element(By.ID, 'kw') # 輸入文本selenium input.send_keys('selenium') time.sleep(2) # 定位百度一下的按鈕 button = browser.find_element(By.ID, 'su') # 點(diǎn)擊按鈕 button.click() time.sleep(2) # 關(guān)閉瀏覽器 browser.close()
-
清除文本:
from selenium import webdriver from selenium.webdriver.common.by import By import time # 創(chuàng)建瀏覽器操作對(duì)象 # path = 'chromedriver.exe' browser = webdriver.Chrome() # 訪問(wèn)網(wǎng)站 url = 'https://www.baidu.com' browser.get(url) # 定位輸入框 input = browser.find_element(By.ID, 'kw') # 輸入文本selenium input.send_keys('selenium') time.sleep(2) # 清除selenium input.clear() time.sleep(2) # 關(guān)閉瀏覽器 browser.close()
-
回車確認(rèn):
from selenium import webdriver from selenium.webdriver.common.by import By import time # 創(chuàng)建瀏覽器操作對(duì)象 # path = 'chromedriver.exe' browser = webdriver.Chrome() # 訪問(wèn)網(wǎng)站 url = 'https://www.baidu.com' browser.get(url) # 定位輸入框 input = browser.find_element(By.ID, 'kw') # 輸入文本selenium input.send_keys('selenium') time.sleep(2) # 回車查詢 input.submit() time.sleep(2) # 關(guān)閉瀏覽器 browser.close()
-
運(yùn)行 JavaScript:
from selenium import webdriver from selenium.webdriver.common.by import By import time # 創(chuàng)建瀏覽器操作對(duì)象 # path = 'chromedriver.exe' browser = webdriver.Chrome() # 訪問(wèn)網(wǎng)站 url = 'https://www.baidu.com' browser.get(url) # 定位輸入框 input = browser.find_element(By.ID, 'kw') # 輸入文本selenium input.send_keys('selenium') time.sleep(2) # 回車查詢 input.submit() time.sleep(2) # js代碼 js_bottom = 'document.documentElement.scrollTop=100000' # 下拉進(jìn)度條,頁(yè)面滑動(dòng) browser.execute_script(js_bottom) time.sleep(2) # 關(guān)閉瀏覽器 browser.close()
-
前進(jìn)后退
from selenium import webdriver from selenium.webdriver.common.by import By import time # 創(chuàng)建瀏覽器操作對(duì)象 # path = 'chromedriver.exe' browser = webdriver.Chrome() # 訪問(wèn)網(wǎng)站 url = 'https://www.baidu.com' browser.get(url) # 定位輸入框 input = browser.find_element(By.ID, 'kw') # 輸入文本selenium input.send_keys('selenium') time.sleep(2) # 回車查詢 input.submit() time.sleep(2) # js代碼 js_bottom = 'document.documentElement.scrollTop=100000' # 頁(yè)面滑動(dòng) browser.execute_script(js_bottom) time.sleep(2) # 定位下一頁(yè)的按鈕 next = browser.find_element(By.XPATH, '//a[@class="n"]') # 點(diǎn)擊下一頁(yè) next.click() time.sleep(2) # 返回到上一頁(yè)面 browser.back() time.sleep(2) # 前進(jìn)到下一頁(yè) browser.forward() time.sleep(2) # 關(guān)閉瀏覽器 browser.close()
7. Chrome handless
??在上面的測(cè)試過(guò)程中可以發(fā)現(xiàn),雖然 selenium 簡(jiǎn)便好用,但是它的運(yùn)行速度很慢,這是因?yàn)?selenium 是有界面的,需要執(zhí)行前端 css 和 js 的渲染。那么下面就介紹一個(gè)無(wú)界面的瀏覽器,Chrome-handless 模式,運(yùn)行效率要比真實(shí)的瀏覽器快很多,在 selenium 的基礎(chǔ)上,支持頁(yè)面元素查找、js 執(zhí)行等,代碼和 selenium 一致。
??使用前提:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-722464.html
-
Chrome
- Unix\Linux chrome >= 59
- Windows chrome >= 60
- Python >= 3.6
- Selenium >= 3.4.*
from selenium import webdriver
def share_browser():
# headless自帶配置,不需要再做額外的修改
from selenium.webdriver.chrome.options import Options
# 初始化
chrome_options = Options()
chrome_options.add_argument('‐‐headless')
chrome_options.add_argument('‐‐disable‐gpu')
# 谷歌瀏覽器的安裝路徑
path = r'C:\Users\\AppData\Local\Google\Chrome\Application\chrome.exe'
chrome_options.binary_location = path
browser = webdriver.Chrome(options=chrome_options)
return browser
browser = share_browser()
url = 'https://www.baidu.com'
browser.get(url)
# 本地保存照片
browser.save_screenshot('baidu.png')
參考文獻(xiàn)
??【1】http://www.noobyard.com/article/p-boitcibx-g.html
??【2】https://www.jb51.net/article/149145.htm
??【3】https://zhuanlan.zhihu.com/p/462460461
??【4】https://blog.csdn.net/weixin_67553250/article/details/127555724
??【5】https://www.cnblogs.com/Summer-skr–blog/p/11491078.html
??【6】https://www.bilibili.com/video/BV1Db4y1m7Ho?p=77文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-722464.html
到了這里,關(guān)于Python爬蟲基礎(chǔ)之Selenium詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!