selenium
selenium的前进与后退切换选项卡
前进与后退
from selenium.webdriver import Chrome
import time
切换选项卡
web = Chrome()
web.get('https://movie.douban.com/top250')
music = web.find_element_by_css_selector('.global-nav-items > ul > li:nth-child(4)')
music.click()
time.sleep(2)
web.switch_to.window(web.window_handles[0])
time.sleep(2)
web.switch_to.window(web.window_handles[1])
selenium等待
隐式等待
- 如果设置了隐式等待时间,那么浏览器对象在通过find_element相关方法获取标签时
- 如果获取不到,那么会在指定时间内多次尝试获取该标签,超过指定时间才会报错
- 设置隐式等待时间只需要设置一次,全局有效
web.implicitly_wait(2)
显式等待
-
规定时间内等到满足某个条件 -
创建等待对象:WebDriverWait(浏览器对象, 超时时间[, 检测时间间隔=500ms]) -
等待对象.until(条件) - 等到指定条件为True,获取指定标签 -
等待对象.until_not(条件) - 等到指定条件为False,获取指定标签 -
常见条件:
-
EC.presence_of_element_located((By.标签获取方式, 获取方式值))
- 判断某个元素是否被加到dom树里(判断某个标签是否加载到网页中,不一定可见),条件成立事返回标签
-
EC.visibility_of_element_located
- 判断某个标签是否可见(没有隐藏,并且元素的宽度与高度不等于0),条件成立返回标签
-
EC.text_to_be_present_in_element(())
- 判断某个标签中的标签内容是否包含了预期的字符串,条件成立返回True
-
EC.text_to_be_present_in_element_value(())
- 判断某个标签的value属性是否包含了预期的的字符串,条件成立返回True
-
EC.element_to_be_clickable()
wait = WebDriverWait(web, 5)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'css选择器')))
wait.until(EC.visibility_of_element_located((By.ID, 'id属性值')))
wait.until(EC.text_to_be_present_in_element((By.ID, 'id属性值'), '请登录'))
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'css选择器')))
writ = WebDriverWait(web, 3)
a = writ.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.widget-channel-links.section-container > a:nth-child(3)')))
a.click()
a = writ.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'.widget-channel-links.section-container > a:nth-child(3)'), '女性'))
print(a)
a = writ.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.links.links--_D4pI > a:nth-child(3)')))
a.click()
页面滚动
max_height = 8900
height = 500
while True:
web.execute_script(f'window.scrollTo(0, {height})')
height += 500
time.sleep(1)
if height > max_height:
break
网页嵌套爬取解决办法
网易邮箱登录
-
前端实现网页功能的时候可能出现网页中嵌套网页的现象 -
如果要在一个网页中嵌套另外一个网页,必须使用iframe标签 -
selenium爬取的时候,通过浏览器对象默认获取到的是最外层的html对应的网页 -
如果要获取嵌套页面中的内容,必须通过switch_to来切换到iframe里的网页内容
options = ChromeOptions()
options.add_experimental_option("excludeSwitches", ['enable-automation', 'enable-logging'])
web = Chrome(options=options)
web.get('https://mail.163.com/')
frame = web.find_element_by_css_selector('#loginDiv > iframe')
web.switch_to.frame(frame)
input_username = web.find_element_by_class_name('j-nameforslide')
input_username.send_keys('邮箱账号')
input_passwd = web.find_element_by_class_name('dlpwd')
input_passwd.send_keys('邮箱密码')
login_chick = web.find_element_by_id('dologin')
login_chick.click()
爬虫流程
- requests + url
- requests + url + User-Agent
- 如果需要登录:requests + url + User-Agent + Cookie
- 找json接口
- 使用selenium
|