爬虫中selenium的其他使用方法

440次阅读
没有评论

每日分享:

我知道你最近很累,是那种看不见的身体上和精神上的疲惫感,但是,请你一定要坚持下去,就算无人问津也好,技不如人也罢,千万不要让烦躁和焦虑,毁了你本就不多的热情和定力,别贪心,我们不可能什么都有,也别灰心,我们不可能什么也没有。

  • 掌握selenium控制标签页的切换
  • 掌握selenium控制iframe的切换
  • 掌握利用selenium获取cookie的方法
  • 掌握手动实现页面等待
  • 掌握selenium控制浏览器执行js代码的方法

一、selenium标签页的切换

当selenium控制浏览器打开多个标签页时,如何控制浏览器在不同的标签页中进行切换

  • 获取所有标签页的窗口句柄
  • 利用窗口句柄字切换到句柄指向的标签页
    • 窗口句柄:指向标签页对象的标识
from selenium import webdriver
url = 'https://jn.58.com/'
driver = webdriver.Chrome()
driver.get(url)
# 输出当前网址
print(driver.current_url)
# 输出句柄
print(driver.window_handles)
el = driver.find_element('xpath', '/html/body/div[3]/div[1]/div[1]/div/div[1]/div[1]/span[1]/a')
el.click()
# 点击后输出网址和句柄
print(driver.current_url)
print(driver.window_handles)

结果:

爬虫中selenium的其他使用方法

可以发现,点击前后,网址是一样的,要想对点击后的页面进行操作,必须通过句柄来切换操作页。

from selenium import webdriver
url = 'https://jn.58.com/'
driver = webdriver.Chrome()
driver.get(url)
print(driver.current_url)
print(driver.window_handles)
el = driver.find_element('xpath', '/html/body/div[3]/div[1]/div[1]/div/div[1]/div[1]/span[1]/a')
el.click()
# 句柄切换标签页
driver.switch_to.window(driver.window_handles[-1])
print(driver.current_url)
print(driver.window_handles)
el_list = driver.find_elements('xpath', '/html/body/div[6]/div[2]/ul/li/div[2]/h2/a')
print(len(el_list))

结果:

爬虫中selenium的其他使用方法 我们可以看到网址变了,并且可以获取新网站上的内容。

二、switch_to切换frame标签

iframe是html中常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了frame中的内容的,对应的解决思路是driver.switch_to.frame(frame_element)

代码如下:

from selenium import webdriver

url = 'https://qzone.qq.com/'
driver = webdriver.Chrome()
driver.get(url)

el_frame = driver.find_element('xpath', '//*[@id="login_frame"]')
# driver.switch_to.frame():也可以直接填对应的id值
# driver.switch_to.frame('login_frame')
driver.switch_to.frame(el_frame)

driver.find_element('id', 'switcher_plogin').click()
driver.find_element('id', 'u').send_keys('你的账号')
driver.find_element('id', 'p').send_keys('你的密码')
driver.find_element('id', 'login_button').click()

三、selenium对cookie的处理

selenium能够帮助我们处理页面中的cookie,比如获取、删除

3.1 获取cookie

driver.get_cookies()返回列表,其中包含的是完整的cookie信息!不光有name、value,还有domain等cookie其他维度的信息。所以如果想要把获取的cookie信息和requests模块配合使用,需要转换为name、value作为键值对的cookie字典

from selenium import webdriver
url = 'http://baidu.com'
driver = webdriver.Chrome()
driver.get(url)
# print(driver.get_cookies())
# cookies = {}
# for cookie in driver.get_cookies():
#     cookies[cookie['name']] = cookie['value']
# print(cookies)
# 字典推导式,把cookie转换为字典 driver.get_cookies():获取当前标签页全部cookie信息
cookies = {cookie['name']: cookie['value']for cookie in driver.get_cookies()}
print(cookies)

3.2 删除cookie(不常用)

删除一条cookie

driver.delete_cookie("Cookie_name")

删除所有cookie

driver.delete_all_cookies()

四、selenium控制浏览器执行js代码

selenium可以让浏览器执行我们规定的js代码

目标:下滑并点击隐私声明(用xpath可以找到“隐私声明”这个元素,但如果要对其进行点击操作,需要先下滑页面至页面内有“隐私声明”这个元素之后才可以点击)

爬虫中selenium的其他使用方法

代码: 

from selenium import webdriver

url = 'https://jn.lianjia.com/'
driver = webdriver.Chrome()
driver.get(url)
# 向下滑动2000px
js = 'scrollTo(0, 2000)'
# 执行js代码
driver.execute_script(js)
driver.find_element('xpath', '/html/body/div[11]/div/div[1]/div[1]/ul/li[4]/a').click()

五、页面等待

页面加载出来的过程中需要花费时间等待网站服务器的响应,在这个过程中标签元素可能还没加载出来,是不可见的,如何处理这种情况

  1. 页面等待分类
  2. 强制等待介绍
  3. 显示等待介绍
  4. 隐式等待介绍
  5. 手动实现页面等待

5.1 页面等待的分类

  1. 强制等待
  2. 隐式等待
  3. 显示等待

5.2 强制等待(了解)

time.sleep()

缺点:不智能,设置的时间太短,元素还没有加载出来;设置时间太长则会浪费时间。

5.3 隐式等待

  • 隐式等待针对的是元素定位,隐式等待设置了一个时间,在一段时间内判断元素是否定位成功,如果成功了,就进行下一步
  • 在设置的时间内没有定位成功,则会报超时加载
from selenium import webdriver

driver = webdriver.Chrome()
# 最多等10秒
driver.implicitly_wait(10)
driver.get('https://www.baidu.com')
driver.find_element('xpath', '//*[@id="lg"]/map/are')

5.4 显示等待(了解)

  • 每经过多少秒就查看一次等待条件是否达成,如果达成就停止等待,继续执行后续代码
  • 如果没有达成成就继续等待直到超过规定时间后,报超时异常
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 

driver = webdriver.Chrome()

driver.get('https://www.baidu.com')

# 显式等待
WebDriverWait(driver, 20, 0.5).until(
    EC.presence_of_element_located((By.LINK_TEXT, '好123')))  
# 参数20表示最长等待20秒
# 参数0.5表示0.5秒检查一次规定的标签是否存在
# EC.presence_of_element_located((By.LINK_TEXT, '好123')) 表示通过链接文本内容定位标签
# 每0.5秒一次检查,通过链接文本内容定位标签是否存在,如果存在就向下继续执行;如果不存在,直到20秒上限就抛出异常

print(driver.find_element_by_link_text('好123').get_attribute('href'))
driver.quit() 

5.5 手动实现页面等待

在了解隐式等待和显示等待以及强制等待后,我们发现并没有一种通用的方法来解决页面等待的问题。

import time
from selenium import webdriver
driver = webdriver.Chrome('/home/worker/Desktop/driver/chromedriver')

driver.get('https://www.taobao.com/')
time.sleep(1)

# i = 0
# while True:
for i in range(10):
    i += 1
    try:
        time.sleep(3)
        element = driver.find_element_by_xpath('//div[@class="shop-inner"]/h3[1]/a')
        print(element.get_attribute('href'))
        break
    except:
        js = 'window.scrollTo(0, {})'.format(i*500) # js语句
        driver.execute_script(js) # 执行js的方法
driver.quit()

相关文章:

  1. 爬虫中selenium的其他使用方法(二)
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

相关文章:

版权声明:Python教程2022-10-19发表,共计4832字。
新手QQ群:570568346,欢迎进群讨论 Python51学习