一.安装
pip3 install selenium
selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题
selenium本质是通过驱动浏览器,完全模拟浏览器的操作。
比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器
官网:http://selenium-python.readthedocs.io
二、安装浏览器驱动
a..谷歌
1.点击下载chrome的webdriver:http://chromedriver.storage.googleapis.com/index.html
注意:对于chrome浏览器,有时候会有闪退的情况,有时候也许是版本冲突的问题
2.将下载文件,放入python文件 下的 Scripts文件,解压
或者在cmd,输入
这样,OK!
b.Firefo浏览器
可下载地址:https://github.com/mozilla/geckodriver/releases/
三.开始
初步体验:
from selenium import webdriver browser = webdriver.Chrome() browser.get('http://www.jiemian.com/') #在Chome,打开此网址
开始使用:
from selenium import webdriver # 驱动浏览器 from selenium.webdriver import ActionChains # 滑动验证 from selenium.webdriver.common.by import By # 选择器 from selenium.webdriver.common.keys import Keys # 模拟键盘的按键 from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait # 与EC联用,等待某个元素被加载 import time browser = webdriver.Chrome() try: wait = WebDriverWait(browser, 10) browser.get('https://www.taobao.com/') # By.CSS_SELECTOR # By.CLASS_NAME # By.XPATH # By.ID # By.TAG_NAME # inp_tag1=browser.find_element(By.CSS_SELECTOR,'#kw') #browser.find_element_by_id('kw') inp_tag1=browser.find_element(By.ID,'q') #browser.find_element_by_class('kw') inp_tag1.send_keys('iphoneX') button=wait.until(EC.presence_of_element_located((By.CLASS_NAME,'btn-search'))) # button.click() button.send_keys(Keys.ENTER) wait.until(EC.presence_of_element_located((By.CLASS_NAME,'inner'))) page_next=browser.find_element(By.CSS_SELECTOR,'.next a') print(page_next) page_next.click() #拿到标签的属性 attr=page_next.get_attribute('data-value') print(attr) #拿到标签的内容 span = browser.find_element(By.CSS_SELECTOR, '.next span') print(span.text) time.sleep(100) finally: browser.close()
from selenium import webdriver #驱动浏览器 from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By #选择器 from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait #与EC连用,等待某个元素被加载 import time browser = webdriver.Chrome() wait = WebDriverWait(browser,10) browser.get('https://www.baidu.com') input_tag = browser.find_element_by_id('kw') input_tag.send_keys('啤酒') #输入搜索词 button = browser.find_element_by_id('su') #点击搜索 button.click() wait.until(EC.presence_of_element_located((By.ID,'content_left'))) #等标签content_left,加载完, res = browser.page_source with open('a.html','w',encoding='utf-8') as f: f.write(res) time.sleep(20) browser.close() #关闭
四.三种选择器
from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR from selenium.webdriver.common.keys import Keys #键盘按键操作 from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素 browser=webdriver.Chrome() browser.get('https://www.baidu.com') #以下三种方式达到的都是同一种效果:查找id为kw的标签 input_tag1=browser.find_element(By.ID,'kw') #等同于:input_tag1=browser.find_element_by_id('kw') input_tag2=browser.find_element(By.CSS_SELECTOR,'#kw') #等同于:input_tag2=browser.find_element_by_css_selector('#kw') input_tag3=browser.find_element(By.XPATH,'//*[@id="kw"]') #等同于:input_tag3=browser.find_element_by_xpath('//*[@id="kw"]') #注意:browser.find_elements系列与browser.find_element的区别就是,前者是查找多个,后者是只找第一个 div1=browser.find_element(By.CSS_SELECTOR,'div') #找到第一个div标签 div2=browser.find_elements(By.CSS_SELECTOR,'div') #找到所有的div标签,放到列表里 browser.close()
from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR from selenium.webdriver.common.keys import Keys #键盘按键操作 from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素 browser=webdriver.Chrome() browser.get('https://www.amazon.cn/') wait=WebDriverWait(browser,10) wait.until(EC.presence_of_element_located((By.ID,'cc-lm-tcgShowImgContainer'))) tag=browser.find_element(By.CSS_SELECTOR,'#cc-lm-tcgShowImgContainer img') #获取标签属性, print(tag.get_attribute('src')) #获取标签ID,位置,名称,大小(了解) print(tag.id) print(tag.location) print(tag.tag_name) print(tag.size) browser.close()
五.等待元素被加载
#1、selenium只是模拟浏览器的行为,而浏览器解析页面是需要时间的(执行css,js),一些元素可能需要过一段时间才能加载出来,为了保证能查找到元素,必须等待 #2、等待的方式分两种: 隐式等待:在browser.get('xxx')前就设置,针对所有元素有效 显式等待:在browser.get('xxx')之后设置,只针对某个元素有效
from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR from selenium.webdriver.common.keys import Keys #键盘按键操作 from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素 browser=webdriver.Chrome() #隐式等待:在查找所有元素时,如果尚未被加载,则等10秒 browser.implicitly_wait(10) browser.get('https://www.baidu.com') input_tag=browser.find_element_by_id('kw') input_tag.send_keys('美女') input_tag.send_keys(Keys.ENTER) contents=browser.find_element_by_id('content_left') #没有等待环节而直接查找,找不到则会报错 print(contents) browser.close()
from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR from selenium.webdriver.common.keys import Keys #键盘按键操作 from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素 browser=webdriver.Chrome() browser.get('https://www.baidu.com') input_tag=browser.find_element_by_id('kw') input_tag.send_keys('美女') input_tag.send_keys(Keys.ENTER) #显式等待:显式地等待某个元素被加载 wait=WebDriverWait(browser,10) wait.until(EC.presence_of_element_located((By.ID,'content_left'))) contents=browser.find_element(By.CSS_SELECTOR,'#content_left') print(contents) browser.close()
六.元素交互操作
from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR from selenium.webdriver.common.keys import Keys #键盘按键操作 from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素 import time browser = webdriver.Chrome() try: browser.get('https://www.baidu.com') browser.execute_script('alert("hello world")') #打印警告 finally: time.sleep(10) browser.close()