动态HTML技术了解
八、动态HTML技术了解
8.1 ajax基本介绍
- 动态了解HTML技术 JS是⽹络上最常⽤的脚本语⾔,它可以收集⽤户的跟踪数据,不需要重载⻚⾯ 直接提交表单,在⻚⾯嵌⼊多媒体⽂件,甚⾄运⾏⽹⻚
- jQuery:jQuery是⼀个快速、简介的JavaScript框架,封装了JavaScript常⽤的功能代码
- ajax:ajax可以使⽤⽹⻚实现异步更新,可以在不重新加载整个⽹⻚的情况下,对⽹⻚的某部分进⾏更新
-
1.直接分析ajax调⽤的接⼝。然后通过代码请求这个接⼝。
方式 | 优点 | 缺点 |
---|---|---|
分析接⼝ | 直接可以请求到数据。 不需要做⼀些解析⼯作。代码量少,性能⾼ | 别是一些通过js混淆的接口,要有一定的js功底。容易被发现是爬虫。 |
selenium | 直接模拟浏览器的⾏为。浏览器能请求到的,使⽤selenium也能请求到。爬⾍更稳定。 | 代码量多。性能 |
8.2 Selenium+chromedriver获取动态数据
8.2.1 Selenium 介绍
-
selenium是⼀个web的⾃动化测试⼯具,最初是为⽹站⾃动化测试⽽开发的,selenium可以直接运⾏在浏览器上,它⽀持所有主流的浏览器,可以接收指令,让浏览器⾃动加载⻚⾯,获取需要的数据,甚⾄⻚⾯截屏
-
chromedriver是⼀个驱动Chrome浏览器的驱动程序,使⽤他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:
Chrome:
https://sites.google.com/a/chromium.org/chromedriver/downloads -
Firefox:https://github.com/mozilla/geckodriver/releases
-
Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
-
Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
下载chromedriver
百度搜索:淘宝镜像(https://npm.taobao.org/)
安装总结:https://www.jianshu.com/p/a383e8970135
安装 Selenium :pip install selenium
8.3 Phantomjs快速入门
⽆头浏览器:⼀个完整的浏览器内核,包括js解析引擎,渲染引擎,请求处理等,但是不包括显示和⽤户交互⻚⾯的浏览器。
from selenium import webdriver import time #PhantomJS 无界面浏览器,导入phantomjs.exe路径 driver=webdriver.PhantomJS('F:\pthonStudyFile\jichu\爬虫\phantomjs.exe') #打开百度 driver.get('https://www.baidu.com/') #定位操作,输入搜索内容python driver.find_element_by_id('kw').send_keys('python') #百度一下按钮 driver.find_element_by_id('su').click() time.sleep(3) #查看网页源代码 print(driver.page_source) #查看当前请求的url地址 print(driver.current_url) #截屏 driver.save_screenshot('baidu.png')
8.4 selenium快速入门
from selenium import webdriver import time driver=webdriver.Chrome() #打开百度 driver.get('https://www.baidu.com/') #窗口最大化 driver.maximize_window() #窗口最小化 driver.minimize_window() print() #关闭窗口 driver.close() #等待三秒 time.sleep(3) #退出浏览器 driver.quit()
8.4.1 定位元素
方法 | 功能 |
---|---|
find_element_by_id | 根据id来查找某个元素 |
find_element_by_class_name | 根据类名查找元素 |
find_element_by_name | 根据name属性的值来查找元素 |
find_element_by_tag_name | 根据标签名来查找元素 |
find_element_by_xpath | 根据xpath语法来获取元素 |
find_element_by_css_selector | 根据css选择器选择元素 |
from selenium import webdriver from selenium.webdriver.common.by import By import time driver=webdriver.Chrome() #打开百度 driver.get('https://www.baidu.com/') #定位元素 # find_element_by_id 跟着id来查找某个元素 #找到输入框,并输入文本 #根据id定位元素 driver.find_element_by_id('kw').send_keys('python') driver.find_element(By.ID,'kw').send_keys('java') # 根据类名查找元素 driver.find_element_by_class_name('s_ipt').send_keys('C++') driver.find_element(By.CLASS_NAME,'s_ipt').send_keys('C') #根据name属性来查找元素 driver.find_element_by_name('wd').send_keys('php') driver.find_element(By.NAME,'wd').send_keys('Go') #根据标签名查找元素 head=driver.find_element_by_tag_name('head') print(head) # 根据xpath语法来获取元素 driver.find_element_by_xpath('//input[@id="kw"]').send_keys('R') # 根据css选择器选择元素 driver.find_element_by_css_selector('.s_ipt').send_keys('python') inputTag=driver.find_elements_by_tag_name('input') print(inputTag,len(inputTag)) # driver.close()
- 要注意, find_element 是获取第⼀个满⾜条件的元素。 find_elements 是获取所有满⾜条件的元素
8.4.2 操作表单元素
方法 | 功能 |
---|---|
send_keys(value) | 将数据填充入输入框 |
clear() | 清除输入框中的内容 |
click() | 鼠标点击事件 |
switch_to_frame(iframe位置) | 却换到iframe |
select_by_value(value) | 根据值来选择元素 |
select_by_index(3) | 根据索引来选择元素 |
- 1.操作输入框:1.找到这个元。2.使用send_keys(value),将数据填充进去
- 使用clear()方法可以清除输入框中的内容
- 2.操作checkbox(如点击记住密码自动登录按钮) 因为要选中checkbox标签,在⽹⻚中是通过⿏标点击的。因此想要选中checkbox标签,那么先选中这个标签,然后执⾏click()事件
rememberTag = driver.find_element_by_name("rememberMe") rememberTag.click()
- 3.操作按钮 操作按钮有很多种⽅式。⽐如单击、右击、双击等。这⾥讲⼀个最常⽤的。就 是点击。直接调⽤click函数就可以了。
inputTag = driver.find_element_by_id('su') inputTag.click()
- 4.选择select(下拉列表) select元素不能直接点击。因为点击后还需要选中元素。这时候selenium就专 ⻔为select标签提供了⼀个类selenium.webdriver.support.ui.Select。将获取到的元素当成参数传到这个类中,创建这个对象。以后就可以使⽤这个对象进⾏选择了。https://www.17sucai.com/boards/53562.html
- 5.操作下拉列表案例
from selenium import webdriver import time from selenium.webdriver.support.ui import Select driver=webdriver.Chrome() # 打开目标网站 driver.get('https://www.17sucai.com/pins/demo-show?id=5926') #切换iframe(独立于源码外的一个url,拥有特定的功能) driver.switch_to_frame(driver.find_element_by_id('iframe')) #找到下拉框 selectTag=Select(driver.find_element_by_class_name('nojs')) #选择方式 # 1.根据值来选择 selectTag.select_by_value('AU') #2.根据索引来选择 selectTag.select_by_index(3)
- 6.登录豆瓣案例
from selenium import webdriver import time from selenium.webdriver.support.ui import Select driver=webdriver.Chrome() #登录豆瓣 driver.get('https://www.douban.com/') #却换iframe login_iframe=driver.find_element_by_xpath('//div[@class="login"]/iframe') driver.switch_to_frame(login_iframe) time.sleep(2) #却换登录方式 driver.find_element_by_xpath('//li[@class="account-tab-account"]').click() #选中checkbox选项 driver.find_element_by_id('account-form-remember').click() # 输入账号密码 driver.find_element_by_id('username').send_keys('123456') driver.find_element_by_id('password').send_keys('mima') # 点击登录按钮 driver.find_element_by_class_name('btn-account').click()
8.5 行为链
-
有时候在⻚⾯中的操作可能要有很多步,那么这时候可以使⽤⿏标⾏为链类ActionChains来完成。⽐如现在要将⿏标移动到某个元素上并执⾏点击事件
-
常用方法:详情见 https://selenium-python.readthedocs.io/api.html
方法 功能 click_and_hold(element) 点击但不松开⿏标 context_click(element) 右键点击 double_click(element) 双击 move_to_element(element) 移动鼠标 actions.perform() 提交行为链 from selenium.webdriver import ActionChains from selenium import webdriver driver=webdriver.Chrome() driver.get('https://www.baidu.com/') #定位到输入框 inputTag=driver.find_element_by_id('kw') #定位到百度按钮 submitBtn=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(submitBtn) actions.click() #点击右键 actions.context_click() #提交行为链的操作 actions.perform()
8.6 Cookie操作
- 获取所有cookie:
cookies = driver.get_cookies()
- 根据cookie的name获取cookie :
value = driver.get_cookie(key)
- 删除某个cookie:
driver.delete_cookie('key')
8.7 页面等待
现在的⽹⻚越来越多采⽤了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际⻚⾯等待时间过⻓导致某个dom元素还没出来,但是你的代码直接使⽤了这个WebElement,那么就会抛出NullPointer的异常。为了解决这个问题。所以 Selenium 提供了两种等待⽅式:⼀种是隐式等待、⼀种是显式等待
-
隐式等待:调⽤driver.implicitly_wait()。那么在获取不可⽤的元素之前,会先等待10秒中的时间
driver.implicitly_wait(10)
-
显示等待:显示等待是表明某个条件成⽴后才执⾏获取元素的操作。也可以在等待的时候指定⼀个最⼤的时间,如果超过这个时间那么就抛出⼀个异 常。显示等待应该使⽤selenium.webdriver.support.excepted_conditions 期望的条件和selenium.webdriver.support.ui.WebDriverWait来配合完成
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("https://www.baidu.com/") try: element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "myDynamicElement"))) finally: driver.quit()
⼀些其他的等待条件
-
presence_of_element_located():某个元素已经加载完毕了。
-
presence_of_all_elements_located():⽹⻚中所有满⾜条件的元素都加载完毕了。
-
element_to_be_clickable():某个元素是可以点击了。
更多条件请参考:http://selenium-python.readthedocs.io/waits.html
8.8 打开多窗口和却换页面
- 有时候窗⼝中有很多⼦tab⻚⾯。这时候肯定是需要进⾏切换的。selenium提供了⼀个叫做switch_to_window来进⾏切换,具体切换到哪个⻚⾯,可以从driver.window_handles中找到
from selenium import webdriver import time from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('https://www.baidu.com/') # 打开百度 driver.execute_script('window.open("https://www.douban.com/")') # 打开豆瓣 # driver.get('https://www.douban.com/') # driver.close() # 关闭的是百度 # driver.quit() # 2个都关闭了 driver.find_element_by_id('kw').send_keys('python') # 操作的是百度 print(driver.current_url) # 打印网址 打印的是百度 driver.switch_to_window(driver.window_handles[1])#数字表示第几个url print(driver.current_url)
8.9 登录qq邮箱
from selenium import webdriver import time from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('https://mail.qq.com/') # 打开百度 login_frame=driver.find_element_by_id('login_frame') driver.switch_to_frame(login_frame) driver.find_element_by_id('switcher_plogin').click() driver.find_element_by_id('u').send_keys('qq账号') driver.find_element_by_id('p').send_keys('qq密码') driver.find_element_by_id('login_button').click()
2.14.10 登录淘宝
# 打开网址 https://www.taobao.com/ # 点击登录 # 点击进入购物车 https://cart.taobao.com/cart.htm # 全选商品 # 点击结算 # 点击提交订单 生成一个订单 代表着商品已经抢购了 from selenium import webdriver import time,datetime def login(): # 进入淘宝 driver.get('https://www.taobao.com/') # 点击登录 driver.find_element_by_xpath('//*[@id="J_SiteNavLogin"]/div[1]/div[1]/a[1]').click() # # 登录的方式 # # # 账号密码 # # driver.find_element_by_id('fm-login-id').send_keys('1212313') # # time.sleep(1) # # driver.find_element_by_id('fm-login-password').send_keys('fdfdfdf') # # # 登录按钮 # # driver.find_element_by_class_name('fm-button').click() time.sleep(6) driver.get('https://cart.taobao.com/cart.htm') now = datetime.datetime.now() print('登录成功,当前时间为',now.strftime('%Y-%m-%d %H:%M:%S')) def buy(times): while True: now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') # 现在的时间要大于抢购的时间 if now > times: # 点击全选 while True: try: if driver.find_element_by_xpath('//*[@id="J_SelectAll1"]/div'): driver.find_element_by_xpath('//*[@id="J_SelectAll1"]/div').click() break except: print('找不到全选按钮') time.sleep(1) # 点击结算 while True: try: if driver.find_element_by_xpath('//*[@id="J_Go"]/span'): driver.find_element_by_xpath('//*[@id="J_Go"]/span').click() break except: print('找不到结算按钮') # 提交订单 time.sleep(3) 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() break except: print('找不到结算按钮') if __name__ == '__main__': times = input('请输入抢购的时间:') driver = webdriver.Chrome() login() buy(times)
- Asp.net动态生成html页面(模板技术)
- AngularJS 不得不了解的服务 $compile 用于动态显示html内容
- PHP中动态HTML的输出技术
- Html Dom(动态页面的基础)的基本了解
- 360度动态漫游技术(html格式)
- PHP中动态HTML的输出技术
- html+js+PHP(使用了smarty模板技术)+mysql实现二级动态下拉列表(select)
- Html+CSS3技术实现动画、天气图标动态效果 效果很酷
- PHP中动态HTML的输出技术
- DHTML(动态HTML)前台页面技术介绍
- AngularJS 不得不了解的服务 $compile 用于动态显示html内容
- 使PHP页面静态化技术,php动态页面转html静态页面
- DHTMl案例(简称动态网页)--html、css、javascript、div技术的结合
- 使PHP页面静态化技术,php动态页面转html静态页面
- 使PHP页面静态化技术,php动态页面转html静态页面
- PHP中动态HTML的输出技术
- html+js+PHP(使用了smarty模板技术)+mysql实现二级动态下拉列表(select)
- PHP中动态HTML的输出技术
- 开发工具与关键技术: 使用HTML 徽章 CSS3 动画 JQUERY 动态切换 JS自动切换
- html+js+PHP(使用了smarty模板技术)+mysql实现二级动态下拉列表(select)