selenium模块的基本使用

selenium模块和爬虫的关联

1、便捷的获取网站中动态加载的数据。

2、便捷的实现模拟登录。


selenium模块:

1、基于浏览器自动化的一个模块。

2、模拟人去操作浏览器,通过xpath或者标签定位到元素,通过相应的方法就能在文本框内输入字符,或者定位到按钮点击。

3、不过selenium执行很慢,并且网页没加载完也可能执行下面的代码,会导致报错。

4、selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题,selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器。


selenium使用流程:

1、环境安装:pip install selenium

2、下载一个浏览器的驱动程序

  • 下载路径:http://chromedriver.storage.googleapis.com/index.html
  • 驱动程序和浏览器的映射关系:http://blog.csdn.net/huilan_same/article/details/51896672

3、实例化一个浏览器对象

通过软件自动化打开浏览器,爬取想要爬取页面数据

导包

from lxml import etree
from time import sleep
# 导入动作链对应的类
from selenium import webdriver

实例化一个浏览器对象(传入浏览器的驱动成)

bro = webdriver.Chrome(executable_path='./chromedriver.exe')

让浏览器发起一个指定url对应的请求

bro.get('http://scxk.nmpa.gov.cn:81/xk/')

page_source获取浏览器当前页面的页面源码数据

page_text = bro.page_source

解析企业名称

tree = etree.HTML(page_text)
li_list = tree.xpath('//ul[@id="gzlist"]/li')
for li in li_list:
    name = li.xpath('./dl/@title')[0]
    print(name)

关闭浏览器(等待5秒)

sleep(5)
bro.quit()

4、编写基于浏览器自动化的操作代码

  • 发起请求:get(url)
  • 标签定位:find系列的方法
  • 标签交互:send_keys(‘xxx’)
  • 执行js程序:excute_script(‘jsCode’)
  • 前进、后退:back(), forward()
  • 关闭浏览器:quit()
from selenium import webdriver
from time import sleep
# 导入动作链对应的类
from selenium.webdriver import ActionChains
bro = webdriver.Chrome(executable_path='./chromedriver.exe')

bro.get('https://www.taobao.com/')

# 标签定位
search_input = bro.find_element_by_id('q')
# 标签交互
search_input.send_keys('Iphone')

# 执行一组JS程序
bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
sleep(2)
# 点击搜索按钮
bro.find_element_by_css_selector('.btn-search tb-bg')
bro.click()

bro.get('https://www.baidu.com')
sleep(2)
# 回退
bro.back()
sleep(2)
# 前进
bro.forward()
sleep(5)
bro.quit()


5、selenium处理iframe

  • 如果定位的标签存在于iframe标签之中,则必须使用switch_to.frame(id)
  • 动作链(拖动):from selenium.webdriver import ActionChains
    • 实例化一个动作链对象:action = ActionChains(bro)
    • click_and_hold(div) :长按且点击操作
    • move_by_offset(x,y)
    • perform()让动作链立即执行
    • action.release()释放动作链对象

导包

from selenium import webdriver
from time import sleep

导入动作链对应的类

from selenium.webdriver import ActionChains
bro = webdriver.Chrome(executable_path='./chromedriver.exe')

让浏览器发起一个指定url对应的请求

bro.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')

如果定位的标签是存在于iframe标签之中的则必须通过如下操作在进行标签定位

bro.switch_to_frame('iframeResult')  # 切换浏览器标签定位的作用域
div = bro.find_element_by_id('draggable')

动作链

action = ActionChains(bro)

点击长按指定的标签

action.click_and_hold(div)

perform()立即执行动作链操作、move_by_offset(x,y) : x水平方向 y竖直方向

for i in range(5):
    action.move_by_offset(17, 0).perform()
    sleep(0.5)

释放动作链

action.release()

关闭

bro.quit()

完整代码:

from selenium import webdriver
from time import sleep
# 导入动作链对应的类
from selenium.webdriver import ActionChains
# 实例化一个浏览器对象(传入浏览器的驱动程序)
bro = webdriver.Chrome(executable_path='./chromedriver.exe')
# 让浏览器发起一个指定url对应的请求
bro.get('http://scxk.nmpa.gov.cn:81/xk/')

# 如果定位的标签是存在于iframe标签之中的则必须通过如下操作在进行标签定位
bro.switch_to_frame('iframeResult')  # 切换浏览器标签定位的作用域
div = bro.find_element_by_id('draggable')

# 动作链
action = ActionChains(bro)
# 点击长按指定的标签
action.click_and_hold(div)

for i in range(5):
    # perform()立即执行动作链操作
    # move_by_offset(x,y) : x水平方向 y竖直方向
    action.move_by_offset(17, 0).perform()
    sleep(0.5)

# 释放动作链
action.release()

bro.quit()

模拟登录网页版QQ空间

from selenium import webdriver
from time import sleep

bro = webdriver.Chrome(executable_path='./chromedriver1.exe')
# 让浏览器发起一个指定url对应的请求
bro.get('https://qzone.qq.com/')
# 如果定位的标签是存在于iframe标签之中的则必须通过如下操作在进行标签定位
bro.switch_to_frame('login_frame')  # 切换浏览器标签定位的作用域

