相关资料
https://www.cnblogs.com/kermitjam/p/10863922.html#test33
1、selenium是什么?
selenium最初是一个自动化测试工具,(而爬虫中使用它主要是为了解决requests无法执行javaScript代码的问题。) 可以使用它来帮助我们驱动浏览器自动执行某些自定义好的操作,如:在页面中执行js代码,或者跳过登录验证等。
(自动驱动浏览器,自动打开一个网址)
官网:http://selenium-python.readthedocs.io
2、为什么要用selenium?
(1)优点:使用request模块登录需要分析大量的复杂通信流程,使用selenium可以轻松跳过登录验证。可以使用selenium帮我们实现爬虫
(2)缺点:因为浏览器会加载。html、css、js等,数据,爬虫效率相对比request要低
selenium可以驱动浏览器自动执行自定义好的逻辑代码,也就是可以通过代码完全模拟成人类使用浏览器自动访问目标站点并操作,那我们也可以拿它来做爬虫。
selenium本质上是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等...进而拿到网页渲染之后的结果,可支持多种浏览器。
那么对于爬虫来说,用它有没有好处?有,好处就是可以帮我们避开一系列复杂的通信流程,例如在我们之前学习的requests模块,那么requests模块在模拟请求的时候是不是需要把所有的通信流程都分析完成后才能通过请求,然后返回响应。假如目标站点有一系列复杂的通信流程,例如的登录时的滑动验证等...那么你使用requests模块的时候是不是就特别麻烦了。不过你也不需要担心,因为网站的反爬策略越高,那么用户的体验效果就越差,所以网站都需要在用户的淫威之下降低安全策略。
// selenium,可以跳过登录验证,可以帮着用户发送请求
再看一点requests请求库能不能执行js?是不是不能呀!那么如果你的网站需要发送ajax请求,异步获取数据渲染到页面上,是不是就需要使用js发送请求了。那浏览器的特点是什么?是不是可以直接访问目标站点,然后获取对方的数据,从而渲染到页面上。那这些就是使用selenium的好处!
那用它有没有坏处?使用selenium本质上是驱动浏览器对目标站点发送请求,那浏览器在访问目标站点的时候,是不是都需要把静态资源都加载完毕。html、css、js这些文件是不是都要等待它加载完成。是不是速度特别慢。
那用它的坏处就是效率极低!所以我们一般用它来做登录验证。
二、安装
1.下载并安装:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium
2.下载并安装驱动
'''
selenium支持多种浏览器,但是在使用前必须去下载与浏览器相对应的驱动。
'''
from selenium import webdriver
# 谷歌浏览器
browser=webdriver.Chrome()
# 火狐浏览器
browser=webdriver.Firefox()
# 无界面浏览器
browser=webdriver.PhantomJS()
# 苹果浏览器
browser=webdriver.Safari()
# IE浏览器
browser=webdriver.Edge()
'''
安装selenium与谷歌驱动:
selenium + chromedriver
下载selenium模块:
pip3 install selenium
下载chromed浏览器驱动:
把下载好的chromedriver.exe放到python安装路径的scripts目录中即可,注意最新版本是2.38,并非2.9
- 国内镜像网站地址:
http://npm.taobao.org/mirrors/chromedriver/2.38/
- 最新的版本去官网找:
https://sites.google.com/a/chromium.org/chromedriver/downloads
验证安装:
- 进入python解释器:
>>> C:\Users\Administrator>python3
>>> Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
>>> Type "help", "copyright", "credits" or "license" for more information.
>>> from selenium import webdriver
>>> driver=webdriver.Chrome() #弹出浏览器
>>> driver.get('https://www.baidu.com')
>>> driver.page_source
注意:
selenium3默认支持的webdriver是Firfox,而Firefox需要安装geckodriver
下载链接:https://github.com/mozilla/geckodriver/releases
'''
下载后编写代码(实现用selenium自动打开一个网页):
#selenimu之第一次
from selenium import webdriver
import time
#通过谷歌浏览器驱动打开谷歌浏览器
chrome = webdriver.Chrome( r'D:\python\chromedriver_win32\chromedriver.exe') #括号内写输入chromedriver.exe的绝对路径,也可以把chromedriver.exe这个文件放到python解释器的Scripts的文件夹里面,并配置path路径, 然后就可以用chrome= webdriver.Chrome()即可。
#自动打开指定的网页 chrome.get('https://home.cnblogs.com/u/evan0925/') time.sleep(100)
升级1:
#selenimu之第一次
from selenium import webdriver
import time
#通过谷歌浏览器驱动打开谷歌浏览器
#chrome = webdriver.Chrome( r'D:\python\chromedriver_win32\chromedriver.exe') #括号内写输入chromedriver.exe的绝对路径
chrome = webdriver.Chrome()
#若try出现异常
try:
#自动打开指定的网页(往指定网页发送get请求)
chrome.get('https://www.baidu.com')
time.sleep(3)
# 若上述出现异常,无论发生什么,都应该关闭浏览器
finally:
chrome.close( )# 设置自动关闭浏览器
三 基本使用
1.示例一:
from selenium import webdriver # 用来驱动浏览器的
from selenium.webdriver import ActionChains # 调用得到一个动作链对象, 破解滑动验证码的时候用的 可以拖动图片
from selenium.webdriver.common.by import By # 按照什么方式查找属性,By.ID(前端的),By.CSS_SELECTOR(属性选择器),By.Class(根据类属性查找)
from selenium.webdriver.common.keys import Keys # 键盘按键操作(通过Keys操作键盘)
from selenium.webdriver.support import expected_conditions as EC # 和下面WebDriverWait一起用的 (其中EC是expected_conditions的别名)
) from selenium.webdriver.support.wait import WebDriverWait # 等待页面加载某些元素
import time
try:
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
wait = WebDriverWait(driver, 10)
input_tag = wait.until(EC.presence_of_element_located((By.ID, 'kw')))
input_tag.send_keys('美女')
input_tag.send_keys(Keys.ENTER)
time.sleep(5)
finally:
driver.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 # 和下面WebDriverWait一起用的
from selenium.webdriver.support.wait import WebDriverWait # 等待页面加载某些元素
import time
#通过谷歌浏览器驱动打开谷歌浏览器
#chrome = webdriver.Chrome( r'D:\python\chromedriver_win32\chromedriver.exe') #括号内写输入chromedriver.exe的绝对路径
chrome = webdriver.Chrome()
#若try出现异常
try:
wait = WebDriverWait(chrome, 10)
#1.访问百度
chrome.get('https://www.jd.com')
#2.查找元素 如查找input输入框
#调用EC的presence_of_element_located模块;块内有一个元组作为参数,参数1用于查找属性的方法,参数2为属性的名字
input_tag = wait.until(EC.presence_of_element_located((By.ID, "key")))
#input_tag = wait.until(EC.presence_of_element_located((By.ID, "kw")))
#3.搜索”超人“
input_tag.send_keys('ok')
#4.按回车键表示搜索开始
search_button = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "button")))
search_button.click()
time.sleep(10)
# 若上述出现异常,无论发生什么,都应该关闭浏览器
finally:
chrome.close( )# 设置自动关闭浏览器
5.选择器
'''
===============所有方法===================
element是查找一个标签
elements是查找所有标签
1、find_element_by_link_text 通过链接文本去找
2、find_element_by_id 通过id去找
3、find_element_by_class_name
4、find_element_by_partial_link_text
5、find_element_by_name
6、find_element_by_css_selector
7、find_element_by_tag_name
'''
from selenium import webdriver # 用来驱动浏览器的
from selenium.webdriver import ActionChains
import time
# 获取驱动浏览器配置信息对象,可对其信息进行修改
option = webdriver.ChromeOptions()
# 通过add_argument为配置添加参数
# 此参数用于跳过 "正受到自动测试软件的控制"
option.add_argument('disable-infobars')
driver = webdriver.Chrome(chrome_options=option)
try:
driver.get('https://dig.chouti.com/')
driver.implicitly_wait(10)
# ===============所有方法===================
# element是查找一个标签
# elements是查找所有标签
# 1、find_element_by_link_text 通过全局文本去找
user_login = driver.find_element_by_link_text('登录')
user_login.click()
# 2、find_element_by_id 通过id去找
mobile = driver.find_element_by_id('mobile')
mobile.send_keys('15622792660')
mbpwd = driver.find_element_by_id('mbpwd')
mbpwd.send_keys('kermit46709394')
# 3、find_element_by_class_name 根据属性名查找
login_submit = driver.find_element_by_class_name('btn-login')
login_submit.click()
# 让光标悬浮在个人中心
action = ActionChains(driver).move_to_element(driver.find_element_by_id('loginUserNc')).perform()
# 退出登录
logout = driver.find_element_by_class_name('logout')
logout.click()
time.sleep(1)
# 4、find_element_by_partial_link_text 通过局部文本去找
login_tag = driver.find_element_by_partial_link_text('登')
login_tag.click()
# 5、find_element_by_name 根据name属性查找
user_input = driver.find_element_by_name('mobile')
pwd_input = driver.find_element_by_name('mbpwd')
user_input.send_keys('15622792660')
pwd_input.send_keys('kermit46709394')
# 6、find_element_by_css_selector 根据属性选择器查找
login_btn = driver.find_element_by_css_selector('.btn-login')
login_btn.click()
time.sleep(1)
# 7、find_element_by_tag_name 根据标签名查找
a_s = driver.find_elements_by_tag_name('a')
for a in a_s:
# 打印字数超过10位的文本
if len(a.text) > 10:
print(a.text)
time.sleep(10)
finally:
driver.close()