协程、Seleniium

协程:协程拥有自己的CPU寄存器上下文,所占用的资源非常少,当我们在携程中遇到耗时操作时,我们会从一个携程切换到另一个协程,这时会把相关数据保存在CPU寄存器上下文,当耗时操作结束的时候,再切回到原来协程中,会从CPU寄存器上下文取出之前保存的相关数据,接着之前暂停的位置继续执行,其实协程也是一个并发操作,因为占用的资源少,可以实现高并发。

selenium

selenium是一个web自动化测试工具,可以直接运行在浏览器上,
但并不自带浏览器,需要有浏览器驱动,selenium可以根据代码指令让浏览器自动加载页面
得到的页面源码是经过浏览器渲染之后的
就可以在页面源码里寻找节点(动态加载的网页,模拟登陆)

安装 : pip3 install selenium

selenium_used:
from selenium import webdriver
import time
# 加载页面(谷歌)
# 设置为无头浏览器
opt = webdriver.ChromeOptions()
opt.set_headless()
driver = webdriver.Chrome(
    options=opt,
    executable_path = 'C:\\Users\\Administrator\\Desktop\\chromedriver.exe'
)
# 设置页面加载时间
driver.set_page_load_timeout(10)
# driver.save_screenshot('baidu.png')
# 导入容错的模块
from selenium.common import exceptions
try:
    driver.get('https://www.baidu.com/')
except exceptions.TimeoutException as err:
    print(err, '请求超时')

# 可以获取的页面信息
# 获取页面源码(经过浏览器渲染之后的)
page_html = driver.page_source
with open('baidu.html','w',encoding='utf-8') as file:
    file.write(page_html)

# 获取所有cookies信息
cookies = driver.get_cookies()

# 获取某一个cookies
# driver.get_cookie('BD_UPN')
cookies_dict = {cookie['name']: cookie['value'] for cookie in cookies}
print(cookies)
print(cookies_dict)

# # 删除cookie
# driver.delete_cookie('BD_UPN')
# # 删除所有cookies
# driver.delete_all_cookies()
# # 添加cookies
# # cookie_dict(字典,存放cookies的信息)
# driver.add_cookie()

# 获取当前加载的页面的url地址
cur_url = driver.current_url
print(cur_url)

# 获取当前浏览器的名称
name = driver.name
print(name)

# 定位和操作标签(节点)
'''
driver.find_element_by_xpath() : 根据xpath路径定位(单个)
driver.find_elements_by_xpath() : 根据xpath路径定位(所有)
driver.find_element_by_css_selector() : 根据css选择器定位标签
driver.find_element_by_link_text() :根据标签文本内容(完整)定位
driver.find_element_by_partial_link_text() : 根据标签文本内容(局部)定位
driver.find_element_by_id() : 根据id属性寻找节点
driver.find_element_by_class_name() : 根据class属性寻找节点
'''
# 找到节点并输入内容
driver.find_element_by_id('kw').send_keys('隔壁老王')
# 清空输入框
driver.find_element_by_id('kw').clear()
time.sleep(3)
driver.find_element_by_id('kw').send_keys('隔壁老赵')
# 找到按钮,模拟点击
driver.find_element_by_id('su').click()

# 保存屏幕截图
driver.save_screenshot('baidu.png')

# 前进后退
time.sleep(2)
driver.back()  #后退
time.sleep(2)
driver.forward()  #前进

# 设置页面等待
# 因为selenium加载页面和浏览器一样都需要时间
# 特别是动态页面,如果在页面加载出来之前,寻找节点会报异常
# 所以这时需要设置页面等待
time.sleep(3)

# 设置隐士等待,是指定特定的时间,如果没有出现我们要寻找的节点,隐士等待会等待一段时间继续查找
driver.implicitly_wait(5)

# 设置显示等待,指定一个最长等待时间,直到某一条件成立,继续执行,如果在指定时间内没有满足条件(没找到节点)就会抛出异常
# 根据某个条件查找节点
from selenium.webdriver.common.by import By
# 设置等待时间
from selenium.webdriver.support.ui import WebDriverWait
# 设置等待条件
from selenium.webdriver.support import expected_conditions
# driver,timeout
a_element = WebDriverWait(driver,10).until(
    expected_conditions.presence_of_all_element_located((By.CLASS_NAME, 'n'))
)
print(a_element.text)

# 获取问的节点和属性
# .get_attribute('href'): 获取标签属性值
try:
    href = driver.find_element_by_xpath('//h3[@class="t"/a]').get_attribute('href')
    # 获取标签文本
    title = driver.find_element_by_xpath('//h3[@class="t"/a]').text
    print(href, title)
except:
    print('没有找到页面节点')

# 隐藏所有图片
imgs = driver.find_elements_by_xpath('//img')
for img in imgs:
    driver.execute_script('$(arguments[0]).fadeOut()', img)

#### 向下滚动到页面底部
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')


# 关闭浏览器
# driver.close()   #关闭当前所在的窗口
# driver.quit()    #退出浏览器

你可能感兴趣的:(协程、Seleniium)