selenium

ajax

基本介绍

  • JS
    • 是网络上最常⽤的脚本语⾔,它可以收集⽤户的跟踪数据,不需要重载页面直接提交表单,在⻚⾯嵌⼊多媒体⽂件,甚⾄运⾏网页
  • JQuery
    • jQuery是⼀个快速、简介的JavaScript框架,封装了JavaScript常⽤的功能代码
  • ajax
    • ajax可以使⽤⽹⻚实现异步更新,可以在不重新加载整个网页的情况下,对网页的某部分进⾏更新

获取ajax数据方式

  • 直接分析ajax调⽤的接⼝。然后通过代码请求这个接口。
    • 优点:直接可以请求到数据。 不需要做⼀些解析工作。代码量少,性能⾼
    • 缺点:分析接⼝⽐较复杂,特别是⼀些通过js混淆的 接口,要有⼀定的js功底。容易被发现是爬⾍。
  • 使⽤Selenium+chromedriver模拟浏览器⾏为获取数据
    • 优点:直接模拟浏览器的行为。浏览器能请求到的,使⽤selenium也能请求到。爬⾍更稳定。
    • 缺点:代码量多,性能低

Selenium与Chromedriver

基本介绍

Phantomjs快速入门

1
2
3
4
5
6
7
8
9
10
11
12
13
from selenium import webdriver

driver = webdriver.PhantomJS()
#打开baidu
driver.get('https://www.baidu.com/')
#定位操作
driver.find_element_by_id('kw').send_keys('python') #找输入框
driver.find_element_by_id('su').click() #点击百度一下
print(driver.page_source) #查看源码
print(driver.current_url) #查看当前访问url
#截屏
driver.save_screenshot('baidu.png') #获取截屏

selenium入门

快速入门

1
2
3
4
5
6
7
8
9
10
from selenium import webdriver
import time

driver = webdriver.Chrome() #引用驱动
driver.get('https://www.baidu.com/')
driver.maximize_window() #窗口最大化
time.sleep(3) # 延迟3s
driver.close() #关闭当前窗口
time.sleep(1)
driver.quit() #退出驱动 关闭所有窗口

定位元素

  • find_element_by_id:根据id来查找某个元素
1
2
3
4
5
6
7
8
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
#1 id
driver.find_element_by_id('kw').send_keys('python') #找到输入框 并输入python
driver.find_element(By.ID,'kw').send_keys('java') #需要导入from selenium.webdriver.common.by import By
  • find_element_by_class_name:根据类名查找元素
1
2
3
4
5
6
7
8
9
from selenium import webdriver
from selenium.webdriver.common.by import By

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

#2 class
driver.find_element_by_class_name('s_ipt').send_keys('python')
driver.find_element(By.CLASS_NAME,'s_ipt').send_keys('java')
  • find_element_by_name:根据name属性的值来查找元素
1
2
3
4
5
6
7
8
9
from selenium import webdriver
from selenium.webdriver.common.by import By

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

#3 name
driver.find_element_by_name('wd').send_keys('python')
driver.find_element(By.NAME,'wd').send_keys('java')
  • find_element_by_tag_name:根据标签名来查找元素
1
2
3
4
5
6
7
8
9
from selenium import webdriver
from selenium.webdriver.common.by import By

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

#4 标签名
driver.find_element_by_tag_name('div') # 不常用
driver.find_element(By.TAG_NAME,'div')
  • find_element_by_xpath:根据xpath语法来获取元素
1
2
3
4
5
6
7
8
9
from selenium import webdriver
from selenium.webdriver.common.by import By

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

#5 xpath //*[@id="kw"]
driver.find_element_by_xpath('//input[@id="kw"]').send_keys('python')
driver.find_element_by_xpath('//*[@id="kw"]').send_keys('python')
  • css选择器select
1
2
3
4
5
6
7
8
from selenium import webdriver
from selenium.webdriver.common.by import By

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

