Google驅(qū)動(dòng)的安裝和selenium自動(dòng)化的使用
一.Google驅(qū)動(dòng)的安裝
在使用selenium之前必須先安裝驅(qū)動(dòng),你可以安裝搜狗,火狐,Google,edge等瀏覽器
的驅(qū)動(dòng),但我建議大家使用Google的驅(qū)動(dòng),因?yàn)檫@個(gè)功能全面,搜索文件更加快
火狐瀏覽器的驅(qū)動(dòng)也非常好用,可以試試
在安裝之前先要安裝一下selenium模塊 -->直接在編譯器終端或者在cmd里面輸
入"# pip install selenium"這個(gè)命令即可
Google的下載地址:
http://chromedriver.storage.googleapis.com/index.html
第一步:
打開這個(gè)鏈接后會(huì)有很多個(gè)壓縮包,這個(gè)里面都是Google的驅(qū)動(dòng),但是你要根據(jù)自己的瀏覽器版本號(hào)去下載相應(yīng)的驅(qū)動(dòng),當(dāng)然火狐瀏覽器不需要去下載相應(yīng)版本號(hào)的驅(qū)動(dòng)
瀏覽器版本號(hào)查看步驟
下載到對(duì)應(yīng)版本號(hào)的驅(qū)動(dòng)后解壓得到下面這個(gè)可執(zhí)行文件
第二步:
要把這個(gè)可執(zhí)行文件放到當(dāng)時(shí)我們安裝的python編譯器里面的那個(gè)script腳本文件夾中去
如何找到自己python安裝在了哪個(gè)位置
win+r —>輸入cmd
最后輸入下面代碼就可以找到python安裝的位置了
第三步:
給安裝的驅(qū)動(dòng)配置環(huán)境變量
這個(gè)環(huán)境變量的配置就是把python里面的script文件夾里面的可執(zhí)行文件生效
二.selenium自動(dòng)化的初體驗(yàn)
1.導(dǎo)入模塊
from selenium import webdriver
2.實(shí)例化一個(gè)谷歌驅(qū)動(dòng)對(duì)象
driver = webdriver.Chrome()
3.打開網(wǎng)頁(這里用搜狗為例)
driver.get('https://www.sogou.com/')
4.將打開的網(wǎng)頁全屏
driver.maximize_window()
三.selenium元素的定位操作
1.根據(jù)元素id屬性定位
input = driver.find_element_by_id('query')
2.通過name屬性值定位元素
name = driver.find_element_by_name('query')
3.通過xpath定位元素
input = driver.find_element_by_xpath('//input[@id="query"]')
input = driver.find_elements_by_xpath('//input')
第一種find_element_by_xpath()就是匹配到第一個(gè)元素,
如果沒有匹配到將會(huì)拋出異常,在抓取網(wǎng)頁過程中我們?yōu)榱嗽?執(zhí)行程序的過程中不報(bào)錯(cuò)就做一個(gè)try異常捕獲
第二種find_elements_by_xpath()匹配到所有元素,就是以一
個(gè)數(shù)組返回,如果沒有匹配到那么就會(huì)返回一個(gè)空數(shù)組
4.通過鏈接文本匹配對(duì)象
text = driver.find_element_by_link_text('知乎')
四.selenium頁面交互方法
1.給輸入框中輸入值(send_keys())
首先要定位到輸入框
input = driver.find_element_by_id('query')
input.send_keys('周杰倫')
2.點(diǎn)擊按鈕方法(click())
button = driver.find_element_by_id('stb')
input.click()
3.回退到上一個(gè)網(wǎng)頁的方法(back())
driver.back() #這個(gè)driver是瀏覽器驅(qū)動(dòng)實(shí)例化的一個(gè)對(duì)象
4.前進(jìn)到下一個(gè)網(wǎng)頁follow()
driver.follow()
5.close()關(guān)閉當(dāng)前窗口,如果它是當(dāng)前打開的最后一個(gè)窗口則會(huì)退出瀏覽器
driver.close()
6.quit()退出驅(qū)動(dòng)程序,并關(guān)閉所有相關(guān)的窗口
driver.quit()
7.執(zhí)行js代碼達(dá)到滑動(dòng)滾動(dòng)條用來渲染數(shù)據(jù),寫完之后用driver.execute_script()方法執(zhí)行js代碼
js = 'window.scrollTo(0,document.body.scrollHeight)'
driver.execute_script(js)
五.selenium獲取元素信息
1.獲取屬性值get_attribute()
button = driver.find_element_by_id('stb').get_attribute('value')
2.獲取元素文本
text = driver.find_element_by_id('zhihu').text
3.獲取標(biāo)簽名稱
tag_name = driver.find_element_by_id('zhihu').tag_name
六.selenium等待時(shí)間
1.強(qiáng)制等待(不管頁面數(shù)據(jù)是否渲染完畢都需要等待完所設(shè)置的等待時(shí)間)
from time import sleep
sleep(10) #強(qiáng)制等待十秒
2.隱式等待
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10)
3.顯式等待
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
try:
input = WebDriverWait(driver,5).until(EC.presence_of_element_located((By.ID, 'query')))
input.send_keys('周杰倫')
button = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, 'stb1')))
button.click()
except Exception as e:
print('哥們,超時(shí)了!')
顯式等待和隱式等待的區(qū)別
隱式等待 : 在規(guī)定的時(shí)間內(nèi),渲染元素,如果渲染出來,立即向下執(zhí)行,如果超出時(shí)間沒有渲染出來,就會(huì)拋出異常
顯示等待 : 顯示等待某一個(gè)元素是否加載出來的時(shí)候,加載出來,立馬向下執(zhí)行,沒有加載出來繼續(xù)等待超時(shí)就拋出異常
注意:在使用selenium等待時(shí)間時(shí),為了防止程序在執(zhí)行過程中報(bào)錯(cuò),我們需要去做一個(gè)類似我上面隱式等待中那樣的異常捕獲
七.selenium窗口切換
當(dāng)我們一次性就打開了多個(gè)窗口時(shí),然后直接去獲取所打開的網(wǎng)頁窗口的源代碼,此刻我們會(huì)發(fā)現(xiàn)我們獲取的是第一個(gè)窗口的源代碼而不是我們所想的最后一個(gè)窗口的源代碼,如果在這種時(shí)候想要獲取最后打開的窗口源代碼,就要去使用我們的selenium等待時(shí)間去渲染出我們的網(wǎng)頁數(shù)據(jù),給網(wǎng)頁窗口一個(gè)緩沖時(shí)間
所謂句柄就是當(dāng)前瀏覽器所打開的每一個(gè)窗口的標(biāo)識(shí)符,每個(gè)窗口就是一個(gè)句柄,句柄就是在selenium中用來實(shí)現(xiàn)頁面切換和頁面關(guān)閉的功能
八.selenium_iframe框架的切換
1.主框架切換到子框架
from selenium import webdrive
driver = webdriver.Chrome()
driver.get('https://mail.qq.com/')
driver.switch_to.frame('login_frame')
2.切換到主框架
from selenium import webdrive
driver = webdriver.Chrome()
driver.get('https://mail.qq.com/')
driver.switch_to.frame('login_frame')
driver.switch_to.default_content()
3.嵌套iframe框架的切換
<iframe>
<iframe id="l1">
<iframe id="l2"></iframe>
</iframe>
</iframe>
driver.switch_to.frame('l1')
driver.switch_to.frame('l2')
4.切換到iframe的父框架
driver.switch_to.parent_frame()
切換框架時(shí)要注意事項(xiàng)
1.有id 直接寫id值進(jìn)行切換
2.有name 并且唯一,直接寫name進(jìn)行切換
3.沒有id,沒有name 先定位到iframe元素,在切換到對(duì)應(yīng)的框架
例如:
iframe = driver.find_elements_by_tag_name(‘iframe’)[0]
driver.switch_to.frame(iframe)
九.selenium動(dòng)作鏈的使用
1.實(shí)例化一個(gè)動(dòng)作鏈對(duì)象
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
action = ActionChains(driver)
2.動(dòng)作鏈方法
I 將鼠標(biāo)移動(dòng)到某一個(gè)元素上
move_to_element(element)
action.move_to_element(input)
II 將鼠標(biāo)移動(dòng)到當(dāng)前鼠標(biāo)位置偏移處(單位是px)
move_by_offset(xoffset,yoffset)
III 輸入內(nèi)容到標(biāo)簽處
send_keys_to_element(element,key)
action.send_keys_to_element(input, '周杰倫') # 在輸入框輸入周杰倫
IV 點(diǎn)擊
click()
V 執(zhí)行相關(guān)動(dòng)作鏈的操作
perform()
action.perform()
VI 點(diǎn)擊一個(gè)元素不松開(長(zhǎng)按)
click_and_hold(element)
VII右鍵點(diǎn)擊
context_click(element)
VIII 雙擊某一個(gè)元素
double_click(element)
十.下拉框
十一.滑動(dòng)滾動(dòng)條
十二.英雄聯(lián)盟英雄皮膚抓取案例
from selenium import webdriver
import requests
from lxml import etree
import os
if not os.path.exists('./英雄聯(lián)盟皮膚大全'): #創(chuàng)建一個(gè)根文件夾
os.mkdir('./英雄聯(lián)盟皮膚大全')
driver = webdriver.Chrome()
driver.get('https://lol.qq.com/data/info-heros.shtml#Navi')
driver.implicitly_wait(5)#隱式等待5s
# print(driver.page_source)
tree = etree.HTML(driver.page_source)
hero_list = tree.xpath('//ul[@id="jSearchHeroDiv"]/li') #英雄列表
for hero in hero_list:
herf = 'https://lol.qq.com/data/' + hero.xpath('./a/@href')[0] #英雄的詳細(xì)鏈接
driver.get(url=herf)
driver.find_element_by_xpath('//ul[@id="skinNAV"]/li[2]').click() #這里存在一個(gè)懶加載(解決懶加載)
#數(shù)據(jù)解析
detail_tree = etree.HTML(driver.page_source)
images = detail_tree.xpath('//ul[@id="skinBG"]/li/img') #
main_name = detail_tree.xpath('//h1[@id="DATAname"]/text()')[0]
nick_name = detail_tree.xpath('//h2[@id="DATAtitle"]/text()')[0]
name = main_name+nick_name #文件夾名稱
if not os.path.exists('./英雄聯(lián)盟皮膚大全/'+name):
os.mkdir('./英雄聯(lián)盟皮膚大全/'+name)
for img in images:
img_src = img.xpath('./@src')[0]#皮膚圖片鏈接
img_title = img.xpath('./@alt')[0] #皮膚名字
suffix =img_src.split('.')[-1] #皮膚圖片的后綴
content = requests.get(url=img_src).content
#保存數(shù)據(jù)
with open('./英雄聯(lián)盟皮膚大全/'+name+'/'+img_title+'.'+suffix,'wb') as f:
f.write(content)
print(f'{img_title}----保存成功!')
抓取細(xì)節(jié)
當(dāng)此網(wǎng)頁存在懶加載時(shí),我們需要先解決懶加載問題,再去獲取網(wǎng)頁數(shù)據(jù)源碼進(jìn)行數(shù)據(jù)解析
十三.無界面瀏覽器抓取
所謂無界面瀏覽器抓取就是當(dāng)我們?cè)谑褂胹elenium抓取網(wǎng)頁數(shù)據(jù)時(shí),會(huì)自動(dòng)請(qǐng)求打開瀏覽器界面,不利于看到我們的抓取效果,這個(gè)時(shí)候就可以使用無頭瀏覽器來解決此問題.
使用方法
1.導(dǎo)入模塊
from selenium.webdriver.chrome.options import Options
2.實(shí)例化一個(gè)options對(duì)象
options = Options()
3.給options對(duì)象添加一個(gè)無頭參數(shù)
options.add_argument('--headless')
4.將options對(duì)象傳入driver驅(qū)動(dòng)對(duì)象中
driver = webdriver.Chrome(options)
十四.不顯示自動(dòng)測(cè)試
不顯示自動(dòng)測(cè)試就是在我們使用selenium抓取數(shù)據(jù)的時(shí)候?yàn)g覽器的菜單欄上面會(huì)有一個(gè)"受到自動(dòng)軟件測(cè)試控制"的標(biāo)識(shí),我們可以通過我下列方法解決
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_experimental_option('useAutomationExtension', False)
options.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome(options=options)
driver.maximize_window()
driver.get('https://www.sogou.com/')
print(driver.page_source)
使用前
使用后
十五.selenium反檢測(cè)
就是當(dāng)你執(zhí)行程序時(shí)你的數(shù)據(jù)沒有抓取到,就是有可能被瀏覽器的反爬機(jī)制給監(jiān)視到了,可以用這個(gè)試試
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_argument('--disable-blink-features=AutomationControlled')
driver = webdriver.Chrome(options=options)
driver.maximize_window()
driver.execute_cdp_cmd(
"Page.addScriptToEvaluateOnNewDocument", {
"source": '''
Object.defineProperty(navigator,'webdriver',{
get:()=>undefined
})
'''
}
)
driver.get('https://www.sogou.com/')
print(driver.page_source)
十六.抖音視頻爬取案例
from selenium import webdriver
import requests
from lxml import etree
from time import sleep
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
chrome_options.add_argument('User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36')
driver = webdriver.Chrome(options=chrome_options)
# driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.douyin.com/user/MS4wLjABAAAAEFD7UfHGL0ppALoDm8h1LB95hfM0ocEVARtOCgqkMfo')
driver.implicitly_wait(5)
js = 'window.scrollTo(0,document.body.scrollHeight)'
videoInfo = [] # 存儲(chǔ)最終結(jié)果
for second in range(15):
driver.execute_script(js)
sleep(1)
# 獲取源碼解析數(shù)據(jù)
tree = etree.HTML(driver.page_source)
a_link = tree.xpath('//*[@id="root"]/div/div[2]/div/div/div[4]/div[1]/div[2]/ul/li/a/@href') # 詳細(xì)頁面鏈接
title_list = tree.xpath('//*[@id="root"]/div/div[2]/div/div/div[4]/div[1]/div[2]/ul/li/a/div/p/text()') # 名字
for index in range(int(len(title_list))):
# print(1)
item = {}
link = 'https:' + a_link[index]
driver.get(url=link)
driver.implicitly_wait(3)
detail_tree = etree.HTML(driver.page_source)
vedio_link = 'https:' + detail_tree.xpath('//video/source[1]/@src')[0] # 視頻鏈接
item['video'] = vedio_link
item['title'] = title_list[index]
videoInfo.append(item)
with open('./douyin.json', 'a+', encoding='utf-8') as f:
f.write(str(item))
print(f'{item["title"]}----下載完畢!')
報(bào)了此錯(cuò)誤,數(shù)據(jù)抓取不到,可以推斷有反爬,可以使用我們前面的反檢測(cè)進(jìn)行嘗試.
在程序前面加上此段代碼也可以文章來源:http://www.zghlxwxcb.cn/news/detail-453174.html
17.總結(jié)
本章博客主要是介紹Google驅(qū)動(dòng)的安裝以及selenium由初階---->高階的使用方法,有反爬案例解析文章來源地址http://www.zghlxwxcb.cn/news/detail-453174.html
到了這里,關(guān)于快來學(xué)selenium初階到高階的使用,反爬的案例解析,google驅(qū)動(dòng)的安裝配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!