1.selenium基本使用

1.selenium安装及基本操作

selenium是一个自动化测试工具,它支持各种浏览器,包括Chrome,Safari,Firefox等主流界面浏览器驱动,也包括Phantomjs的无界面浏览器。

通过selenium+phantomjs可以直接渲染js

首先,需要下载不同浏览器的驱动,直接百度搜索就可以,例如搜过Chrome浏览器驱动,下载到本地

然后,将下载好的驱动放入到安装python的根目录下,例如C:/pyhton3/usr/bin,就是要把驱动和python.exe放在同一个文件夹。(虚拟环境也是一样,放入对应的虚拟环境下的python的根目录)

最后,通过pip安装selenium模块。

# coding = utf-8
import time
from selenium import webdriver  # 导入模块

driver = webdriver.Chrome()  # 1.声明浏览器对象
driver.get('https://www.baidu.com')  # 2. 访问地址
# dirver.get('https://www.weibo.com')
try:driver.save_screenshot('test.jpg')  # 3.操作。截图
finally:time.sleep(3)driver.close()  # 4.关闭浏览器

这里模拟一个浏览器,访问百度,并将浏览器打开后的页面进行截图。

2.元素选取

要用代码操作浏览器,访问网页,做一些操作必须要通过定位,获得要操作元素的位置,例如,要在百度输入框搜索python关键词,要经过如下操作:

首先,通过代码定位到输入框所在位置;

然后,通过代码在输入框中输入关键字

最后,通过代码实现点击搜索。

import time
from selenium import webdriver  # 导入模块

driver = webdriver.Chrome()  # 1.声明浏览器对象
driver.get('https://www.baidu.com')  # 2. 访问地址try:# 通过审查元素,发现百度输入框的id为kw,# 通过find_element_by_id("kw")定位到该输入框# 通过send_keys("Python") 实现在输入框中输入关键字driver.find_element_by_id('kw').send_keys('python')  # 输入数据# 同样的,通过find_element_by_id定位“百度一下”按钮# 通过click()实现点击driver.find_element_by_id('su').click()
finally:time.sleep(30)driver.close()

当然,还有很多其他方式来定位:

# 通过文本,定位贴吧的位置,并点击driver.find_element_by_link_text('贴吧').click()  # 通过文本链接点击进入# 通过xpath路径定位元素driver.find_element_by_xpath('//*[@id="1"]/h3/a[1]').click()# 通过元素的name来定位,当然,后可以by_class_name()driver.find_element_by_name('loginname').send_keys('13212702940')

还有一些常用操作

print(driver.page_source)  # 获取网页经过js渲染的源代码,相当于审查元素
# driver.find_elements_by_id()  # 获取多个元素
# driver.find_element_by_css_selector

3.页面交互

1.窗口切换

使用selenium操作浏览器的时候肯定会有很多窗口,selenium默认不切换窗口,所以需要有方法实现窗口的切换。

切换窗口有如下方法:

通过driver.window_handlers获取每个窗口的操作对象,然后for循环,实现切换窗口的目的。

for handler in driver.window_handlers:driver.switch_to_window(handler)

2.cookies处理

在selenium中,cookies的用法一般是通过模拟登陆之后,获取到cookies值,再通过requests等库实现请求,

增加效率。

cookie = {}
for item in driver.get_cookies():cookie[item.get('name')] = item.get('value')

3.元素拖动

在selenium中,除了简单的点击动作外,还有一些稍微复杂的动作,例如元素的拖动。

在实现元素拖动中时,需要另一个模块。ActionChains模块满足对鼠标操作的要求。

ActionChains的执行原理就是当调用ActionChains方法时,不会立即执行,而是将所有操作暂时放在一个队列中,

当调用perform()方法时,队列会按照放入的先后顺序,依次执行。

例如验证码的滑动,其实就是将一个元素拖动到某一个位置,然后松开,因此,元素的拖动经过下面几个步骤:

将鼠标移上去,点击鼠标左键不放,拖拽到目的点,松开鼠标

ActionChains中提供的方法:

# click(on_element=None)  # 单击鼠标左键
# click_and_hold(on_element=None)  # 点击鼠标左键,按住不放
# context_click(on_element=None)  # 点击鼠标右键
# double_click(on_element=None)  # 双击鼠标左键
# drag_and_drop(source, target)  # 拖拽到某个元素,然后松开
# drag_and_drop_by_offset(source, xoffset, yoffset)  # 拖拽到某个坐标然后松开
# move_by_offset(xoffset, yoffset)  # 鼠标移动到距离当前位置(x, y)
# move_to_element(to_element)  # 移动到某个元素
#
# # 将鼠标移动至距离某个元素多少距离的位置
# move_to_element_with_offset(to_element, xoffset, yoffset)
#
# release(on_element=None)  # 在某个元素位置松开鼠标左键
# perform()  # 执行链中的所有动作

来一个简单拖拽例子,测试网址:http://www.treejs.cn/v3/demo/cn/exedit/drag.html