#css选择器select
# driver.find_element_by_css_selector('#kw').send_keys('python')

操作表单元素

  • 第⼀步:找到这个元素。
  • 第⼆步:使⽤send_keys(value),将数据填充进去
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from selenium import webdriver
import time

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

intag = driver.find_element_by_id('kw') #找到输入框
intag.send_keys('python') #输入python
time.sleep(2)
intag.clear() #清除
intag = driver.find_element_by_id('kw') #找到输入框
intag.send_keys('java') #输入java
intag2 = driver.find_element_by_id('su') #找到百度一下按钮
intag2.click() #点击百度一下

操作下拉菜单

  • select元素不能直接点击。因为点击后还需要选中元素。这时候selenium就专⻔为select标签提供了⼀个类selenium.webdriver.support.ui.Select。将获取到的元素当成参数传到这个类中,创建这个对象。以后就可以使⽤这个对象进⾏选择了。https://www.17sucai.com/boards/53562.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from selenium import webdriver
from selenium.webdriver.support.ui import Select
import time

driver = webdriver.Chrome()
driver.get('https://www.17sucai.com/pins/demo-show?id=5926')

# 切换iframe
# driver.switch_to_frame(driver.find_element_by_id('iframe')) #过时方法 可以用
driver.switch_to.frame(driver.find_element_by_id('iframe'))
#创建select类
selecttag = Select(driver.find_element_by_class_name('nojs'))
# selecttag = driver.find_element_by_class_name('nojs') #找到select 网页中有iframe 无法定位到原始页面 需要切换到iframe 切换方法为上面步骤
#选择方式
#1 根据选择值
selecttag.select_by_value('JP')
#2 根据索引值选择
selecttag.select_by_index(4)

操作非select标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from selenium import webdriver
from selenium.webdriver.support.ui import Select
import time

driver = webdriver.Chrome()
driver.get('https://www.17sucai.com/pins/demo-show?id=5926')

# 切换iframe
# driver.switch_to_frame(driver.find_element_by_id('iframe')) #过时
driver.switch_to.frame(driver.find_element_by_id('iframe'))
#创建select类
# selecttag = Select(driver.find_element_by_id('dk_container_country-nofake')) #没有select 无法获取 此项结果NG

selecttag = driver.find_element_by_id('dk_container_country-nofake').click()
key = int(input('请输入'))
if key == 1:
driver.find_element_by_xpath('//*[@id="dk_container_country-nofake"]/div/ul/li[1]/a').click()
elif key == 2:
driver.find_element_by_xpath('//*[@id="dk_container_country-nofake"]/div/ul/li[2]/a').click()
elif key == 3:
driver.find_element_by_xpath('//*[@id="dk_container_country-nofake"]/div/ul/li[3]/a').click()
elif key == 4:
driver.find_element_by_xpath('//*[@id="dk_container_country-nofake"]/div/ul/li[4]/a').click()
elif key == 5:
driver.find_element_by_xpath('//*[@id="dk_container_country-nofake"]/div/ul/li[5]/a').click()
elif key == 6:
driver.find_element_by_xpath('//*[@id="dk_container_country-nofake"]/div/ul/li[6]/a').click()

行为链

  • 有时候在⻚⾯中的操作可能要有很多步,那么这时候可以使⽤⿏标⾏为链类ActionChains来完成。⽐如现在要将⿏标移动到某个元素上并执⾏点击事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from selenium import webdriver
from selenium.webdriver import ActionChains

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

#定位输入框
inputtag = driver.find_element_by_id('kw')
#定位百度按钮
summitbtn = driver.find_element_by_id('su')
#实例化对象
actions = ActionChains(driver)
#鼠标移动到输入框
actions.move_to_element(inputtag)
#输入内容
actions.send_keys_to_element(inputtag,'python')
#点击百度一下
actions.move_to_element(summitbtn)
actions.click()
#点击右键
actions.context_click()
#提交行为链
actions.perform()