这两天学了一下selenium的基础操作,在这里记录一下
一、下载安装,下载驱动
1.下载
selenium可以直接通过 pip install selemium直接在pycharm中下载,
2.下载浏览器驱动
驱动下载需要根据自己的浏览器和浏览器版本去下载,尽量下载相近的版本,不然可能会出现一些问题。我用的是谷歌浏览器。下载地址:https://chromedriver.com/api/known-good-versions-with-downloads.json。
二、找标签
1.找单个标签
tag = driver.find_element(By.ID, "user")#通过id
tag = driver.find_element(By.CLASS_NAME, "c1")通过classname
tag = driver.find_element(By.TAG_NAME, "div")通过tagname
tag = driver.find_element(By.XPATH, ‘’)通过xpath
2.找所有标签
ag = driver.find_elements(By.ID, "user")#通过id
tag = driver.find_elements(By.CLASS_NAME, "c1")通过classname
tag = driver.find_elements(By.TAG_NAME, "div")通过tagname
tag = driver.find_elements(By.XPATH, ‘’)通过xpath
被发现了,就是多了个s,嘿嘿
示例代码:
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
#初始化
service = Service("./chromedriver.exe")#加载驱动
driver = webdriver.Chrome(service=service)#绑定浏览器
#请求网页
#这里不像requests一样,没有返回网页信息
#想要网页信息:res = driver.get("https://5xclass.cn/course/").page_source
driver.get("https://5xclass.cn/course/")
#找标签
# li_list= driver.find_elements(By.XPATH, "//*[@id='bs-example-navbar-collapse-1']/ul[1]/li")
lists = driver.find_element(By.ID, "bs-example-navbar-collapse-1")
lists = lists.find_elements(By.TAG_NAME,'a')
for list in lists:
print(list.text)
# for li in li_list:
# a = li.find_element(By.XPATH,'a')
# print(a.text)
#关闭浏览器
driver.close()
3.通过其他规则找标签
也可以在selenium中通过其他规则比如bs4,re等找到需要的标签。
示例代码:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
service = Service("driver/chromedriver.exe")
driver = webdriver.Chrome(service=service)
driver.implicitly_wait(10)
driver.get('https://car.yiche.com/')
html_string = driver.page_source
soup = BeautifulSoup(html_string, features="html.parser")
tag_list = soup.find_all(name="div", attrs={"class": "item-brand"})
for tag in tag_list:
child = tag.find(name='div', attrs={"class": "brand-name"})
print(child.text)
driver.close()
这里需要注意的是在selenium中找到标签后想要获得标签内的内容需要用
得到的标签.text:div.text
想要得到属性的值:div.get_attribute('属性名')
三、点击,输入操作
在找到标签后就该进行点击了
1.点击
tag.click()
2.输入
tag.send_kes(‘输入内容’)
四、携带cookie
在进行网络请求中,携带cookie是必不可少的。
driver.add_cookie({'name': 'foo', 'value': 'bar'})
name是cookie的键,而value是值
示例代码:
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
service = Service("driver/chromedriver.exe")
driver = webdriver.Chrome(service=service)
# 注意:一定要先访问,不然Cookie无法生效
driver.get('https://dig.chouti.com/about')
# 加cookie
driver.add_cookie({
'name': 'token',
'value': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqaWQiOiJjZHVfNDU3OTI2NDUxNTUiLCJleHBpcmUiOiIxNzA0MzI5NDY5OTMyIn0.8n_tWcEHXsBSXWIY9rBoGWwaLPF8iWIruryhKTe5_ks'
})
# 再访问
driver.get('https://dig.chouti.com/')
time.sleep(2000)
driver.close()
这个感觉有点鸡肋了,或者我还没看到他真正的用法。
五、代理IP
selenium中的代理ip用法和requests中的有一些区别
在selenium中得到ip和端口后,需要把ip加入option中,在driver.get中放入。
示例代码:
import requests
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
#获取ip
resp = requests.get(url = 代理)
proxy_string = resp.text
print(proxy_string)
#初始化
service = Service('./chromedriver.exe')
#实例化ChromeOptions
opt = webdriver.ChromeOptions()
#设置
opt.add_argument(f'--proxy-server={proxy_string}')
#添加
driver = webdriver.Chrome(service=service,options=opt)
#
driver.get('https://dig.chouti.com/about')
sleep(3)
driver.close()
五、特征检测和绕过
在我们用哦selenium访问网站时,状态栏位置总会显示一行字,而这就是浏览器的一些特征,有些网站会检测这些特征,检测到时自动化工具后会拒绝访问,所以在使用selenium中隐藏这些特征是必不可少的,直接看示例代码:
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
#初始化
service = Service('./chromedriver.exe')
opt = webdriver.ChromeOptions()
#禁止显示“Chrome正在受到自动测试软件的控制”等信息提示栏
opt.add_argument('--disable-infobars')
#排除 enable-automation 开关,隐藏自动化测试的痕迹,从而降低被识别为自动化程序的风险
opt.add_experimental_option("excludeSwitches", ["enable-automation"])
#禁用 Chrome 浏览器中的自动化扩展程序,这有助于减少浏览器检测到自动化测试的可能性。
opt.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(service=service,options=opt)
with open('./hide.js','r',encoding='utf-8') as f:
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": f.read()})
driver.get('https://www.baidu.com')
time.sleep(10)
driver.close()
需要注意的是示例代码中的js文件是必须要用的。
六、无头模式
无头模式就是不弹出浏览器,而让浏览器在后台慢慢执行,这一般是调试好,没有什么问题后才添加的
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
service = Service('./chromedriver.exe')
opt = webdriver.ChromeOptions()
opt.add_argument('--headless')
driver = webdriver.Chrome(service=service,options=opt)
driver.get('https://www.baidu.com')
time.sleep(5)
driver.close()
七、截图
用selenium截图估计也就验证码的时候有用了吧
找到图片标签tag后
截屏保存
tag.screenshot('./baidu.png')
截图并返回二进制信息
bady = tag.screenshot_as_png
print(f"二进制:{bady}")
截图并把二进制信息base64加密再返回
bady2 = tag.screenshot_as_base64
print(f"Base64:{bady2}")
示例代码:
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
service = Service('./chromedriver.exe')
opt = webdriver.ChromeOptions()
#opt.add_argument('--headless')
driver = webdriver.Chrome(service=service,options=opt)
driver.get('https://www.baidu.com')
tag = driver.find_element(By.XPATH, '//*[@id="head_wrapper"]/div/div')
tag.screenshot('./baidu.png')
bady = tag.screenshot_as_png
print(f"二进制:{bady}")
bady2 = tag.screenshot_as_base64
print(f"Base64:{bady2}")
time.sleep(5)
driver.close()
初学selenium还有很多没学到,以后补充。
版权归原作者 某得感情 所有, 如有侵权,请联系我们删除。