selenium 订阅
硒是一种化学元素,化学符号是Se,在化学元素周期表中位于第四周期VI A族(第34号元素),是一种非金属。可以用作光敏材料、电解锰行业催化剂、动物体必需的营养元素和植物有益的营养元素等。硒在自然界的存在方式分为两种:无机硒和植物活性硒。无机硒一般指亚硒酸钠和硒酸钠,从金属矿藏的副产品中获得;后者是硒通过生物转化与氨基酸结合而成,一般以硒蛋氨酸的形式存在。 展开全文
硒是一种化学元素,化学符号是Se,在化学元素周期表中位于第四周期VI A族(第34号元素),是一种非金属。可以用作光敏材料、电解锰行业催化剂、动物体必需的营养元素和植物有益的营养元素等。硒在自然界的存在方式分为两种:无机硒和植物活性硒。无机硒一般指亚硒酸钠和硒酸钠,从金属矿藏的副产品中获得;后者是硒通过生物转化与氨基酸结合而成,一般以硒蛋氨酸的形式存在。
信息
分子量
78.96
密    度
4.81g/cm³
化学式
Se
血清正常硒
15~25(微克)/dl
英文名
selenium
CAS登录号
7782-49-2
熔    点
221℃
中文名
正常人尿硒
0.01~0.15mg/L
水溶性
不溶于水、醇,溶于硫酸、硝酸、碱
沸    点
684.9℃
外    观
灰色带金属光泽的固体
硒历史发展
发现人永斯·雅各布·贝采利乌斯(Jöns Jakob Berzelius),并把它命名为Selene,希腊语,月亮的意思。发现年份:1817年发现过程:1817年,瑞典的贝采利乌斯从硫酸厂的铅室底部的红色粉状物物质中制得硒。他还发现到硒的同素异形体。他还原硒的氧化物,得到橙色无定形硒;缓慢冷却熔融的硒,得到灰色晶体硒;在空气中让硒化物自然分解,得到黑色晶体硒。硒是一种多功能的生命营养素,常常用于肿瘤癌症克山病大骨节病、心血管病、糖尿病、肝病、前列腺病、心脏病、癌症等40多种疾病,广泛运用于癌症、手术、放化疗等。硒又分为植物活性硒和无机硒两种,无机硒一般指亚硒酸钠和硒酸钠,包括有大量无机硒残留的酵母硒、麦芽硒,从金属矿藏的副产品中获得,无机硒有较大的毒性,且不易被吸收,不适合人和动物使用。植物活性硒通过生物转化与氨基酸结合而成,一般以硒蛋氨酸的形式存在,植物活性硒是人类和动物允许使用的硒源。植物活性硒的科技水平主要看人体的吸收利用率,从这点上看:中国自主研发的硒比国外的硒更适合人体吸收。
收起全文
精华内容
参与话题
问答
  • Selenium

    千次阅读 多人点赞 2018-02-26 18:07:28
    Selenium     1、Python selenium —— 一定要会用selenium的等待,三种等待方式解读 2、专栏:Python Selenium自动化测试详解 3、通过selenium启动firefox时,启动插件和证书 4、判断元素是否显示、被使用、...
    展开全文
  • selenium-Selenium常用关键字和用法总结

    千次阅读 2019-07-01 22:32:41
    学习python+selenium有段时间了,分享一下在WEB自动化中使用到selenium相关的一些概念和用法 1、安装Python和Selenium包 安装Python:安装不同平台的Python可以在http://python.org/download/ 安装Selenium:pip3 ...

    学习python+selenium有段时间了,分享一下在WEB自动化中使用到selenium相关的一些概念和用法

    1、安装Python和Selenium包

        安装Python:安装不同平台的Python可以在http://python.org/download/
        安装Selenium:pip3 install -U selenium
        PyCharm设置:使用社区版,配置Python的解释器
    

    2、Selenium WebDriver基于Python的实例脚本(Demo)

        1)从Selenium包导入WebDriver才能使用Selenium WebDriver的方法;
        2)选用一个浏览器驱动实例,会提供一个几口去调用Selenium命令来跟浏览器交互;
        3)设置10s隐式等待时间来定义Selenium执行步骤的超时时间;
        4)调用driver.get()方法访问该应用程序,方法调用后,WebDriver会等待,一直到页面加载完成才继续执行脚本;
        5)Selenium WebDriver提供多种方法来定位和操作这些元素,例如设置值,单击按钮,在下拉组件中选择选项等;
            这里使用find_element_by_id来定位搜索输入框;这个方法会返回第一个id属性值与输入参数匹配的元素;
            (HTML元素是用标签和属性定义的)
        6)通过send_keys()方法输入新的特定值,调用submit()提交搜索请求;
        7)加载搜索结果页面,我们读取结果列表的内容并打印输出;通过find_elements_by_xpath获取路径满足
            class='c-abstract'的所有div标签,它将返回多于一个的元素列表;
        8)最后我们打印,获取到的标签的文本内容;在脚本的最后,我们可以使用driver.quit()来关闭浏览器;
    

    3、使用unittest编写单元测试以及写Selenium WebDriver测试

        实现执行测试前置条件、测试后置条件,比对预期结果和实际结果,检查程序的状态,生成测试报告,创建数据驱动测试等功能;
        1)Test Fixture(测试夹具):
            使用测试夹具,可以定义在单个或多个测试执行之前的准备工作和测试执行之后的清理工作;
        2)Test Case(测试用例):
            unittest中执行测试的最小单元,通过验证unittest提供的assert方法来验证一组特定的操作和输入以后得到的响应;
            unittest提供了一个名为TestCase的基础类,可以用来创建测试用例;
        3)Test Suit(测试套件):
            一个测试套件是多个测试或测试用例的集合,是针对被测程序的对应的功能和模块创建的一组测试,一个测试套件内的测试用例将一起执行;
        4)Test Runner(测试执行器):
            测试执行器负责测试执行调度并且生成测试结果给用户;
            测试执行器可以使用图形界面、文本界面或者特定的返回值来展示测试执行结果;
        5)Test Report(测试报告):
            测试报告展示所有执行用例的成功或者失败状态的汇总;包括失败的测试步骤的预期结果和实际结果,还有整体运行状况和运行时间的汇总;
        6)一般测试分为三个部分,即3A‘s
            ① Arrange:初始化前置条件,初始化被测试的对象,相关配置和依赖;
            ② Act:执行功能操作;
            ③ Assert:用来校验实际结果与预期结果是否一致;
    

    4、用TestCase类来实现一个测试

        1)我们将通过集成TestCase类并且 在测试类中为每一个测试添加测试方法来创建单个测试或者一组测试;
            测试用例使用excel维护,并且进行参数化,通过自定义context上下文管理的类,来操作excel,对excel中的参数进行匹配和替换;
        2)TestCase中的常用的assert方法,最主要的任务是:
            调用assertEqual()来校验结果;
            assertTrue()来验证条件;
            assertRaises来验证预期的异常;
            通过使用第三方库pymysql(Mysql)查询SQL,和TestCase的返回值,进行匹配校验;
            操作过程中重要的返回结果将通过调用logger来进行记录,以便快速定位问题;
        3)除了添加测试,还可以添加测试夹具,setUp()方法和tearDown()方法;
        4)一个测试用例是从setUp()方法开始执行,因此可以在每个测试开始前执行一些初始化的任务;此方法无参数,也无返回值;
        5)接着编写test方法,这些测试方法命名为test开头,这种命名约定通知test runner哪个方法代表测试方法;
        6)值得注意的是:test runner能找到的每个测试方法,都会在执行测试方法之前先执行setUp()方法,
            这样有助于确保每个测试方法都能够依赖于相同的环境;
        7)tearDown()方法会在测试执行完成之后调用,用来清理所有的初始值;
        8)最后就是运行测试:为了能通过命令行测试,我们可以在测试中添加对main方法的调用;
        9) 优化:为了能让各个测试方法共用一个实例,我们可以创建类级别的setUp()和tearDown()方法:
            1)通过setUpClass()方法和tearDownClass()方法及@classmethod标识来实现;
            2)这两个方法使在类级别初始化数据,替代了方法级别的初始化;
    

    5、学习unittest提供的不同类型的assert方法

        断言:unittest的TestCase类提供了很多实用的方法来校验预期结果和实际结果是否一致;以下为常用的集中断言方式:
        assertEqual(a, b [, msg]);
        assertNotEqual(a, b [, msg]);
        assertTrue(x [, msg]); assertFalse(x [, msg]);
        assertIsNot(a, b [, msg]);
        assertRaises(exc, fun, *args, **kwds);
    

    6、为一组测试创建TestSuite

        应用unittest的TestSuites特性,可以将不同的测试组成一个逻辑组,然后设置统一的测试套件,并通过一个命令来执行;
        具体通过TestSuites、TestLoader和TestRunner类来实现的;
        我们使用TestSuites类来定义和执行测试套件,将多可测试加到一个测试套件中;
        还用TestLoader和TextTestRunner创建和运行测试套件;
    

    7、使用unittest扩展来生成HTML格式的测试报告

    8、如何进行元素定位

        1)要搜索一个产品,需要先找到搜索框和搜索按钮,接着通过键盘输入要查询的关键字,最后用鼠标单击搜索按钮,提交搜索请求;
        2)Selenium提供了很多find_element_by方法定位页面元素,正常定位的话,相应的WebElement实例会被返回,
            反之将抛出NoSuchElementException的异常;
        3)8种find_element_by方法:
            ——find_element_by_id()
            ——find_element_by_name()
            ——find_element_by_class_name()
            ——find_element_by_tag_name()
            ——find_element_by_xpath()
            ——find_element_by_css_selector()
            ——find_element_by_link_text()#标签之间的文本信息
            ——find_element_by_partial_link_text()
        4)8种find_elements_by方法按照一定的标准返回一组元素:
            ——find_elements_by_id()
            ——find_elements_by_name()
            ——find_elements_by_class_name()
            ——find_elements_by_tag_name()
            ——find_elements_by_xpath()
            ——find_elements_by_css_selector()
            ——find_elements_by_link_text()
            ——find_elements_by_partial_link_text()
        5)值得一提的是class定位:class属性是用来关联CSS中定义的属性的;
            通过对元素ID、name、class属性来查找元素是最为普遍和快捷的方法;
            也可以增加一个测试用例断言元素的可用性:
    
    展开全文
  • Python自动化测试之Selenium

    万人学习 2019-08-07 15:57:44
    本课程详细介绍了Selenium Python版本的自动化测试方法和实践,通过本课程的学习你将掌握如下内容:Selenium 测试环境搭建单元测试、生成测试报告、定位元素、WebDriver属性和方法、WebElement属性和方法、操作form...
  • scrapy结合selenium解析动态页面

    万次阅读 多人点赞 2020-07-20 21:52:24
    scrapy解决动态页面的一个解决办法,scrapy结合selenium解析动态页面

    scrapy结合selenium解析动态页面

    1. 问题

    虽然scrapy能够完美且快速的抓取静态页面,但是在现实中,目前绝大多数网站的页面都是动态页面,动态页面中的部分内容是浏览器运行页面中的JavaScript脚本动态生成的,爬取相对困难;

    比如你信心满满的写好了一个爬虫,写好了目标内容的选择器,一跑起来发现根本找不到这个元素,当时肯定一万个黑人问号

    于是你在浏览器里打开F12,一顿操作,发现原来这你妹的是ajax加载的,不然就是硬编码在js代码里的,blabla的…

    然后你得去调ajax的接口,然后解析json啊,转成python字典啊,然后才能拿到你想要的东西

    妹的就不能对我们这些小爬爬友好一点吗?

    于是大家伙肯定想过,“为啥不能浏览器看到是咋样的html页面,我们爬虫得到的也是同样的html页面呢? 要是可以,那得多么美滋滋啊”

    2. 解决方案

    既然是想要得到和浏览器一模一样的html页面,那我们就先用浏览器渲染一波目标网页,然后再将浏览器渲染后的html拿给scrapy进行进一步解析不就好了吗

    2.1 获取浏览器渲染后的html

    有了思路,肯定是网上搜一波然后开干啊,搜python操作浏览器的库啊

    货比三家之后,找到了selenium这货

    selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。

    卧槽,这就是我们要的东西啦

    先试一波看看效果如何,目标网址http://quotes.toscrape.com/js/

    别着急,先来看一下网页源码


    我们想要的div.quote被硬编码在js代码中

    用selenium试一下看能不能获取到浏览器渲染后的html

    from selenium import webdriver
    
    # 控制火狐浏览器
    browser = webdriver.Firefox()
    
    # 访问我们的目标网址
    browser.get("http://quotes.toscrape.com/js/")
    
    # 获取渲染后的html页面
    html = browser.page_source
    

    perfect,到这里我们已经顺利拿到浏览器渲染后的html了,selenium大法好啊?

    2.2 通过下载器中间件返回渲染过后html的Response

    这里先放一张scrapy的流程图

    在这里插入图片描述

    所以我们只需要在scrapy下载网页(downloader下载好网页,构造Response返回)之前,通过下载器中间件返回我们自己<通过渲染后html构造的Response>不就可以了吗?

    道理我都懂,关键是在哪一步使用浏览器呢?

    分析:
    (1)我们的scrapy可能是有很多个爬虫的,有些爬虫处理的是纯纯的静态页面,而有些是处理的纯纯的动态页面,又有些是动静态结合的页面(有可能列表页是静态的,正文页是动态的),如果把<浏览器调用代码>放在下载器中间件中,那么除非特别区分哪些爬虫需要selenium,否则每一个爬虫都用selenium去下载解析页面的话,实在是太浪费资源了,就相当于杀鸡用牛刀了,所以得出结论,<浏览器调用代码>应该是放置于Spider类中更好一点;

    (2)如果放置于Spider类中,就意味着一个爬虫占用一个浏览器的一个tab页,如果这个爬虫里的某些Request需要selenium,而某些不需要呢? 所以我们还要在区分一下Request;

    结论:

    1. SeleniumDownloaderMiddleware(selenium专用下载器中间件):负责返回浏览器渲染后的Response
    2. SeleniumSpider(selenium专用Spider):一个spider开一个浏览器
    3. SeleniumRequest:只是继承一下scrapy.Request,然后pass,好区分哪些Request需要启用selenium进行解析页面,相当于改个名

    3. 撸代码,盘他

    3.1 自定义Request

    #!usr/bin/env python  
    # -*- coding:utf-8 _*-
    """ 
    @author:Joshua
    @description:
        只是继承一下scrapy.Request,然后pass,好区分哪些Request需要启用selenium进行解析页面,相当于改个名
    """
    import scrapy
    
    class SeleniumRequest(scrapy.Request):
        """
        selenium专用Request类
        """
        pass
    

    3.2 自定义Spider

    #!usr/bin/env python  
    # -*- coding:utf-8 _*-
    """ 
    @author:Joshua 
    @description:
        一个spider开一个浏览器
    """
    import logging
    import scrapy
    from selenium import webdriver
    
    
    class SeleniumSpider(scrapy.Spider):
        """
        Selenium专用spider
    
        一个spider开一个浏览器
    
        浏览器驱动下载地址:http://www.cnblogs.com/qiezizi/p/8632058.html
        """
        # 浏览器是否设置无头模式,仅测试时可以为False
        SetHeadless = True
    
        # 是否允许浏览器使用cookies
        EnableBrowserCookies = True
    
        def __init__(self, *args, **kwargs):
            super(SeleniumSpider, self).__init__(*args, **kwargs)
            
            # 获取浏览器操控权
            self.browser = self._get_browser()
    
        def _get_browser(self):
            """
            返回浏览器实例
            """
            # 设置selenium与urllib3的logger的日志等级为ERROR
            # 如果不加这一步,运行爬虫过程中将会产生一大堆无用输出
            logging.getLogger('selenium').setLevel('ERROR')
            logging.getLogger('urllib3').setLevel('ERROR')
            
            # selenium已经放弃了PhantomJS,开始支持firefox与chrome的无头模式
            return self._use_firefox()
    
        def _use_firefox(self):
            """
            使用selenium操作火狐浏览器
            """
            profile = webdriver.FirefoxProfile()
            options = webdriver.FirefoxOptions()
            
            # 下面一系列禁用操作是为了减少selenium的资源耗用,加速scrapy
            
            # 禁用图片
            profile.set_preference('permissions.default.image', 2)
            profile.set_preference('browser.migration.version', 9001)
            # 禁用css
            profile.set_preference('permissions.default.stylesheet', 2)
            # 禁用flash
            profile.set_preference('dom.ipc.plugins.enabled.libflashplayer.so', 'false')
            
            # 如果EnableBrowserCookies的值设为False,那么禁用cookies
            if hasattr(self, "EnableBrowserCookies") and self.EnableBrowserCookies:
                # •值1 - 阻止所有第三方cookie。
                # •值2 - 阻止所有cookie。
                # •值3 - 阻止来自未访问网站的cookie。
                # •值4 - 新的Cookie Jar策略(阻止对跟踪器的存储访问)
                profile.set_preference("network.cookie.cookieBehavior", 2)
            
            # 默认是无头模式,意思是浏览器将会在后台运行,也是为了加速scrapy
            # 我们可不想跑着爬虫时,旁边还显示着浏览器访问的页面
            # 调试的时候可以把SetHeadless设为False,看一下跑着爬虫时候,浏览器在干什么
            if self.SetHeadless:
                # 无头模式,无UI
                options.add_argument('-headless')
    
            # 禁用gpu加速
            options.add_argument('--disable-gpu')
    
            return webdriver.Firefox(firefox_profile=profile, options=options)
    
        def selenium_func(self, request):
            """
            在返回浏览器渲染的html前做一些事情
                1.比如等待浏览器页面中的某个元素出现后,再返回渲染后的html;
                2.比如将页面切换进iframe中的页面;
            
            在需要使用的子类中要重写该方法,并利用self.browser操作浏览器
            """
            pass
    
        def closed(self, reason):
            # 在爬虫关闭后,关闭浏览器的所有tab页,并关闭浏览器
            self.browser.quit()
            
            # 日志记录一下
            self.logger.info("selenium已关闭浏览器...")
    
    

    之所以不把获取浏览器的具体代码写在__init__方法里,是因为笔者之前写的代码里考虑过

    1. 两种浏览器的调用(支持firefox与chrome),虽然后来感觉还是firefox比较方便,因为所有版本的火狐浏览器的驱动都是一样的,但是谷歌浏览器是不同版本的浏览器必须用不同版本的驱动(坑爹啊- -’’)
    2. 自动区分不同的操作系统并选择对应操作系统的浏览器驱动

    额… 所以上面spider的代码是精简过的版本

    备注: 针对selenium做了一系列的优化加速,启用了无头模式,禁用了css、flash、图片、gpu加速等… 因为爬虫嘛,肯定是跑的越快越好啦?

    3.3 自定义下载器中间件

    #!usr/bin/env python  
    # -*- coding:utf-8 _*-
    """ 
    @author:Joshua 
    @description:
        负责返回浏览器渲染后的Response
    """
    import hashlib
    import time
    from scrapy.http import HtmlResponse
    from twisted.internet import defer, threads
    from tender_scrapy.extendsion.selenium.spider import SeleniumSpider
    from tender_scrapy.extendsion.selenium.requests import SeleniumRequest
    
    
    class SeleniumDownloaderMiddleware(object):
        """
        Selenium下载器中间件
        """
        
        def process_request(self, request, spider):
            # 如果spider为SeleniumSpider的实例,并且request为SeleniumRequest的实例
            # 那么该Request就认定为需要启用selenium来进行渲染html
            if isinstance(spider, SeleniumSpider) and isinstance(request, SeleniumRequest):
                # 控制浏览器打开目标链接
                browser.get(request.url)
                
                # 在构造渲染后的HtmlResponse之前,做一些事情
                #1.比如等待浏览器页面中的某个元素出现后,再返回渲染后的html;
                #2.比如将页面切换进iframe中的页面;
                spider.selenium_func(request)
                
                # 获取浏览器渲染后的html
                html = browser.page_source
                
                # 构造Response
                # 这个Response将会被你的爬虫进一步处理
                return HtmlResponse(url=browser.current_url, request=request, body=html.encode(), encoding="utf-8")
    

    这里要说一下下载器中间件的process_request方法,当每个request通过下载中间件时,该方法被调用。

    1. process_request() 必须返回其中之一: 返回 None 、返回一个 Response 对象、返回一个 Request 对象或raise IgnoreRequest 。
    2. 如果其返回 Response 对象,Scrapy将不会调用 任何 其他的 process_request() 或 process_exception() 方法,或相应地下载函数; 其将返回该response。 已安装的中间件的 process_response() 方法则会在每个response返回时被调用。

    更详细的关于下载器中间件的资料 -> https://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/downloader-middleware.html#id2

    3.4 额外的工具

    眼尖的读者可能注意到SeleniumSpider类里有个selenium_func方法,并且在SeleniumDownloaderMiddleware的process_request方法返回Resposne之前调用了spider的selenium_func方法

    这样做的好处是,我们可以在构造渲染后的HtmlResponse之前,做一些事情(比如…那种…很骚的那种…你懂的)

    1. 比如等待浏览器页面中的某个元素出现后,再返回渲染后的html;
    2. 比如将页面切换进iframe中的页面,然后返回iframe里面的html(够骚吗);

    等待某个元素出现,然后再返回渲染后的html这种操作很常见的,比如你访问一篇文章,它的正文是ajax加载然后js添加到html里的,ajax是需要时间的,但是selenium并不会等待所有请求都完毕后再返回

    解决方法:

    1. 您可以通过browser.implicitly_wait(30),来强制selenium等待30秒(无论元素是否加载出来,都必须等待30秒)
    2. 可以通过等待,直到某个元素出现,然后再返回html

    所以笔者对<等待某个元素出现>这一功能做了进一步的封装,代码如下

    #!usr/bin/env python  
    # -*- coding:utf-8 _*-
    """ 
    @author:Joshua 
    @description:
    """
    import functools
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    
    def waitFor(browser, select_arg, select_method, timeout=2):
        """
        阻塞等待某个元素的出现直到timeout结束
    
        :param browser:浏览器实例
        :param select_method:所使用的选择器方法
        :param select_arg:选择器参数
        :param timeout:超时时间
        :return:
        """
        element = WebDriverWait(browser, timeout).until(
            EC.presence_of_element_located((select_method, select_arg))
        )
    
    
    # 用xpath选择器等待元素
    waitForXpath = functools.partial(waitFor, select_method=By.XPATH)
    
    # 用css选择器等待元素
    waitForCss = functools.partial(waitFor, select_method=By.CSS_SELECTOR)
    

    waitForXpath与waitForCss 是waitFor函数的两个偏函数,意思这两个偏函数是设置了select_method参数默认值的waitFor函数,分别应用不同的选择器来定位元素

    4. 中间件当然要在settings中激活一下

    在这里插入图片描述

    在我们scrapy项目的settings文件中的DOWNLOADER_MIDDLEWARES字典中添加到适当的位置即可

    5. 使用示例

    5.1一个完整的爬虫示例

    # -*- coding: utf-8 -*-
    """
    @author:Joshua
    @description:
        整合selenium的爬虫示例
    """
    import scrapy
    from my_project.requests import SeleniumRequest
    from my_project.spider import SeleniumSpider
    from my_project.tools import waitForXpath
    
    
    # 这个爬虫类继承了SeleniumSpider
    # 在爬虫跑起来的时候,将启动一个浏览器
    class SeleniumExampleSpider(SeleniumSpider):
        """
        这一网站,他的列表页是静态的,但是内容页是动态的
        所以,用selenium试一下,目标是扣出内容页的#content
        """
        name = 'selenium_example'
        allowed_domains = ['pingdingshan.hngp.gov.cn']
        url_format = 'http://pingdingshan.hngp.gov.cn/pingdingshan/ggcx?appCode=H65&channelCode=0301&bz=0&pageSize=20&pageNo={page_num}'
    
        def start_requests(self):
            """
            开始发起请求,记录页码
            """
            start_url = self.url_format.format(page_num=1)
            meta = dict(page_num=1)
            # 列表页是静态的,所以不需要启用selenium,用普通的scrapy.Request就可以了
            yield scrapy.Request(start_url, meta=meta, callback=self.parse)
    
        def parse(self, response):
            """
            从列表页解析出正文的url
            """
            meta = response.meta
            all_li = response.css("div.List2>ul>li")
    
            # 列表
            for li in all_li:
                content_href = li.xpath('./a/@href').extract()
                content_url = response.urljoin(content_href)
                # 内容页是动态的,#content是ajax动态加载的,所以启用一波selenium
                yield SeleniumRequest(url=content_url, meta=meta, callback=self.parse_content)
    
            # 翻页
            meta['page_num'] += 1
            next_url = self.url_format.format(page_num=meta['page_num'])
            # 列表页是静态的,所以不需要启用selenium,用普通的scrapy.Request就可以了
            yield scrapy.Request(url=next_url, meta=meta, callback=self.parse)
    
        def parse_content(self, response):
            """
            解析正文内容
            """
            content = response.css('#content').extract_first()
            yield dict(content=content)
          
        def selenium_func(self, request):
            # 这个方法会在我们的下载器中间件返回Response之前被调用
            
            # 等待content内容加载成功后,再继续
            # 这样的话,我们就能在parse_content方法里应用选择器扣出#content了
            waitForXpath(self.browser, "//*[@id='content']/*[1]")
    
    

    5.2 更骚一点的操作…

    假如内容页的目标信息处于iframe中,我们可以将窗口切换进目标iframe里面,然后返回iframe的html

    要实现这样的操作,只需要重写一下SeleniumSpider子类中的selenium_func方法

    要注意到SeleniumSpider中的selenium_func其实是啥也没做的,一个pass,所有的功能都在子类中重写

    def selenium_func(self, request):
        # 找到id为myPanel的iframe
        target = self.browser.find_element_by_xpath("//iframe[@id='myPanel']")
        # 将浏览器的窗口切换进该iframe中
        # 那么切换后的self.browser的page_source将会是iframe的html
        self.browser.switch_to.frame(target)
    

    6. selenium的一些替代(一些解决动态页面别的方法)

    1. scrapy官方推荐的scrapy_splash
      • 优点
        • 是异步的
        • 可以将部署scrapy的服务器与部署splash的服务器分离开
        • 留给读者遐想的空间
      • 本人觉得的缺点
        • 喂喂,lua脚本很麻烦好吗…(大牛请别打我)
    2. 最新的异步pyppeteer操控浏览器
      • 优点
        • 调用浏览器是异步的,操控的单位是tab页,速度更快
        • 留给读者遐想的空间
      • 本人觉得的缺点
        • 因为pyppeteer是python版puppeteer,所以puppeteer的一些毛病,pyppeteer无可避免的完美继承
        • 笔者试过将pyppeteer整合至scrapy中,在异步中,scrapy跑起来爬虫,总会偶尔timeout之类的…

    anyway,上面两个都是不错的替代,有兴趣的读者可以试一波

    7. scrapy整合selenium的一些缺点

    1. selenium是阻塞的,所以速度会慢些
    2. 对于一些稍微简单的动态页面,最好还是自己去解析一下接口,不要太过依赖selenium,因为selenium带来便利的同时,是更多资源的占用
    3. 整合selenium的scrapy项目不宜大规模的爬取,比如你在自己的机子上写好了一个一个的爬虫,跑起来也没毛病,速度也能接受,然后你很开心地在服务器上部署了你项目上的100+个爬虫(里面有50%左右的爬虫启用了selenium),当他们跑起来的时候,服务器就原地爆炸了… 为啥? 因为相当于服务器同时开了50多个浏览器在跑,内存顶不住啊(土豪忽略…)
    展开全文
  • 以及使用selenium操作页面元素,实现点击、输入事件 所用技术 1.webmagic 添加需要爬取的url Spider.create(new MyProcessor()).addUrl("https://www.cnblogs.com/").thread(5).run(); 在process里面抓取符合...

    作者专注于Java、架构、Linux、小程序、爬虫、自动化等技术。 工作期间含泪整理出一些资料,微信搜索【程序员高手之路】,回复 【java】【黑客】【爬虫】【小程序】【面试】等关键字免费获取资料。技术交流、项目合作可私聊。 

    目录

    前言

    所用技术

    1.webmagic

    2.selenium


    前言

    网上的爬虫、自动化一般都是使用python来做的;

    身为java程序员,当然要不甘示弱!

    所以就写了java爬虫、自动化系列文章,供众多java程序员参考!

    首先看一下自动化操作百度首页的图像,模拟输入、点击事件(源码地址:做自动化必备工作以及hello world代码):

    所用技术

    1.webmagic

    添加需要爬取的url

    Spider.create(new MyProcessor()).addUrl("https://www.cnblogs.com/").thread(5).run();

    在process里面抓取符合条件的内容 

     public void process(Page page) {
            //判断链接是否符合http://www.cnblogs.com/任意个数字字母-/p/7个数字.html格式
            if(!page.getUrl().regex("http://www.cnblogs.com/[a-z 0-9 -]+/p/[0-9]{7}.html").match()){
               //加入满足条件的链接
                page.addTargetRequests(
                        page.getHtml().xpath("//*[@id=\"post_list\"]/div/div[@class='post_item_body']/h3/a/@href").all());
    
            }else{
                *[@id="post_list"]/div[5]/div[2]/h3/a
                //获取页面需要的内容
                System.out.println("抓取的内容:"+
                        page.getHtml().xpath("//*[@id=\"Header1_HeaderTitle\"]/text()").get()
                );
                count ++;
            }
        }

    2.selenium

    以今日头条为例对页面元素(“关注”按钮)进行点击

    设置驱动

    System.setProperty("webdriver.chrome.driver", "CHROMEPATH/chromedriver.exe");
            

    初始化driver

    WebDriver driver = new ChromeDriver();

    进入页面

    driver.get("https://www.toutiao.com/c/user/relation/4492956276/?tab=followed#mid=4492956276");

     获取所需元素

    WebElement submit = li.findElement(By.cssSelector(".submit"));

     点击

    submit.click();

    作者专注于Java、架构、Linux、小程序、爬虫、自动化等技术。 工作期间含泪整理出一些资料,微信搜索【程序员高手之路】,回复 【java】【黑客】【爬虫】【小程序】【面试】等关键字免费获取资料。技术交流、项目合作可私聊。

    展开全文
  • 更多关于python selenium的文章,请关注我的专栏:Python Selenium自动化测试详解 看到网上基本没有最新的chromedriver与chrome的对应关系表,便兴起整理了一份如下,希望对大家有用: chromedriver版本 ...
  • 快速搭建Python selenium环境

    万次阅读 2020-01-11 18:28:21
    1.Python安装selenium包:pip install selenium 2.给操作系统安装驱动: ①.查看谷歌浏览器版本 ②.去https://chromedriver.storage.googleapis.com/index.html下载浏览器对应驱动 chromedriver.exe ③.将下载...
  • selenium运行用例打印日志及错误截图

    千次阅读 2016-06-03 11:32:11
    selenium
  • 报错解决:selenium.common.exceptions.WebDriverException: Message: invalid argument: unrecognized capability: chromeOptions 详情:安装selenium和谷歌驱动后,运行报错。求教怎么解决。 以下是报错信息...
  • 全栈工程师开发手册 (作者:栾鹏) python教程全解 ...Selenium IDE(如果用Firefox) FireBug、FirePath(如果用Firefox) chromedriver、IEDriverServer、phantomjs.exe IDE(Pycharm/Subl...
  • selenium自动化测试实战

    万次阅读 多人点赞 2018-01-13 21:19:08
    一、Selenium介绍 Selenium 是什么?一句话,自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web...
  • selenium用法详解

    万次阅读 多人点赞 2017-11-30 06:55:52
    selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的...
  • selenium之火狐浏览器环境配置

    万次阅读 2020-04-18 19:24:37
    1.下载并安装火狐浏览器:https://www.firefox.com.cn/ 2.下载对应火狐浏览器版本驱动并放置到Python安装目录Scripts下,如本人的:D:\Program Files\Python\Python37\Scripts 驱动下载地址:......
  • selenium

    千次阅读 2012-02-03 16:56:38
    Part One --- Selenium IDE  Selenium IDE 是selenium测试工具中的其中一个,是一个基于FireFox的Web测试开发环境,可以录制、编辑和调试测试。Selenium IDE包含了Selenium Core,因此可以轻易地在...
  • 2019 Selenium Chrome版本与chromedriver兼容版本对照表

    万次阅读 多人点赞 2018-06-05 13:51:59
    在使用selenium启动谷歌Chrome浏览器的时候,是需要用到chromedirver的,两者之间的版本是需要匹配的,否则会出现下面类似的报错: Exception in thread "main" org.openqa.selenium.WebDriverException: unknown ...
  • Python selenium —— selenium与自动化测试成神之路

    万次阅读 多人点赞 2016-09-17 00:33:04
    很多都是明显的语法问题,一问方知,今天刚刚学selenium,之前也没有语法基础,没学过Java,没学过Python,就跑来搞selenium,想玩自动化。每当看到这样的同学,总是很想吐槽。今天博主也不是想要吐槽,只
  • File "D:\Program Files\python\lib\site-packages\selenium-3.13.0-py3.7.egg\selenium\webdriver\remote\webelement.py", line 628, in _execute return self._parent.execute(command, params) File "D:\...
  • [华为登录页](https://developer.huawei.com/consumer/cn/service/apcs/app/memberCenter.html#/agentPage "") ... ...但是通过Selenium打开的...请问有什么办法把**已有的认证信息**携带到Selenium打开的新页面上吗
  • Could not find a version that satisfies the requirement selenium (from versions: ) No matching distribution found for selenium C:\Python27\lib\site-packages\pip-7.1.2-py2.7.egg\pip\_vendor\requests\...
  • 前言: 总感觉自己的Selenium用的很溜,很熟悉了,现在发现比较零碎,不是那么的系统,所以想要总结下Selenium相关的知识点,作为回顾总结;然后就想写一系列的,从零开始,不知道是不是能够坚持在业余时间内总结完...
  • python怎么用selenium获取请求头? ``` d = selenium.webdriver.common.desired_capabilities.DesiredCapabilities.CHROME d['loggingPrefs'] = {'performance': 'ALL'} # --------------------分割线----------...
  • Python中Selenium的使用

    万次阅读 2019-05-30 09:10:45
    Selenium简介 安装Selenium-Python Selenium-Server的安装与使用 Selenium常用操作 请求一个页面 查找元素 填写表格 拖放 在不同的窗口和框架之间移动 访问浏览器历史记录 操作Cookies 等待页面加载完成 ...
  • Selenium篇如期而至,不同于前一个appium的系列,这个系列将直接带大家从selenium工具的入门到进阶 此外这一个系列的全部都将附带视频教学,需要视频教学的可以点击并输入暗号:CSDN 那么就开始吧!!! 目录前言第 ...
  • selenium+java+driver+firefox+google+seleniumide !!!浏览器的自动更新一定要去掉…!!! 版本会导致一系列问题,版本号不对应,未将驱动放到系统环境变量的Path下的文件加内,未将浏览器安装在默认的安装地址,都会导致...
  • 1、个人想利用python selenium(webdriver) 去拨测一些域名,域名不同,然后将这些域名返回的网页完全加载出来,再进行截图。 2、现在是利用selenium自动化访问无法判断每个页面是否完全加载出来,因为不同网页的...

空空如也

1 2 3 4 5 ... 20
收藏数 79,592
精华内容 31,836
关键字:

selenium