动态HTML技术了解

八、动态HTML技术了解

8.1 ajax基本介绍

  • 动态了解HTML技术
    • JS是⽹络上最常⽤的脚本语⾔,它可以收集⽤户的跟踪数据,不需要重载⻚⾯ 直接提交表单,在⻚⾯嵌⼊多媒体⽂件,甚⾄运⾏⽹⻚
    • jQuery:jQuery是⼀个快速、简介的JavaScript框架,封装了JavaScript常⽤的功能代码
    • ajax:ajax可以使⽤⽹⻚实现异步更新,可以在不重新加载整个⽹⻚的情况下,对⽹⻚的某部分进⾏更新
  • 获取ajax数据的⽅式
    • 1.直接分析ajax调⽤的接⼝。然后通过代码请求这个接⼝。
    • 2.使⽤Selenium+chromedriver模拟浏览器⾏为获取数据。(需将chromedriver放入python的解释器中)
方式优点缺点
分析接⼝直接可以请求到数据。 不需要做⼀些解析⼯作。代码量少,性能⾼别是一些通过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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值