Django 用户认证 用户 邮箱登录 邮箱注册 ORM or,and,not form.py FORM ModelForm Paginator 分页 HTMl JQuery 定位元素 ajax django切片 restfulapi 跨域 Ubantu Python Mysql Scrapy 爬虫 导出 Python读写 Pycharm 破解 session re sqlit3 生成式 其他 Prism 富文本 CSS Nginx 部署 请求头 抓包 协议 selenium Ubuntu 宝塔 AI Comfy-ui ollama dify open-webui Git docker
selenium的基本使用
张建行 2019年9月7日 15:42 89 文章标签: 定位元素 Python Scrapy 爬虫 导出 selenium

selenium的基本使用

selenium是一个网页自动化测试工具,使用它可以操作浏览器来模拟人操作浏览器的行为

1.selenium在爬虫中的应用

  1. 获取动态的网页数据,一些动态的数据在网页的源代码中没有显示,这时候可以考虑用selenium获取

  2. 用于模拟登录,对于一些需要登录才能获取到数据的网页,一般如果采用分析参数来破解的话,需要耗费大量的时间和精力进行网站的登录破解,而如果使用selenium的话,就可以完全模拟人的登录行为来进行网站的登录,就不需要分析参数进行网站的破解

2.selenium的特点

  1. 它是通过驱动浏览器进行网页的登录,或者是获取网页的信息

  2. 由于selenium是驱动浏览器进行数据的爬取,而浏览器的打开,对网页发起请求,渲染网页都需要耗费大量的时间,所以一般情况下不使用selenium进行网站数据的爬取,除非无法通过分析请求的方式进行登录网站,或者网站是动态的,页面源代码中获取不到数据的这种情况下,才考虑使用selenium来进行爬取

  3. selenium提供的一些元素定位和查找的方法都是用纯python实现的,效率比较低

  4. selenium是免费开源的,支持很多的主流浏览器,IE,Chrome,Opera,Safari等

3.selenium的基本使用

from selenium import webdriver
 
 # 第一步:创建一个浏览器对象
 browser = webdriver.Chrome()
 # 第二步:使用浏览器发起请求
 browser.get('https://www.baidu.com')
 # 获取网页的源代码
 print(browser.page_source)
 # 获取此次请求的cookie信息
 print(browser.get_cookies())
 
 # 退出浏览器
 browser.quit()

1.定位单个节点

1.通过id值匹配

 from selenium import webdriver
 
 # 1.通过id值匹配
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 res1 = browser.find_element_by_id('kw').send_keys('上海天气')
 print(res1)
 
 # 退出浏览器
 browser.quit()

2.通过name值匹配

 from selenium import webdriver
 
 # 1.通过id值匹配
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 # 2.通过name值匹配
 res2 = browser.find_element_by_name('wd')
 print(res2)
 
 # 退出浏览器
 browser.quit()

3.通过class属性匹配

 from selenium import webdriver
 
 # 1.通过id值匹配
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 # 3.通过class属性匹配
 res3 = browser.find_element_by_class_name('s_ipt')
 print(res3)
 
 # 退出浏览器
 browser.quit()

4.通过css选择器来匹配

 from selenium import webdriver
 
 # 1.通过id值匹配
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 # 4.通过css选择器来匹配
 res4 = browser.find_element_by_css_selector('#kw')
 print(res4)
 
 # 退出浏览器
 browser.quit()

5.通过Xpath来匹配

 from selenium import webdriver
 
 # 1.通过id值匹配
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 # 5.通过Xpath来匹配
 res5 = browser.find_element_by_xpath('//input[@id="kw"]')
 print(res5)
 
 # 退出浏览器
 browser.quit()

6.通过标签名来匹配

 from selenium import webdriver
 
 # 1.通过id值匹配
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 # 6.通过标签名来匹配
 res6 = browser.find_element_by_tag_name('input')
 print(res6)
 
 # 退出浏览器
 browser.quit()

7.通过文本链接匹配

 from selenium import webdriver
 
 # 1.通过id值匹配
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 # 7.通过文本链接匹配
 res7 = browser.find_element_by_link_text('新闻')
 print(res7)
 
 # 退出浏览器
 browser.quit()

8.针对一些比较长的文本链接,取其中一小部分

 from selenium import webdriver
 
 # 1.通过id值匹配
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 # 8.针对一些比较长的文本链接,取其中一小部分
 res8 = browser.find_element_by_partial_link_text('新')
 print(res8)
 
 # 退出浏览器
 browser.quit()

2.匹配多个节点

