美文网首页
115.selenium和chromedriver来实现自动化的

115.selenium和chromedriver来实现自动化的

作者: 羽天驿 | 来源:发表于2020-02-12 20:47 被阅读0次

    一.什么叫做selenium webdriver?

    elenium是一款支持多种语言、多种浏览器、多个平台的开源web自动化测试软件,测试人员可用python、java等语言编写自动化脚本,使得浏览器可以完全按照你的指令运行,大大节省了测试人员用鼠标点击测试的时间。


    二.python下安装selenium和chromedriver

    1.下载chromedriver对应的版本----并进行系统环境变量的配置。
    2.安装selenium pip install selenium
    3.就可以在程序中使用webdriver了。

    三.使用webdriver代码:

    import requests
    from selenium import webdriver
    import time
    from lxml import etree
    
    from day3.kaisha import*
    
    # 获取二进制资源文件mp3
    def get_resource(url):
        headers =  {
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
        }
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            # response.content返回的是字节流,decode后变成字符串
            return response.content
        return None
    # 保存MP3
    def save_mp3(mp3_url,title):
        # 获取MP3的二进制流
        mp3_content=get_resource(mp3_url)
        with open('./mp3/%s.mp3' %title,"wb") as f:
            f.write(mp3_content)
    
    
    def get_page():
        #打开浏览器
        browser=webdriver.Chrome()
        url="https://emumo.xiami.com/chart"
        browser.get(url)
        #等待网页页面的连续加载
        time.sleep(2)
        html=browser.page_source
        return html
    def parse_page(html):
        etree_html = etree.HTML(html)
        results = etree_html.xpath('//tr[@class="songwrapper"]')
        for item in results:
            data_mp3 = item.xpath('./@data-mp3')[0]
            data_title = item.xpath('./@data-title')[0]
            # print(data_mp3, data_title)
            mp3_url=str2url(data_mp3)
            # print(mp3_url)
            save_mp3(mp3_url,data_title)
    
    def main():
        html=get_page()
        # print(html)
        parse_page(html)
    if __name__ == '__main__':
        main()
    

    四。补充

    selenium库-模拟用户登陆,并解析网页

    应用现状:

    selenium模拟浏览器进行数据抓取确定是当下最通用的数据采集方案,它通吃各种数据加载方式,能够绕过客户JS加密,绕过爬虫检测,绕过签名机制。它的应用,大量网站的反采集策略形同虚设。由于硒​​不会在HTTP请求数据中留下指纹,因此无法被网站直接识别和拦截

    selenium在运行的时候会暴露出一些预定义的Javascript变量(特征字符串),例如“ window.navigator.webdriver”,在非硒环境下其变量未定义,而在硒环境下,其变量true(如下图所示为selenium驱动下Chrome控制台打印出的值)

    大众点评网的验证码表单页,如果是正常的浏览器操作,能够有效的通过验证,但如果是使用selenium就会被识别,即使验证码输入正确,也会被提示“请求异常,拒绝操作” ,无法通过验证

    知道了屏蔽的原理,只要我们能够隐藏这些特征串就可以了。但是还不能直接删除这些属性,因为这样可能会导致selenium不能正常工作了。我们采用曲线救国的方法,使用中间人代理,诸如此类, proxy2.py或者mitmproxy,将JS文件(本例是yoda。*。js这个文件)中的特征字符串给过滤掉(或者替换掉,替换成根本不存在的特征串),让它无法正常工作,从而达到让客户端脚本检测不到selenium的效果

    安装:pip install selenium

    安装浏览器驱动:

    查找到与自己装的浏览器先匹配的驱动进行下载
    淘宝镜像驱动下载地址:https://npm.taobao.org/mirrors/chromedriver
    最好将下载的chromdriver.exe ⽂件放到Python Scripts⽬录下或者配置PATH路径
    
    

    引入selenium库,生成浏览器对象

    可以复制导入以下常用函数

    from selenium import webdriver
    from selenium.common.exceptions import TimeoutException
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver import ActionChains
    
    

    生成浏览器对象:

    brower = webdriver.Chrome()
    
    

    生成无头浏览器对象:

    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--headless')
    brower = webdriver.Chrome(chrome_options=chrome_options)
    
    

    设置网页窗口大小

    browser.set_window_size(1400, 700)
    
    

    设置最大等待时间

    wait = WebDriverWait(browser, 5)
    
    

    访问网页,生成网页页面对象

    browser.get('https://www.mkv99.com/vod-detail-id-9462.html')
    
    

    硒相关函数方法:

    获取渲染数据后的页面内容
    a= browser.page_source
    
    获取当前页面的url
    browser.current_url
    
    获取当前页面的cookies
    browser.get_cookies()
    
    根据节点的id查找获取节点对象
    input1 = browser.find_element_by_id('1thUrlid第01集')
    
    获取节点属性值
    href = input1.get_attribute('href'))
    
    css选择器获取节点
    input_list = browser.find_elements_by_css_selector('.dwon2')
    
    获取节点在页面中坐标(左上角)
    input1.location
    
    获取节点的宽高
    input1.size
    
    利用xpath方法获取节点:
    input3 = browser.find_element_by_xpath('//*[@class="dwon2"]')
    通过name的值获取
    input4 = browser.find_element_by_name('CopyAddr1')
    a= input4.tag_name
    通过文本文字获取有该文字的一个标签
    input5 = browser.find_element_by_link_text('今日更新')
    通过文本文字获取有该文字的多个标签
    input6 = browser.find_elements_by_partial_link_text('下载')
    获取节点文本值
    input5.text
    
    让页面执行js代码(让页面滑动到底部)
    str_js = 'var scrollHeight = document.body.scrollHeight;window.scrollTo(0, scrollHeight);'
    browser.execute_script(str_js)
    
    通过css选择器选择节点,并且等到该节点能被点击时获取(在最大等待时间内) --
    next_page = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_topPage .fp-next')))
    通过xpath获取节点,并且等到该节点存在时获取(在最大等待时间内) --
    next_page = wait.until(EC.presence_of_element_located((By.XPATH, '//a')))
    通过text文本内容获取节点,并且等到该节点存在时获取(在最大等待时间内) --
    next_page = wait.until(EC.presence_of_element_located((By.LINK_TEXT, '你好')))
    通过标签名获取节点,并且等到该节点存在时获取(在最大等待时间内) --
    next_page = wait.until(EC.presence_of_element_located((By.TAG_NAME, 'a')))
                --其他方法参照具体情况调用--
    
    模拟用户点击next_page这个标签节点,其他模拟用户的事件在最下面 -- 
    next_page.click()
    
    模拟用户操作浏览器上节点对象的方法 -- (需指定节点对象来调用下列方法)
    click(on_element=None) ——单击鼠标左键
    click_and_hold(on_element=None) ——点击鼠标左键,不松开
    context_click(on_element=None) ——点击鼠标右键
    double_click(on_element=None) ——双击鼠标左键
    drag_and_drop(source, target) ——拖拽到某个元素然后松开
    drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
    key_down(value, element=None) ——按下某个键盘上的键
    key_up(value, element=None) ——松开某个键
    move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
    move_to_element(to_element) --鼠标移动到某个元素
    move_to_element_with_offset(to_element, xoffset, yoffset) --移动到距某个元素(左上⾓坐标)多少距离的位置
    perform() ——执⾏链中的所有动作
    release(on_element=None) ——在某个元素位置松开鼠标左键
    send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
    send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素
    

    相关文章

      网友评论

          本文标题:115.selenium和chromedriver来实现自动化的

          本文链接:https://www.haomeiwen.com/subject/nethfhtx.html