a_tag = bro.find_element_by_id('switcher_plogin')
a_tag.click()
# 找到用户名和密码的标签
username_tag = bro.find_element_by_id('u')
password_tag = bro.find_element_by_id('p')
# 输入账号
username_tag.send_keys('631284465')
sleep(1)
# 输入密码(不敢用真密码....)
password_tag.send_keys('123456789')
sleep(1)
# 点击登录
btn = bro.find_element_by_id('login_button')
btn.click()

sleep(3)
# 退出浏览器
bro.quit()

其实类似的,可以用selenium做一个自动抢课程序!!!


无头浏览器

from selenium import webdriver
from time import sleep
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

bro = webdriver.Chrome(executable_path='./chromedriver1.exe', chrome_options=chrome_options)

# 无可视化界面(无头浏览器)
bro.get('https://www.baidu.com')

print(bro.page_source)
sleep(2)
bro.quit()


无头浏览器+规避检测

from webbrowser import Chrome
from selenium import webdriver
from time import sleep
# 实现无可视化界面
from selenium.webdriver.chrome.options import Options
# 实现规避检测
from selenium.webdriver import ChromeOptions

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

# 实现检测规避
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])

# 如何实现让selenium规避被检测到的风险
bro = webdriver.Chrome(executable_path='./chromedriver1.exe', chrome_options=chrome_options, options=option)

# 无可视化界面(无头浏览器) phantomJs
bro.get('https://www.baidu.com')

print(bro.page_source)
sleep(2)
bro.quit()

12306模拟登录

因为我模拟登录12306的时候并没有图片验证的功能,所以代码实现和上面基本一致,没什么区别

但是!!!!

12306会检测出我们是不是用selenium进行登录

所以要加上一句,为了防止被12306识别为selenium登陆

script = 'Object.defineProperty(navigator,"webdriver",{get:()=>undefined,});'
bro.execute_script(script)

导包:

from webbrowser import Chrome
from selenium import webdriver
from time import sleep
# 导入动作链对应的类
from selenium.webdriver import ActionChains
# 实现无可视化界面
from selenium.webdriver.chrome.options import Options
# 实现规避检测
from selenium.webdriver import ChromeOptions

实现无可视化界面(如果想看效果,可以不用加上)

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

实现检测规避

option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])

实现让selenium规避被检测到的风险

# bro = webdriver.Chrome(executable_path='./chromedriver1.exe', chrome_options=chrome_options, options=option)
bro = webdriver.Chrome(executable_path='./chromedriver1.exe', options=option)

无可视化界面(无头浏览器) phantomJs

bro.get('https://kyfw.12306.cn/otn/resources/login.html')

防止被12306识别为selenium登陆

script = 'Object.defineProperty(navigator,"webdriver",{get:()=>undefined,});'
bro.execute_script(script)

拿到账号框和密码框的标签,并填入你的账号和密码,最后点击登录

username_tag = bro.find_element_by_id('J-userName')
password_tag = bro.find_element_by_id('J-password')

username_tag.send_keys('XXXX')
sleep(1)
password_tag.send_keys('XXXX')
sleep(1)

btn = bro.find_element_by_id('J-login')
btn.click()
sleep(1)

对于滑动验证,先拿到滑块的标签,然后我们直接一滑到底

span = bro.find_element_by_id('nc_1_n1z')
action = ActionChains(bro)
action.click_and_hold(span)

action.move_by_offset(500, 0).perform()

释放动作链,关上程序

action.release()

bro.quit()

完整代码:

from webbrowser import Chrome
from selenium import webdriver
from time import sleep
# 导入动作链对应的类
from selenium.webdriver import ActionChains
# 实现无可视化界面
from selenium.webdriver.chrome.options import Options
# 实现规避检测
from selenium.webdriver import ChromeOptions

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

# 实现检测规避
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])

# 如何实现让selenium规避被检测到的风险
# bro = webdriver.Chrome(executable_path='./chromedriver1.exe', chrome_options=chrome_options, options=option)
bro = webdriver.Chrome(executable_path='./chromedriver1.exe', options=option)
# 无可视化界面(无头浏览器) phantomJs
bro.get('https://kyfw.12306.cn/otn/resources/login.html')

#防止被12306识别为selenium登陆
script = 'Object.defineProperty(navigator,"webdriver",{get:()=>undefined,});'
bro.execute_script(script)

username_tag = bro.find_element_by_id('J-userName')
password_tag = bro.find_element_by_id('J-password')

username_tag.send_keys('XXXX')
sleep(1)
password_tag.send_keys('XXXX')
sleep(1)

btn = bro.find_element_by_id('J-login')
btn.click()
sleep(1)

span = bro.find_element_by_id('nc_1_n1z')
action = ActionChains(bro)
action.click_and_hold(span)

action.move_by_offset(500, 0).perform()

sleep(3)
action.release()

bro.quit()
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值