Python爬虫-4 selenium

selenium

支持通过各种driver(FirfoxDriver,IternetExplorerDriver,OperaDriver,ChromeDriver)驱动真实浏览器完成测试。selenium也是支持无界面浏览器操作的。
使用selenium+chromedriver模拟浏览器行为获取数据
selenium相当于是一个机器人。可以模拟人类在浏览器上的一些行为,自动处理浏览器上的一些行为,比如点击,填充数据,删除cookie等。chromedriver是一个驱动Chrome浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:

安装

pip install selenium
chromedriver是需要去网上下载的,必须下载与自己浏览器版本一致的,版本高了我不知道行不行,但低了是肯定不行的这是下面是chromedriver下载地址,注意使用要有一个谷歌浏览器哦
http://npm.taobao.org/mirrors/chromedriver/
下载完成后,放到不需要权限的纯英文目录下就可以了,建议放在python环境中,也就是你python.exe所在的那个文件夹,这样就不用每次都添加了,但是过期了就要及时更新哦,也就是把新版本放进去,旧的删了

快速入门

from selenium import webdriver
# chromedriver的绝对路径
driver_path = '/Users/apple/soft/chromedriver' # 这里是你下载chromedriver.exe的绝对路径,相对路径也是可以的,但你要知道怎么写相对路径
# 初始化一个driver,并且指定chromedriver的路径
driver = webdriver.Chrome(executable_path=driver_path)

# 如果你将chromedriver.exe添加到了你的python环境中,上面的就可以简写成
# driver = webdriver.Chrome()

# 请求网页
driver.get("https://www.baidu.com/")
# 通过page_source获取网页源代码
print(driver.page_source)

定位元素

driver.close():关闭当前页面。
driver.quit():退出整个浏览器。
find_element_by_id:根据id来查找某个元素
	submitTag = driver.find_element_by_id('su')
	submitTag1 = driver.find_element(By.ID,'su')
find_element_by_class_name:根据类名查找元素
	submitTag = driver.find_element_by_class_name('su')
	submitTag1 = driver.find_element(By.CLASS_NAME,'su')
find_element_by_name:根据name属性的值来查找元素
	submitTag = driver.find_element_by_name('email')
	submitTag1 = driver.find_element(By.NAME,'email')
find_element_by_tag_name:根据标签名来查找元素
	submitTag = driver.find_element_by_tag_name('div')
	submitTag1 = driver.find_element(By.TAG_NAME,'div')
find_element_by_xpath:根据xpath语法来获取元素
	submitTag = driver.find_element_by_xpath('//div')
	submitTag1 = driver.find_element(By.XPATH,'//div')
find_element_by_css_selector:根据css选择器选择元素
	submitTag = driver.find_element_by_css_selector('.s_ipt')
	submitTag1 = driver.find_element(By.CSS_SELECTOR,'.s_ipt')
注意:find_element是获取第一个满足条件的元素。find_elements是获取所有满足条件的元素。

操作表单元素

你先要定位到这个元素

1.操作输入框

  • 找到这个元素:
    inputTag = driver.find_element_by_id(‘kw’)
  • 填充数据:
    inputTag.send_keys(‘python’)
  • 清除数据:
    inputTag.clear()

2.操作checkbox

  • 找到元素:
    rememberTag = driver.find_element_by_name(“session_remember_me”)
  • 选中或取消:
    rememberTag.click()

3.选择select

  • 导入包
    from selenium.webdriver.support.ui import Select
  • 选中这个标签,然后使用Select创建对象
    selectTag = Select(driver.find_element_by_name(“sm”))
  • 根据索引选择
    selectTag.select_by_index(1)
  • 根据值选择
    selectTag.select_by_value(“1”)
  • 根据可视的文本选择
    selectTag.select_by_visible_text(“按时间顺序”)

4.操作按钮

  • 找元素:
    inputTag = driver.find_element_by_id(‘su’)
  • 点击
    inputTag.click()

Cookie操作

  • 获取所有的cookie
    driver.get_cookies()
  • 根据cookie的key获取value
    driver.get_cookie(key)
  • 删除所有的cookie
    driver.delete_all_cookies()
  • 删除某个cookie
    driver.delete_cookie(key)

页面等待

1.隐式等待

调用driver.implicitly_wait。就是在创建driver时,设置全局元素等待超时时间。如果找到元素就继续执行。没有找到就不断刷新页面寻找元素,超过时间抛出异常
driver.implicitly_wait(10)
例:

from selenium import webdriver

driver = webdriver.Chrome()

driver.implicitly_wait(5)

driver.get('https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action=')

obj = driver.find_element_by_xpath('//*[@id="content"]/div/div[1]/div[6]/div[2]/div/div/div[1]/span[1]/a')

obj.click()

2.显示等待

显示等待是针对特定的元素,这个元素在某个条件成立后才执行获取元素的操作。也可以在等待的时候指定一个最大的时间,如果超过这个时间那么就抛出一个异常。显示等待应该使用selenium.webdriver.support.excepted_conditions期望的条件和selenium.webdriver.support.ui.WebDriverWait来配合完成
例:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get('https://cn.hoyoyo.com/member~login.html')

# 判断登录状态
WebDriverWait(driver, 100).until(
    EC.url_to_be('https://cn.hoyoyo.com/my_account~index.html')
)
driver.get('https://cn.hoyoyo.com/my_account~profile.html')

