就直接从案例下手就行了
安装很简单
pip install selenium
还需要找个chromedriver这个是针对浏览器的 这是谷歌的 你要别的,再找
https://npmmirror.com/mirrors/chromedriver
还得看浏览器的版本才行
定位元素
查找元素 最通用的就是xpath, 其他还有很多,xpath要用的熟悉才好
chrome.find_element(By.XPATH,'')
切换
一.打开2个页面
这里要做切换,不然你看着是切换了,实际上没切换,切换完了 还得切换回来
browser.switch_to.window(browser.window_handles[-1]) # 跳转到最后一个窗口
job_detail = browser.find_element(By.XPATH, '//*[@id="job_detail"]/dd[2]').text
browser.close() # 用完了就关闭
browser.switch_to.window(browser.window_handles[0]) # 再切换回来
二. iframe
这个玩意相当于网页里又套了个网页 ,方法就是先找到iframe,然后再切换
iframe = chrome.find_element(By.XPATH, '//div[@class="QUI_POP_CONT"]/iframe[1]')
chrome.switch_to.frame(iframe)
关于等待
等待是分3种情况
time.sleep(10) # 这个是死等 必须10秒
web.implicitly_wait(10) # 这个是活等,且全局的,就是最多等10秒加载,不加载拉倒
这个死等和活等通常要配合一起用,有的时候比如验证码,在活等后,还没完全加载,然后去操作就有问题,所以再加一个死等
WebDriverWait(web, 10, 0.5).until(
EC.presence_of_element_located((By.XPATH, "/html/body/div[5]/div[2]/div[1]/div/div"))
) # 这个玩意叫单等,单独等一个xxxx元素. 如果出现了. 就过, 如果不出现. 超时后, 直接报错. 等10秒,每0.5秒去看下这个元素出现没有
关于cookies操作
登录后,获得cookies 写到文件里 ,再登录就加载cookies ,就自动登录了
骚操作就比如登录后,加载cookies 就requests 干页面,但是,cookies有过期时间,这是服务器设置的 ,这块我直接干代码
cookies_list = web.get_cookies() # 从selenium对象登录、获得cookies list
这货就是[{},{}] 长这样,列表里套字典 ,而且这个东西跟request的cookies 不通用,然后下面的代码 可以转成requests的cookies
这个方法就是存cookies到文件
def save_website_cookies(filename, cookies_lists):
with open(filename, 'a', encoding='utf-8') as file_object:
file_object.write(json.dumps(cookies_lists))
转换到requests的cookies
def get_book_shelf_content(cookies_lists):
cookies_dict = {}
for items in cookies_lists:
key = items['name']
value = items['value']
cookies_dict[key] = value
print(cookies_dict)
那么如何登录并加载cookies呢? 看下面的代码
# 第一个函数就是读刚才写入的cookies文件,返回列表
def load_website_cookies(filename):
with open(filename, 'r', encoding='utf-8') as file_object:
ck_list = json.loads(file_object.read())
return ck_list
# 第二个函数,就是传进来个一个url ,cookies文件,和selenium对象,这个函数调用了第一个函数
def login_website_load_cookies(site_url, cookies_file, chrome):
chrome.get(site_url) # 先登录下
time.sleep(5) # 死等5秒 让网页加载cookies
cookies_list = load_website_cookies(cookies_file)
for cookie in cookies_list:
chrome.add_cookie(cookie)
chrome.get(site_url) # 重新刷新网页
选项
这个就是selenium的选项 ,这个都是写死的 没啥 我就写几个
# 配置无头信息
from selenium.webdriver.chrome.options import Options
opt = Options()
opt.add_argument("--headless")
opt.add_argument("--disable-gpu")
注意, 此时我们要了解一下这个插件的工作机制. 它是在整个页面加载的时候就开始对浏览器参数进行读取. 所以我们常规的对Chrome设置是无效的. 此时, 需要添加以下一段代码来规避检测.
# 亲测, 88版本以后可以用.
option = Options()
# option.add_experimental_option('excludeSwitches', ['enable-automation'])
option.add_argument('--disable-blink-features=AutomationControlled') # 就这一行
web = Chrome(options=option)
# 亲测, 88版本之前可以用,加下面的脚本
# web = Chrome()
#
# web.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
# "source": """
# navigator.webdriver = undefined
# Object.defineProperty(navigator, 'webdriver', {
# get: () => undefined
# })
# """
# })
**1. 总结, selenium的使用方案一般是:
1. 涉及登录. 验证码不想搞.
可以考虑用selenium完成登录. 然后提取cookie. 最后用requests发送真正的请求.
2. 涉及频繁的校验验证(例如boss).
直接用selenium提取页面源代码. 叫给lxml处理.**
后边文章总结下 对付验证码的方法