# 实例化一个浏览器
driver = webdriver.Chrome()
try:# 打开页面(可以自己先打开试一下)driver.get('http://www.treejs.cn/v3/demo/cn/exedit/drag.html')time.sleep(2)# 1.通过id定位要拖动的元素元素(相当于鼠标移上去)element = driver.find_element_by_id('treeDemo_2_span')# 2.通过id定位要拖到的位置target = driver.find_element_by_id('treeDemo_3_span')# 拖动元素到目标位置
    ActionChains(driver).drag_and_drop(element, target).perform()time.sleep(15)
finally:driver.quit()

4.弹窗处理

很多网页里面可能会出现弹窗,需要对弹窗进行一定的处理(就是js里的alert())。

使用:

driver.switch_to_alert()  # 切换到弹窗time.sleep(3)driver.accept()  #接收弹窗

对弹窗进行处理。

4.页面等待

现在的大多数web应用,越来越多采用了Ajax技术,以及程序不能确定某个元素何时完全加载出来,

这会让元素定位困难,会提高ElementNotVisibleException的概率,因此出现了等待。

就是等待页面中,某个元素出现,就执行某些代码。selenium提供两种等待方式。

1.显式等待

显式等待是指定某个条件,然后设置最长等待时间,如果在这个时间里面还没有找到元素,那么就抛出异常。

显式等待主要使用了WebDriverWait类和excepted_conditions模块。

WebDriverWait是显式等待类,主要方法有:

__init__中:

  • driver:传入的WebDriver实例
  • timeout:超时时间,等待的最长时间(同时要考虑隐性等待时间)
  • poll_frequency:调用until中的方法的间隔时间,默认0.5s
  • ignored_exception:忽略的异常,如果在调用until过程中,抛出这个异常,则不中断代码,继续执行
    如果抛出的是这个元组外的异常,则代码中观,抛出异常,默认只有NoSuchElementException

until中:

  • method:在等待期间,每隔一段时间,调用这个传入的方法,直到返回值不是False
  • message:如果超时,抛出TimeOutException,将message传入异常。

expected_conditions是selenium的一个模块,其中包含一系列等待的条件:

"""
title_is
title_contains
#这两个条件类验证title,验证传入的参数title是否等于或包含于driver.titlepresence_of_element_located
presence_of_all_elements_located
这两个人条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, 'kw')
顾名思义,一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行visibility_of_element_located
invisibility_of_element_located
visibility_of
这三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElement
第一个和第三个其实质是一样的text_to_be_present_in_element
text_to_be_present_in_element_value
这两个人条件判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的valueframe_to_be_available_and_switch_to_it  # 有些页面有frame标签,该标签出现后才能定位,例如QQ空间
这个条件判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElementalert_is_present
这个条件判断是否有alert出现element_to_be_clickable
这个条件判断元素是否可点击,传入locator"""

简单例子:访问百度首页,等待“贴吧”那个地方出现,出现后就拿它的链接

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get('https://baidu.com')
locator = (By.LINK_TEXT, '贴吧')try:# 等待,直到locator出现为止,driver在20s内,每0.5s检查一次该元素是否出现# 出现,执行后面内容;没出现,继续等待(20s内,超过就抛异常)WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))# 出现后直接获取贴吧的链接print(driver.find_element_by_link_text('贴吧').get_attribute('href'))
finally:driver.close()

2.隐式等待

隐性等待implicitly_wait(xx),隐形等待是设置了一个最长等待时间,

如果在规定时间内网页加载完成,则执行下一步,

否则一直等到时间截止,然后执行下一步。

弊端就是程序会一直等待整个页面加载完成,就算你需要的元素加载出来了还是需要等待。

from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(30)
driver.get('https://www.baidu.com')

2.Phantomjs的使用

PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎。

它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG。

phantomjs常用配置:

# 引入配置对象DesiredCapabilities
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
dcap = dict(DesiredCapabilities.PHANTOMJS)#从USER_AGENTS列表中随机选一个浏览器头,伪装浏览器
dcap["phantomjs.page.settings.userAgent"] = (random.choice(USER_AGENTS))# 不载入图片,爬页面速度会快很多
dcap["phantomjs.page.settings.loadImages"] = False# 设置代理
service_args = ['--proxy=127.0.0.1:9999','--proxy-type=socks5']#打开带配置信息的phantomJS浏览器
driver = webdriver.PhantomJS(phantomjs_driver_path, desired_capabilities=dcap, service_args=service_args)# 如果你的phantomjs配置了环境变量,就不需要填写路径(phantomjs_driver_path),否则需要添加你的phantomjs所在的路径

3.模拟登陆

利用selenium登录新浪微博,首先访问新浪页面,等待输入账号和密码的输入框出现,然后依次利用selenium输入账号和密码,最后点击登录,并获取登陆后的源码。