切换页面

  • 打开一个新的页面:
    driver.execute_script(“window.open(‘网址’)”)
    网址要用引号包裹起来
  • 切换到这个新的页面中:
    driver.switch_to.window(driver.window_handles[1])
    第一个页面为0,第二个页面为1,以此类推

例:

import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
time.sleep(2)

# execute_script 方法是用来执行 js 的语法,用 引号 把js的 语法包起来
# driver.execute_script("alert('hello world')")

# window.open() 是 js 的语法,作用是在 新的tab页中 打开一个网站
# 参数就是 打开的 网址
driver.execute_script("window.open('https://www.chinaz.com')")

# current_url 表示driver 当前定位的 页面地址
# print(driver.current_url)

# obj = driver.find_element_by_id('kw')
# print(obj)

# 如果想要 获取 第二个 tab页中的 元素对象,那么必须从第一个tab页切换到 第二个tab页
# 切换的方法是 driver.switch_to.window(), 参数就是 第一个 tab 页面
# 参数的 表示方法是 driver.window_handles, 这个属性是一个列表,每一个值就是 不同的tab 对象
# tab 的对象 下标从 0 开始
# 例如 driver.window_handles[0] 表示第一个 tab 对象,driver.window_handles[1] 表示第二个 tab 对象,以此类推
driver.switch_to.window(driver.window_handles[1])

# print(driver.current_url)

# 新打开 chinaz.com 之后, 从 源代码中 获取 class="header-logo" 的 div 对象
# obj = driver.find_element_by_class_name('header-logo')
# print(obj)

time.sleep(2)

# 关闭 第二个 tab 页,然后在 第一个 tab 页中找 百度一下 这个按钮对象
driver.close()


# 虽然关闭了第二个tab页面,但是 driver 还停留在 这个页面
# 所以如果要去第一个 tab 页中获取数据,必须 切换回 第一个 tab页
driver.switch_to.window(driver.window_handles[0])

obj = driver.find_element_by_id('su')

print(obj)

设置代理ip

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://110.73.2.248:8123")
driver = webdriver.Chrome(chrome_options=options)
driver.get('http://httpbin.org/ip')

iframe

  • 切换到 iframe 里面
    driver.switch_to.frame(‘popup_login_frame’)
  • 返回 最外层 页面
    driver.switch_to.default_content()

例:

import time

from selenium import webdriver

driver = webdriver.Chrome()

# 隐式加载, 只针对当前的页面,对iframe中的页面是没有任何效果的
# driver.implicitly_wait(5)

driver.get('http://www.4399.com/')

# 1,找到 登录 链接点击
btn = driver.find_element_by_id('login_tologin')
btn.click()


# 2,由于 用户名的 input框是 在 iframe 页面中
# 所以必须由当前的页面切换到 iframe 的页面中
# frame中的参数就是 iframe 标签中 name 属性的值
driver.switch_to.frame('popup_login_frame')


# 3,定位到 弹出框的 用户名input,填写数据
driver.find_element_by_id('username').send_keys('你的4399账号')
driver.find_element_by_id('j-password').send_keys('你的4399密码')

time.sleep(1)

# 点击登录
driver.find_element_by_xpath('//*[@id="login_form"]/fieldset/div[5]/input').click()

time.sleep(1)

# 虽然页面回自动关闭 iframe的弹框,但是页面还停留在 iframe中
# 所以如果要获取外部的元素,必须 切换到 外部
driver.switch_to.default_content()
# 点击用户名,跳到个人中心
driver.find_element_by_xpath('//*[@id="logined"]').click()

常用的属性

  • get_attribute:这个标签的某个属性的值。
  • text: 获取标签中的文本
  • save_screenshot:获取当前页面的截图。这个方法只能在driver上使用

百度首页例子:

# 导入webdriver的包
import time
from selenium import webdriver

# 初始化driver
driver = webdriver.Chrome()

# 请求网页
driver.get('https://www.baidu.com')

time.sleep(3)

# 关闭tab页面
# driver.close()

# 关闭浏览器
# driver.quit()

# 通过id定位
# btn = driver.find_element_by_id('su')

# 获取对象的属性
# value = btn.get_attribute('value')
# print(value)


# 通过class获取对象
# obj = driver.find_element_by_class_name('hot-refresh-text')

# 找对象的文本
# print(obj.text)


# 截图 整个页面
# driver.save_screenshot('baidu.png')

# 截图 某个特定对象
# btn = driver.find_element_by_id('su')
# btn.screenshot('btn.png')


# 通过name获取对象, name属性是针对 input 框中的 name 属性
# obj = driver.find_element_by_name('wd')
# print(obj.get_attribute('maxlength'))

# 通过 标签名称 获取对象
# obj = driver.find_element_by_tag_name('form')
# print(obj.get_attribute('id'))


# 通过xpath获取对象
# 在selenium中 xpath语法只能定位到这个对象,而不能定位到 文本值 和 属性值
# obj = driver.find_element_by_xpath('//*[@id="s-top-left"]/a[4]')
# print(obj.text)

# 通过 css 选择器 获取对象
# obj = driver.find_element_by_css_selector('#su')
# print(obj.get_attribute('value'))


# 通过 标签名称 定位 相同标签的多个元素
# obj = driver.find_elements_by_tag_name('a')
# print(obj)

猜你喜欢

转载自blog.csdn.net/hmh4640219/article/details/115027697