简介
-
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持所有主流浏览器包括界面化和无界面化
-
在使用之前首先需要安装
chromedriver
(http://npm.taobao.org/mirrors/chromedriver/)
from selenium import webdriver
import time
if __name__ == '__main__':
#创建浏览器对象
driver = webdriver.Chrome(executable_path='/path/chromedriver.exe')
#请求页面
driver.get('http://www.baidu.com/')
#页面基本操作
driver.find_element_by_id('kw').send_keys('狗') #输入
driver.find_element_by_id('su').click() #点击
#页面截屏
time.sleep(2) # 设置时间间隔防止截不到屏
driver.save_screenshot('baidu.png')
#获取渲染之后的数据
print(driver.page_source) # 获取页面渲染后的数据
print(driver.get_cookies()) # 获取当前页面cookie值
print(driver.current_url) # 查看当前url路径
# 关闭浏览器
# driver.close() # 关闭页面
# driver.quit() # 关闭浏览器

几步简单的操作我们便可以使用selenium使用浏览器使用百度搜索并进行截屏
元素定位
- 得到页面之后,selenium还为我们获得了渲染后的源码,我们可以使用xpath,css,re等方法对元素进行定位,在selenium中常用的定位函数包括:
find_element_by_id/根据id属性获取元素列表
find_element_by_class_name/根据类名获取元素列表
find_element_by_xpath/根据xpath语法获取元素列表
find_element_by_link_text/根据标签的文本获取元素列表,精确定位
find_element_by_partial_link_text/根据标签包含的文本获取元素列表,模糊定位
find_element_by_tag_name/根据标签名获取元素列表
from selenium import webdriver
#以豆瓣为例
if __name__ == '__main__':
driver = webdriver.Chrome(executable_path='/path/chromedriver.exe')
driver.get('http://www.douban.com/')
# find_element_by_id/根据id属性获取元素列表
results = driver.find_element_by_id('anony-nav') #标签对象
print(results)
# find_elements_by_id/根据id属性获取多个标签
results = driver.find_elements_by_id('anony-nav') #获取多个标签 --list
print(results)
# find_elements_by_class_name/根据类名获取元素列表
results = driver.find_elements_by_class_name('anony-nav-links')
print(results)
# find_elements_by_xpath/根据xpath语法获取元素列表
results = driver.find_elements_by_xpath('//*[@id="anony-nav"]/h1/a')
print(results)
# find_element_by_link_text/根据标签的文本获取元素列表,精确定位
results = driver.find_element_by_link_text('下载豆瓣 App')
print(results)
# find_elements_by_partial_link_text/根据标签包含的文本获取元素列表,模糊定位
results = driver.find_elements_by_partial_link_text('豆瓣')
print(len(results))
# find_elements_by_tag_name/根据标签名获取元素列表
results = driver.find_elements_by_tag_name('div')
print(len(results))
# 获取标签的文本内容
results = driver.find_element_by_tag_name('h1')
print(results.text)
我们可以分析页面源码并使用id,xpath,css,text进行定位,如果我们想要定位的元素不止一个,那么可以使用find_elements_by_tag_name
定位标签或者
find_elements_by_partial_link_text
搜索关键字,并返回一个列表
切换窗口
switch 切换浏览器窗口
首先获取所有窗口,current_windows = driver.windows_handles
根据窗口索引进行切换driver.switch_to.window(current_windows[1])
from selenium import webdriver
import time
if __name__ == '__main__':
driver = webdriver.Chrome(executable_path='/path/chromedriver.exe')
driver.get('http://www.douban.com/')
#实现浏览器窗口切换
driver.find_element_by_xpath('//*[@id="anony-nav"]/div[1]/ul/li[2]/a').click()
current_windows = driver.window_handles
print(current_windows)
driver.switch_to.window(current_windows[0])
# 实现页面的前进和后退
driver.find_element_by_xpath('//*[@id="anony-sns"]/div/div[3]/div/div[1]/ul/li[2]/div/a/img').click()
time.sleep(1)
driver.back()
time.sleep(1)
driver.forward()
# 进入嵌套网页登录网页 frame
driver.switch_to.frame(0)
driver.find_element_by_xpath('/html/body/div[1]/div[1]/ul[1]/li[2]').click()
driver.find_element_by_xpath('//*[@id="username"]').send_keys('...')
driver.find_element_by_xpath('//*[@id="password"]').send_keys('...')
driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/div[5]/a').click()
实现淘宝网页登陆的抢购小程序
- 实现扫码登陆淘宝到时间进行抢购
from selenium import webdriver
import datetime
import time
if __name__ == '__main__':
driver = webdriver.Chrome(executable_path='/path/chromedriver.exe')
time.sleep(3)
driver.get('https://www.taobao.com')
if driver.find_element_by_xpath('//*[@id="J_SiteNavLogin"]/div[1]/div[1]/a[1]'):
driver.find_element_by_xpath('//*[@id="J_SiteNavLogin"]/div[1]/div[1]/a[1]').click()
driver.find_element_by_xpath('//*[@id="login"]/div[1]/i').click()
print('请在10秒内完成扫码')
time.sleep(10)
driver.get("https://cart.taobao.com/cart.htm")
time.sleep(3)
now = datetime.datetime.now()
print('login success:', now.strftime('%Y-%m-%d %H:%M:%S'))
while True:
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
# times = "2020-05-20 12:12:12.000000"
# if now > times:
while True:
try:
if driver.find_element_by_xpath('//*[@id="J_SelectAll1"]/div/label'):
driver.find_element_by_xpath('//*[@id="J_SelectAll1"]/div/label').click()
break
except:
print("下单失败")
while True:
try:
if driver.find_element_by_xpath('//*[@id="J_Go"]/span'):
driver.find_element_by_xpath('//*[@id="J_Go"]/span').click()
print("结算成功")
break
except:
print('结算失败')
while True:
try:
if driver.find_element_by_xpath('//*[@id="submitOrderPC_1"]/div/a[2]'):
driver.find_element_by_xpath('//*[@id="submitOrderPC_1"]/div/a[2]').click()
now1 = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
print("抢购成功时间:%s" % now1)
except:
print("再次尝试提交订单")
time.sleep(0.01)
获取网易云音乐评论
selenium可以获得js动态渲染之后的页面,在也不用解析页面了,使用selenium获取页面并获得源码,使用xpath解析源码获取评论
在获取下一页的时候遇到了一些错误selenium.common.exceptions.WebDriverException: Message: Element is not clickable at point. Other element would receive the click随后尝试了一些办法,下滑页面,窗口定位还是没用。最后是发现下一页的元素被覆盖了,使用按键(keys)代替点击(click)解决问题。
import time
import requests
from lxml import etree
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
def crawl_comments(song): # 爬取网易云评论
driver = webdriver.Chrome(executable_path='/path/chromedriver.exe')
driver.get('http://music.163.com/#/search/m/')
driver.switch_to.frame('contentFrame')
time.sleep(1)
song_name = driver.find_element_by_xpath("//input[@id='m-search-input']")
search_button = driver.find_element_by_xpath("//a[@title='搜索']")
song_name.send_keys(song)
search_button.click()
driver.get(driver.current_url) # 得到当前页面
time.sleep(1)
driver.switch_to.frame('contentFrame')
song_button = driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[2]/div/div/div[1]/div[2]/div/div/a')
song_button.click()
# 方法一:窗口定位到指定位置
# next_button = driver.find_element_by_xpath("//div[@class='m-cmmt']/div[3]/div[1]/a[11]")
# ActionChains(driver).move_to_element(next_button).perform()
# 方法二:下滑窗口
# js = "window.scrollTo(100,450)"
# driver.execute_script(js)
while True:
try:
html = driver.page_source
selector = etree.HTML(html)
boxes = selector.xpath("/html/body/div[3]/div[1]/div/div/div[2]/div/div[2]/div[2]/div//div[@class='cnt f-brk']/text()")
next_button = driver.find_element_by_xpath("//div[@class='m-cmmt']/div[3]/div[1]/a[11]")
# 使用按键代替点击操作
next_button.send_keys(Keys.ENTER)
for i in range(len(boxes)):
print(boxes[i])
time.sleep(3)
except:
pass
if __name__ == '__main__':
crawl_comments('fade')
网友评论