1.通过id匹配

 from selenium import webdriver
 
 # 1.通过id值匹配
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 res1 = browser.find_elements_by_id('kw').send_keys('上海天气')
 print(res1)
 
 # 退出浏览器
 browser.quit()

2.通过name值匹配

 from selenium import webdriver
 
 # 1.通过id值匹配
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 # 2.通过name值匹配
 res2 = browser.find_elements_by_name('wd')
 print(res2)
 
 # 退出浏览器
 browser.quit()

3.通过class属性匹配

 from selenium import webdriver
 
 # 1.通过id值匹配
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 # 3.通过class属性匹配
 res3 = browser.find_elements_by_class_name('s_ipt')
 print(res3)
 
 # 退出浏览器
 browser.quit()

4.通过css选择器来匹配

 from selenium import webdriver
 
 # 1.通过id值匹配
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 # 4.通过css选择器来匹配
 res4 = browser.find_elements_by_css_selector('#kw')
 print(res4)
 
 # 退出浏览器
 browser.quit()

5.通过Xpath来匹配

 from selenium import webdriver
 
 # 1.通过id值匹配
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 # 5.通过Xpath来匹配
 res5 = browser.find_elements_by_xpath('//input[@id="kw"]')
 print(res5)
 
 # 退出浏览器
 browser.quit()

6.通过标签名来匹配

 from selenium import webdriver
 
 # 1.通过id值匹配
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 # 6.通过标签名来匹配
 res6 = browser.find_elements_by_tag_name('input')
 print(res6)
 
 # 退出浏览器
 browser.quit()

7.通过文本链接匹配

 from selenium import webdriver
 
 # 1.通过id值匹配
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 # 7.通过文本链接匹配
 res7 = browser.find_elements_by_link_text('新闻')
 print(res7)
 
 # 退出浏览器
 browser.quit()

8.针对一些比较长的文本链接,取其中一小部分

 from selenium import webdriver
 
 # 1.通过id值匹配
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 # 8.针对一些比较长的文本链接,取其中一小部分
 res8 = browser.find_elements_by_partial_link_text('新')
 print(res8)
 
 # 退出浏览器
 browser.quit()

3.通用方法

1.find_element()

一次只能查找一个element对象,第一个参数:设置要查找的方式,第二个参数:设置要查找的值

 from selenium import webdriver
 from selenium.webdriver.common.by import By
 
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 res1 = browser.find_element(By.ID, 'kw')
 print(res1)
 
 res2 = browser.find_element(By.NAME, 'wd')
 print(res2)
 
 res3 = browser.find_element(By.CLASS_NAME, 's_ipt')
 print(res3)
 
 res4 = browser.find_element(By.CSS_SELECTOR, '#kw')
 print(res4)
 
 res5 = browser.find_element(By.XPATH, '//input[@id="kw"]')
 print(res5)
 
 res6 = browser.find_element(By.LINK_TEXT, '新闻')
 print(res6)
 
 res7 = browser.find_element(By.PARTIAL_LINK_TEXT, '新')
 print(res7)
 
 res8 = browser.find_element(By.TAG_NAME, 'input')
 print(res8)


2.find_elements()

一次能查找多个element对象,第一个参数:设置要查找的方式,第二个参数:设置要查找的值

 from selenium import webdriver
 from selenium.webdriver.common.by import By
 
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 res1 = browser.find_elements(By.ID, 'kw')
 print(res1)
 
 res2 = browser.find_elements(By.NAME, 'wd')
 print(res2)
 
 res3 = browser.find_elements(By.CLASS_NAME, 's_ipt')
 print(res3)
 
 res4 = browser.find_elements(By.CSS_SELECTOR, '#kw')
 print(res4)
 
 res5 = browser.find_elements(By.XPATH, '//input[@id="kw"]')
 print(res5)
 
 res6 = browser.find_elements(By.LINK_TEXT, '新闻')
 print(res6)
 
 res7 = browser.find_element(By.PARTIAL_LINK_TEXT, '新')
 print(res7)
 
 res8 = browser.find_elements(By.TAG_NAME, 'input')
 print(res8)

4.获取标签的属性值和文本

1.获取标签文本

from selenium import webdriver
 from selenium.webdriver.common.by import By
 
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 res1 = browser.find_elements(By.CLASS_NAME, 'title-content-title')
 for i in res1:
     print(i.text)
     
 # 退出浏览器
 browser.quit()

2.获取标签属性值

 from selenium import webdriver
 from selenium.webdriver.common.by import By
 
 browser = webdriver.Chrome()
 browser.get('https://www.baidu.com')
 
 res2 = browser.find_element(By.ID, 'su').get_attribute('value')
 print(res2)
 
 # 退出浏览器
 browser.quit()