一篇文章帶你了解Python之Selenium自動(dòng)化爬蟲
Python之Selenium自動(dòng)化爬蟲
0.介紹
Selenium是一個(gè)Web的自動(dòng)化測(cè)試工具,最初是為網(wǎng)站自動(dòng)化測(cè)試而開發(fā)的,Selenium 可以直接運(yùn)行在瀏覽器上,它支持所有主流的瀏覽器(包括PhantomJS這些無界面的瀏覽器(2018年開發(fā)者說暫停開發(fā),chromedriver也可以實(shí)現(xiàn)同樣的功能)),可以接收指令,讓瀏覽器自動(dòng)加載頁面,獲取需要的數(shù)據(jù),甚至頁面截屏。
1.安裝
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
2.下載瀏覽器驅(qū)動(dòng)
這里用的谷歌瀏覽器
http://npm.taobao.org/mirrors/chromedriver/
查看自己的瀏覽器版本下載對(duì)應(yīng)的驅(qū)動(dòng)。
把解壓后的驅(qū)動(dòng)放在自己的python.exe 目錄下。
3.實(shí)例
我之前寫過3個(gè)實(shí)例
http://www.dbjr.com.cn/article/236004.htm
4.開啟無頭模式
是否開啟無頭模式(即是否需要界面)
from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import Options option = Options() # 實(shí)例化option對(duì)象 option.add_argument("--headless") # 給option對(duì)象添加無頭參數(shù) option.headless = True #這種方式也可以 if __name__ == '__main__': web = Chrome(executable_path='D:\PyProject\spider\venv\Scripts\chromedriver.exe',options=option) # 指定驅(qū)動(dòng)位置,否則從python解釋器目錄下查找. web.get("https://baidu.com") print(web.title)
5.保存頁面截圖
from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import Options option = Options() # 實(shí)例化option對(duì)象 option.add_argument("--headless") # 給option對(duì)象添加無頭參數(shù) if __name__ == '__main__': web = Chrome() web.maximize_window() # 瀏覽器窗口最大化 web.get("https://baidu.com") print(web.title) web.save_screenshot('baidu.png') # 保存當(dāng)前網(wǎng)頁的截圖 保存到當(dāng)前文件夾下 web.close() # 關(guān)閉當(dāng)前網(wǎng)頁
6.模擬輸入和點(diǎn)擊
from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import Options option = Options() # 實(shí)例化option對(duì)象 option.add_argument("--headless") # 給option對(duì)象添加無頭參數(shù) if __name__ == '__main__': web = Chrome() web.maximize_window() # 瀏覽器窗口最大化 web.get("https://baidu.com") el = web.find_element_by_id('kw') el.send_keys('Harris-H') btn = web.find_element_by_id('su') btn.click() # web.close() # 關(guān)閉當(dāng)前網(wǎng)頁
貌似現(xiàn)在百度可以識(shí)別出selenium,還需要圖片驗(yàn)證。
a.根據(jù)文本值查找節(jié)點(diǎn)
# 找到文本值為百度一下的節(jié)點(diǎn) driver.find_element_by_link_text("百度一下") # 根據(jù)鏈接包含的文本獲取元素列表,模糊匹配 driver.find_elements_by_partial_link_text("度一下")
b.獲取當(dāng)前節(jié)點(diǎn)的文本
ele.text # 獲取當(dāng)前節(jié)點(diǎn)的文本 ele.get_attribute("data-click") # 獲取到屬性對(duì)應(yīng)的value
c.打印當(dāng)前網(wǎng)頁的一些信息
print(driver.page_source) # 打印網(wǎng)頁的源碼 print(driver.get_cookies()) # 打印出網(wǎng)頁的cookie print(driver.current_url) # 打印出當(dāng)前網(wǎng)頁的url
d.關(guān)閉瀏覽器
driver.close() # 關(guān)閉當(dāng)前網(wǎng)頁 driver.quit() # 直接關(guān)閉瀏覽器
e.模擬鼠標(biāo)滾動(dòng)
from selenium.webdriver import Chrome import time if __name__ == '__main__': driver = Chrome() driver.get( "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=78000241_12_hao_pg&wd=selenium%20js%E6%BB%91%E5%8A%A8&fenlei=256&rsv_pq=8215ec3a00127601&rsv_t=a763fm%2F7SHtPeSVYKeWnxKwKBisdp%2FBe8pVsIapxTsrlUnas7%2F7Hoo6FnDp6WsslfyiRc3iKxP2s&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_sug3=31&rsv_sug1=17&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=9266&rsv_sug4=9770") # 1.滾動(dòng)到網(wǎng)頁底部 js = "document.documentElement.scrollTop=1000" # 執(zhí)行js driver.execute_script(js) time.sleep(2) # 滾動(dòng)到頂部 js = "document.documentElement.scrollTop=0" driver.execute_script(js) # 執(zhí)行js time.sleep(2) driver.close()
7.ChromeOptions
options = webdriver.ChromeOptions() options.add_argument("--proxy-server=http://110.52.235.176:9999") # 添加代理 options.add_argument("--headless") # 無頭模式 options.add_argument("--lang=en-US") # 網(wǎng)頁顯示英語 prefs = {"profile.managed_default_content_settings.images": 2, 'permissions.default.stylesheet': 2} # 禁止渲染 options.add_experimental_option("prefs", prefs) driver = webdriver.Chrome(executable_path="D:\ProgramApp\chromedriver\chromedriver73.exe",chrome_options=options) driver.get("http://httpbin.org/ip")
8.驗(yàn)證滑塊移動(dòng)
""" 目標(biāo):滑動(dòng)驗(yàn)證碼 1.定位按鈕 2.按住滑塊 3.滑動(dòng)按鈕 """ import time from selenium import webdriver if __name__ == '__main__': chrome_obj = webdriver.Chrome() chrome_obj.get('https://www.helloweba.net/demo/2017/unlock/') # 1.定位滑動(dòng)按鈕 click_obj = chrome_obj.find_element_by_xpath('//div[@class="bar1 bar"]/div[@class="slide-to-unlock-handle"]') # 2.按住 # 創(chuàng)建一個(gè)動(dòng)作鏈對(duì)象,參數(shù)就是瀏覽器對(duì)象 action_obj = webdriver.ActionChains(chrome_obj) # 點(diǎn)擊并且按住,參數(shù)就是定位的按鈕 action_obj.click_and_hold(click_obj) # 得到它的寬高 size_ = click_obj.size width_ = 298 - size_['width'] # 滑框的寬度 減去 滑塊的 寬度 就是 向x軸移動(dòng)的距離(向右) print(width_) # 3.定位滑動(dòng)坐標(biāo) action_obj.move_by_offset(298-width_, 0).perform() # 4.松開滑動(dòng) action_obj.release() time.sleep(6) chrome_obj.quit()
9.打開多窗口和頁面切換
有時(shí)候窗口中有很多子tab頁面。這時(shí)候肯定是需要進(jìn)行切換的。selenium提供了一個(gè)叫做switch_to_window來進(jìn)行切換,具體切換到哪個(gè)頁面,可以從driver.window_handles中找到
from selenium import webdriver if __name__ == '__main__': driver = webdriver.Chrome() driver.get("https://www.baidu.com/") driver.implicitly_wait(2) driver.execute_script("window.open('https://www.douban.com/')") driver.switch_to.window(driver.window_handles[1]) print(driver.page_source)
第二個(gè)實(shí)例
if __name__ == '__main__': from selenium import webdriver import time driver = webdriver.Chrome() start_url = 'https://www.baidu.com' start_url_1 = 'https://www.csdn.net' driver.get(start_url) time.sleep(5) """通過執(zhí)行js代碼,打開瀏覽器窗口,訪問地址""" js = 'window.open("{}")'.format(start_url_1) driver.execute_script(js) time.sleep(5) """獲取瀏覽器所有窗口:注意點(diǎn):窗口的切換是通過下標(biāo)控制的""" win = driver.window_handles # 執(zhí)行切換 driver.switch_to.window(win[0]) time.sleep(2) driver.switch_to.window(win[1]) time.sleep(2) driver.switch_to.window(win[0]) time.sleep(2) driver.switch_to.window(win[1]) # 瀏覽器窗口的關(guān)閉 driver.close() # 退出瀏覽器 driver.quit()
有時(shí)候網(wǎng)頁會(huì)內(nèi)嵌另一個(gè)html。一般稱為iframe
from selenium import webdriver driver = webdriver.Chrome() start_url = 'https://mail.163.com/' driver.get(start_url) """定位不成功,在有的情況是因?yàn)橛许撁娴那短讓?dǎo)致的 在一個(gè)html源碼中有多個(gè)html頁面,示例:一個(gè)html嵌套一個(gè)html 以上:又稱之為iframe的嵌套 """ # 定位嵌套位置iframe el_iframe = driver.find_elements_by_tag_name('iframe') # 執(zhí)行iframe的切換 driver.switch_to.frame(el_iframe[0]) # 標(biāo)簽定位 driver.find_element_by_name('email').send_keys('郵箱賬號(hào)') driver.find_element_by_name('password').send_keys('你的郵箱密碼') driver.find_element_by_id('dologin').click()
10.Cookie操作
# 1.獲取所有的cookie: for cookie in driver.get_cookies(): print(cookie) # 2.根據(jù)cookie的key獲取value: value = driver.get_cookie(key) # 3.刪除所有的cookie: driver.delete_all_cookies() # 4.刪除某個(gè)cookie: driver.delete_cookie(key) # 添加cookie: driver.add_cookie({"name":"password","value":"111111"})
11.模擬登錄
這里模擬登錄我們學(xué)校教務(wù)處。
from selenium.webdriver import Chrome if __name__ == '__main__': web = Chrome() web.get('http://bkjx.wust.edu.cn/') username = web.find_element_by_id('userAccount') username.send_keys('xxxxxxx') # 這里填自己的學(xué)號(hào) password = web.find_element_by_id('userPassword') password.send_keys('xxxxxxx') # 這里填自己的密碼 btn = web.find_element_by_xpath('//*[@id="ul1"]/li[4]/button') btn.click() # do something
因?yàn)闆]有滑塊啥的驗(yàn)證,所以就很簡(jiǎn)單qwq。然后后面進(jìn)行自己的操作即可。
12.使用代理
from selenium import webdriver import time options = webdriver.ChromeOptions() options.add_argument('--proxy-server=http://ip地址') # 代理IP:端口號(hào) # ${chromedriver_path}: chromedriver驅(qū)動(dòng)存放路徑 driver = webdriver.Chrome(options=options) driver.get("https://dev.kdlapi.com/testproxy") # 獲取頁面內(nèi)容 print(driver.page_source) # 延遲3秒后關(guān)閉當(dāng)前窗口,如果是最后一個(gè)窗口則退出 time.sleep(3) driver.close()
14.更換UA
from selenium import webdriver import time agent = 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1' options = webdriver.ChromeOptions() options.add_argument('--user-agent=' + agent) # ${chromedriver_path}: chromedriver驅(qū)動(dòng)存放路徑 driver = webdriver.Chrome(options=options) driver.get("https://www.baidu.com") # 獲取頁面內(nèi)容 print(driver.page_source) # 延遲3秒后關(guān)閉當(dāng)前窗口,如果是最后一個(gè)窗口則退出 time.sleep(3)
15.鼠標(biāo)懸停
if __name__ == '__main__': from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() import time start_url = 'https://lceda.cn/' driver.get(start_url) # 定位到需要懸停的標(biāo)簽 move = driver.find_element_by_xpath('//*[@id="headerNav"]/li[1]/a/span') # //*[@id="headerNav"]/li[1]/a/span # 懸停之后需要點(diǎn)擊的標(biāo)簽 a = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/div[1]/div[3]/div[1]/a[2]') # //*[@id="headerNav"]/li[1]/div/a[2] # /html/body/div[1]/div[2]/div[1]/div[1]/div[1]/div/div/div[1]/ul/li[1]/div/a[2] # 懸停點(diǎn)擊執(zhí)行 # 創(chuàng)建事件對(duì)象 actions = ActionChains(driver) time.sleep(1) # 記錄操作 actions.move_to_element(move) time.sleep(1.5) # 懸停的點(diǎn)擊 actions.click(a) time.sleep(1) # 開始執(zhí)行事件 actions.perform()
16.優(yōu)缺點(diǎn)
selenium
能夠執(zhí)行頁面上的js,對(duì)于js渲染的數(shù)據(jù)和模擬登陸處理起來非常容易。
selenium
由于在獲取頁面的過程中會(huì)發(fā)送很多請(qǐng)求,所以效率非常低,所以在很多時(shí)候需要酌情使用。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Python 實(shí)現(xiàn)簡(jiǎn)單的shell sed替換功能(實(shí)例講解)
下面小編就為大家?guī)硪黄狿ython 實(shí)現(xiàn)簡(jiǎn)單的shell sed替換功能(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09python網(wǎng)絡(luò)爬蟲 CrawlSpider使用詳解
這篇文章主要介紹了python網(wǎng)絡(luò)爬蟲 CrawlSpider使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09Python開發(fā)之Nginx+uWSGI+virtualenv多項(xiàng)目部署教程
這篇文章主要介紹了Python系列之-Nginx+uWSGI+virtualenv多項(xiàng)目部署教程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05Python基于sklearn庫的分類算法簡(jiǎn)單應(yīng)用示例
這篇文章主要介紹了Python基于sklearn庫的分類算法,結(jié)合簡(jiǎn)單實(shí)例形式分析了Python使用sklearn庫封裝樸素貝葉斯、K近鄰、邏輯回歸、SVM向量機(jī)等常見機(jī)器學(xué)習(xí)算法的分類調(diào)用相關(guān)操作技巧,需要的朋友可以參考下2018-07-07python中numpy包使用教程之?dāng)?shù)組和相關(guān)操作詳解
這篇文章主要給大家介紹了關(guān)于python中numpy包的使用教程,包含數(shù)組和相關(guān)操作等內(nèi)容,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07一個(gè)Python最簡(jiǎn)單的接口自動(dòng)化框架
這篇文章主要為大家詳細(xì)介紹了一個(gè)Python最簡(jiǎn)單的接口自動(dòng)化框架,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Python文件操作及內(nèi)置函數(shù)flush原理解析
這篇文章主要介紹了Python文件操作及內(nèi)置函數(shù)flush原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Python3獲取電腦IP、主機(jī)名、Mac地址的方法示例
這篇文章主要介紹了Python3獲取電腦IP、主機(jī)名、Mac地址的方法,結(jié)合具體實(shí)例形式分析了Python3基于socket與uuid模塊針對(duì)電腦的IP、主機(jī)名、Mac地址等信息的讀取操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-04-04