# coding = utf-8
"""
用selenium登录新浪微博
"""
import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By# 1,实例化浏览器驱动
driver = webdriver.Chrome()url = 'https://weibo.com/'# 2,给定访问目标
driver.get(url)# 定位账号密码输入框并登录
username = '184419810@qq.com'
password = '*********'try:# 创建等待事件waiter = WebDriverWait(driver, 20, 0.1)event = (By.XPATH, '//*[@id="pl_login_form"]')  # # 等待登录框的出现
    waiter.until(EC.presence_of_element_located(event))# 账号输入driver.find_element_by_xpath('//*[@id="loginname"]').send_keys(username)time.sleep(1)# 密码输入driver.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[2]/div/input').send_keys(password)time.sleep(1)# 点击登录driver.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[6]/a').click()# 获取登录后的源码print(driver.page_source)except Exception as e:print(e)
finally:time.sleep(10)driver.close()

转载于:https://www.cnblogs.com/pythoner6833/p/9052300.html

使用selenium模拟登陆新浪微博相关推荐

  1. java+selenium模拟登陆新浪微博demo

    java代码 import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.seleni ...

  2. 通过selenium模拟登陆新浪微博爬取首页和评论

    1,获得登陆后的cookies,在通过cookiejar维持cookies(requests不能保存手动构建的cookies),并传入session中 2,在使用获得的session去请求页面,获得首 ...

  3. 分享:Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据

    Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据 http://my.oschina.net/leopardsaga/blog/94774

  4. selenium模拟登陆豆瓣并获取cookies

    验证码处理与模拟登陆豆瓣,首先我们看到豆瓣没有cookies,我们需要用程序来模拟登陆获取cookies(当前有些情况下自己手动登陆后复制粘贴cookies也能登陆),该文主要讲方法,如何用selen ...

  5. 爬取知乎壁纸:selenium模拟登陆获取cookies,再将cookies传递给requests

    selenium很好用,但是爬取大量数据时速度较慢. 通过selenium模拟登陆,获取cookies,再将cookies传递给requests,通过requests爬取加快速度. 以为知乎网爬取壁纸 ...

  6. selenium模拟登陆淘宝遇到的问题及解决

    今天忽然想用爬虫登陆淘宝,于是就试着写一下, 我是用selenium模拟登陆,我先是打开淘宝登陆页面发现淘宝的登陆界面是这样的 我就用代码写了一个模拟登陆:如下这是最终代码 import time f ...

  7. java使用Selenium模拟登陆58(验证码登陆密码登陆)若快平台识别文字点击验证码

    文章目录 写在前面 配置环境 Selenium入门 使用Selenium登陆58 若快平台识别文字点击验证码 附: By对象中的 xpath & cssSelector获取方式** 不打开浏览 ...

  8. Python模拟登陆新浪微博,爬取用户数据

    目标 爬取新浪微博用户数据,包括以下字段:id,昵称,粉丝数,关注数,微博数,每一篇微博的内容,转发数,评论数,点赞数,发布时间,来源,以及是原创还是转发.(本文以GUCCI(古驰)为例) 方法 + ...

  9. pythonurllib微博登录怎么删_Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据...

    我们都知道HTTP是无连接的状态协议,但是客户端和服务器端需要保持一些相互信息,比如cookie,有了cookie,服务器才能知道刚才是这个用户登录了网站,才会给予客户端访问一些页面的权限. 用浏览器 ...

最新文章

  1. HealthKit开发快速入门教程之HealthKit开发概述简介
  2. Linux期末复习编程题
  3. java tostring方法_Java程序员小伙启动项目报错,原来是使用了lombok
  4. 关于C++的extern关键字
  5. 带哨兵节点的链_关于链表中哨兵结点问题的深入剖析
  6. 软件性能测试与LoadRunner实战可以在网上和书店买到了
  7. 登录失败时记住访问的地址
  8. java getrequest_Java Target.getRequest方法代码示例
  9. 设计模式是什么鬼(单例)
  10. 计算机主要是以划分发展阶段的,计算机以什么划分发展阶段
  11. 后台传值给前台p标签
  12. Bailian1183 POJ1183 反正切函数的应用【迭代计算】
  13. mysql基础之mariadb galera集群(多主)
  14. socket相关的面试题
  15. 易语言dchp服务器,易语言模拟DHCP报文源码
  16. QT | 设置字体颜色
  17. 手机处理器排名2019_2019手机处理器性能排行,第一实至名归,第二太冷门
  18. IDE、SATA、SCSI、SAS、FC、SSD硬盘类型介绍
  19. html5超级玛丽小游戏
  20. Gos: Armed Golang

热门文章

  1. 图解自动驾驶中的运动规划(Motion Planning),附几十种规划算法
  2. matlab晶格图,使用MATLAB可视化立体晶格等三维数组
  3. 华硕新款 Vivobook Go 15 OLED 评测
  4. 初识Blob和Filereader
  5. BItlocker要慎用
  6. echarts 自定义y轴坐标
  7. 深入了解 Dojo 的核心接口
  8. Leetcode答题 --- 独一无二的出现次数
  9. Latte Panda AlphaDelta上电自启动刷机教程
  10. Python015面向对象之类和对象