一、selenium
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器,可以接收指令,让浏览器自动加载页面,获取需要的数据,也可以页面截屏。
三个都能用
pip install selenium #
pip install selenium-wire #
pip install drissionpage #
chromedriver 驱动安装
方式一:http://chromedriver.storage.googleapis.com/index.html
方式二:http://npm.taobao.org/mirrors/chromedriver/
将其拷贝到任意环境变量目录
echo $PATH查看环境变量路径
二、selenium基本操作
-
查看请求信息
driver.page_source 获取源码 driver.get_cookies() 获取浏览器中存储的cookies driver.current_url 查看当前url driver.title 查看当前标签的标题
-
元素定位方式
driver.find_element_by_xxx() 使用场景: 一般用于精确定位一个元素,返回结果为一个element对象 driver.find_elements_by_xxx () 使用场景: 定位一组元素,返回结果为element对象列表
el = driver.find_element_by_xpath('//div[@class="eeee"]/a') (调用方式 el = driver.find_elements_by_id 使用id值定位 el = driver.find_elements_by_xpath 使用xpath定位 el = driver.find_elements_by_tag_name 使用标签名定位 el = driver.find_elements_by_link_text 使用文本定位 el = driver.find_elements_by_partial_link_text 使用部分文本定位 el = driver.find_elements_by_name 使用name属性值定位 el = driver.find_elements_by_class_name 使用class属性值定位 el = driver.find_elements_by_css_selector 使用css选择器定位 dirver.find_element_by_css_selector('#名字') dirver.find_element_by_css_selector('.s_ipt') dirver.find_element_by_css_selector('input') dirver.find_element_by_css_selector('[id="kw"]') # 组合形式 dirver.find_element_by_css_selector('input.s_ipt') dirver.find_element_by_css_selector('input > span > a')
by_link_text() 全部文本且文本包含连接 by_partial_link_text() 包含某个文本且文本包含链接
-
对定位到的元素的操作
el.click() 对元素执行点击操作 el.submit() 对元素执行提交操作 el.clear() 清空可输入元素中的数据 el.send_keys(data) 向可输入元素输入数据
-
从定位到的元素中提取数据的方法
el.get_attribute(key) 获取key属性名对应的属性值 el.text 获取开闭标签之间的文本内容
-
elenium执行js
js = "window.scrollTo(x,y) " x为水平拖动距离,y为垂直拖动举例
三、selenium等待方式
为什么需要等待
浏览器进行渲染内容过多, 网速太慢
为了提高脚本的稳定性,我们需要在脚本中增加等待时间,否则报错
-
强制等待
time.sleep(6)
-
显式等待
from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait #WebDriverWait库 负责循环等待 from selenium.webdriver.support import expected_conditions as EC #expected_conditions类 负责条件 form selenium.common.exceptions import TimeoutException #超时异常
判断页面是否已经加载出来
presence_of_all_elements_located
显式等待指定某个条件,然后设置最长等待时间。如果在这段时间还没有找到元素,那么便会抛出异常。
WebDriverWait(driver,10,0.5).until( EC.presence_of_element_located((By.ID, "myDynamicElement") )
定一一个
WebDriver
,将浏览器对象放进去,等待10秒,每隔0.5秒去定位一下想要的元素(此处通过id形式,拿myDynamicElement
去定位一个元素)判断当前的元素是否可以点击 WebDriverWait(driver, 10, 0.5).until( EC.element_to_be_clickable((By.ID, "myDynamicElement") )
-
隐式等待
就是简单地设置一个最大等待时间,单位为秒, 所有的元素定位操作都会使用该时间
driver.implicitly_wait(10)
四、 无头浏览器、frame应用与设置
- 无头浏览器
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By #创建一个无头浏览器对象 chrome_options = Options() #设置它为无框模式 chrome_options.add_argument('--headless') #如果在windows上运行需要加代码 chrome_options.add_argument('--disable-gpu') chrome_options.add_argument("--proxy-server=http://代理服务器地址:代理服务器端口号") browser = webdriver.Chrome(chrome_options=chrome_options)
- selenium 在frame应用
browser.get('http://gn.gov.cn/Infd.aspx?TenderProject=Co%3D') browser.find_element_by_id('bidderNoticeInfos').click() reference = browser.switch_to.frame("frame") print(browser.page_source)
五、selenium在scrapy中简单使用
middlewars.py
import time
from selenium import webdriver
from scrapy.http import HtmlResponse
class SeliniumMilldewares(object):
def process_request(self, request, spider):
url = request.url
# 判断页面是否需要渲染
if 'monthdata' in url: #用来判断具体的url请求使用selinium
dr = webdriver.Chrome()
# 有可能页面加载完了,数据还没加载完
dr.get(url)
time.sleep(7)
data = dr.page_source #用于获取渲染之后的源码
# 关闭浏览器
dr.close()
# 构建响应
res = HtmlResponse(
url= url,
request=request,
body=data.encode(),
encoding="utf-8",
)
return res
在setting配置一下就可以了
六、其他
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
from selenium.common.exceptions import TimeoutException
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 3, 3)
def login_felima(loginname, loginpassword):
driver.get('http://www.****.com/')
try:
name = wait.until(EC.presence_of_element_located((By.ID,'loginname')))
name.send_keys('{}'.format(loginname))
password = wait.until(EC.presence_of_element_located((By.ID, 'loginpassword')))
password.send_keys('{}'.format(loginpassword))
submit = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="logFrm"]/div[4]/input')))
submit.click()
captcha = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="account"]')))[0]
captcha.click()
wait.until(EC.presence_of_element_located((By.ID, 'keyword'))).clear()
p = WebDriverWait(driver, 3, 3).until(EC.presence_of_element_located((By.ID, 'show_info'))).text
phone = WebDriverWait(driver, 3, 3).until(EC.presence_of_element_located((By.ID, 'txtPhone'))).get_attribute('value')
element = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located(By.ID, 'mydynmicElement'))
# 判断页面是否加载出来
#presence_of_all_elements_located
#element_to_be_clickable
except TimeoutException:
return login_felima(loginname, loginpassword)
def main():
loginname = ''
loginpassword = ''
login_felima(loginname, loginpassword)
if __name__ == '__main__':
main()