07selenium

selenium

动态网页爬虫:

  • 分析接口,然后通过代码请求这个接口
  • 使用selenium+webdriver模拟浏览器获取数据

1. selenium和webdriver

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium可以直接调用浏览器,它支持所有主流的浏览器。我们可以使用selenium很容易完成之前编写的爬虫。webdriver可以理解它是浏览器的驱动。

selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器

卸载已经安装的模块:pip uninstall 模块名

2. 浏览器对象

  • get(url=url) :地址栏输入url地址并确认
  • page_source :查看网页源码(与element内容一致)
  • maximize_window():浏览器窗口最大化
  • quit():关闭浏览器

3. selenium定位元素

# 使用元素定位前需要导包
from selenium.webdriver.common.by import By

# find_element 找一个元素
# find_elements 找多个元素
  • find_element(By.ID, '根据标签id属性进行定位')
  • find_element(By.NAME, '根据标签name属性进行定位')
  • find_element(By.CLASS_NAME, '根据标签class属性进行定位')
  • find_element(By.XPATH, '根据xpath语法进行定位')
  • find_element(By.CSS_SELECTOR, '根据css语法进行定位')
  • find_element(By.LINK_TEXT, '根据标签文本内容进行定位')
import time

from selenium import webdriver
from selenium.webdriver.common.by import By

url = 'https://www.maoyan.com/board/4?offset=0'

driver = webdriver.Chrome()
driver.get(url)

driver.maximize_window()


def get_data():
    """获取一页的数据"""
    dds = driver.find_elements(By.XPATH, '//*[@id="app"]/div/div/div[1]/dl/dd')
    for dd in dds:
        # text属性:获取当前元素下的所有文字
        print(dd.text.split("\n"))
        print("-" * 100)


while True:
    get_data()
    try:
        driver.find_element(By.LINK_TEXT, "下一页").click()
        time.sleep(2)
    except Exception as e:
        print(e)
        print('爬取完成')
        driver.quit()
        break

4.节点对象操作

  • send_keys('') 搜索框发送内容
  • click()     点击
  • text 获取文本内容
  • get_attribute('src') 获取属性值
  • find('')   查找响应中的字符串

5. 无界面模式

from selenium import webdriver

options = webdriver.ChromeOptions()
# 添加无界面参数
options.add_argument('--headless')
browser = webdriver.Chrome(options=options)

6. 打开新窗口和切换页面

  • selenium中没有专门的打开新窗口的方法,是通过execute_script()来执行js脚本的形式来打开新窗口的

    driver.execute_script("window.open('https://www.douban.com/')")
    
  • 在selenium眼中,新窗口是不会变成当前执行命令的窗口 -1为切换到最新(最后)显示的窗口 ,0为切换到初始窗口
driver.switch_to.window(driver.window_handles[-1])
  • 关掉当前窗口,回到初始的窗口视角

  • driver.close()
    driver.switch_to.window(driver.window_handles[0])
    

6. selenium-iframe

网页中嵌套了网页,先切换到iframe,然后再执行其他操作

  • 切换到要处理的Frame

    driver.switch_to.frame(frame节点对象)
    
  • 在Frame中定位页面元素并进行操作

  • 返回当前处理的Frame的上一级页面或主页面

    # 返回上一级
    driver.switch_to.parent_frame()
    # 返回主页面
    driver.switch_to.default_content()
    

7. 操作cookie

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

8. 隐式等待和显式等待

  • 隐式等待:标签定位时,指定一个时间,在这个时间内一直会处于等待状态。隐式等待需要使用driver.implicitly_wait
  • 显式等待:指定在某个时间内,如果某个条件满足了,那么就不会再等待,针对某一操作使用。显式等待用的方法需导包
    • from selenium.webdriver.support.ui import WebDriverWait
    • from selenium.webdriver.support import expected_conditions as EC
posted @ 2023-04-05 00:47  LePenseur  阅读(17)  评论(0编辑  收藏  举报