zoukankan      html  css  js  c++  java
  • Scrapy学习-16-动态网页技术

    Selenium浏览器自动化测试框架
    简介
    •   Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。
    •   支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。
    •   这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。
    •   测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本
     
    功能
    •   框架底层使用JavaScript模拟真实用户对浏览器进行操作。测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。
    •   使浏览器兼容性测试自动化成为可能,尽管在不同的浏览器上依然有细微的差别。
    •   使用简单,可使用Java,Python等多种语言编写用例脚本
     
    安装
    1 pip install selenium
    官方文档
    1 http://selenium-python.readthedocs.io/
    驱动下载
    Chrome  https://sites.google.com/a/chromium.org/chromedriver/downloads
    
    Edge    https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
    
    Firefox https://github.com/mozilla/geckodriver/releases
    基本使用之模拟登陆知乎
    from selenium import webdriver
    from scrapy.selector import Selector
    
    browser = webdriver.Chrome(
        executable_path="E:Python Projectscrapyproject\_ArticleSpiderchromedriver_win32chromedriver.exe"
    )
    
    browser.get("https://www.zhihu.com/#signin")
    
    browser.find_element_by_css_selector(".view-signin input[name='account']").send_keys("18412542552")
    browser.find_element_by_css_selector(".view-signin input[name='password']").send_keys("as15fQAfa")
    
    browser.find_element_by_css_selector(".view-signin button.sign-button").click()
    
    # browser.quit()
    基本使用之模拟登陆微博并下拉滚动条
    from selenium import webdriver
    import time
    
    browser = webdriver.Chrome(
        executable_path="E:Python Projectscrapyproject\_ArticleSpiderchromedriver_win32chromedriver.exe"
    )
    
    browser.get("https://weibo.com/")
    
    time.sleep(5)
    browser.find_element_by_css_selector("#loginname").send_keys("<username>")
    browser.find_element_by_css_selector(".info_list.password input[node-type='password']").send_keys("<password>")
    browser.find_element_by_css_selector(".info_list.login_btn a[node-type='submitBtn']").click()
    
    for i in range(3):
        browser.execute_script("window.scrollTo(0, document.body.scrollHeight); var lenOfPage=document.body.scrollHeight; return lenOfPage;")
        time.sleep(3)
    
    # browser.quit()
    基本使用之不加载图片提升页面加载速度
    from selenium import webdriver
    
    chrome_opt = webdriver.ChromeOptions()
    prefs = {"profile.managed_default_content_settings.images":2}
    chrome_opt.add_experimental_option("prefs", prefs)
    
    browser = webdriver.Chrome(
        executable_path="E:Python Projectscrapyproject\_ArticleSpiderchromedriver_win32chromedriver.exe",
        chrome_options=chrome_opt
    )
    
    browser.get("https://www.taobao.com/")
    
    # browser.quit()
    基本使用之隐藏chrom图形界面
    注意: 目前只能在linux中使用
     
    下载相关模块
    1 pip install pyvirtualdisplay
    相关依赖下载
    sudo apt-get install xvfb
    
    pip install xvfbwrapper
    使用步骤
    from pyvirtualdisplay import Display
    display = Display(visible=0, size=(800, 600))
    display.start()
    
    browser = webdriver.Chrome(
        executable_path="E:Python Projectscrapyproject\_ArticleSpiderchromedriver_win32chromedriver.exe"
    )
    
    browser.get(https://www.taobao.com/)
    
    # browser.quit()
    基本使用之phantomjs
    特点
    •   无界面的浏览器,效率高
    •   在linux无图形化界面时使用较多
    •   多进程下phantomjs性能会严重下降
    •   多线程执行时不稳定
     
    下载
    1 http://phantomjs.org/download.html
    简单使用
    from selenium import webdriver
    
    browser = webdriver.PhantomJS(
        executable_path="E:Python Projectscrapyproject\_ArticleSpiderphantomjs-2.1.1-windowsinphantomjs.exe"
    )
    
    browser.get("https://item.taobao.com/item.htm?id=558638145403&ali_refid=a3_430673_1006:1109358544:N:%E6%89%8B%E6%9C%BA%E8%8B%B9%E6%9E%9C%E6%89%8B%E6%9C%BA:5d77c360cd1e64043b2f430be7531705&ali_trackid=1_5d77c360cd1e64043b2f430be7531705&spm=a2e15.8261149.07626516002.2")
    print(browser.page_source)
    
    browser.quit()
    集成selenium到scrapy框架中
    为每一个spider创建一个chrom浏览器对象
    import scrapy
    from scrapy.xlib.pydispatch import dispatcher
    from scrapy import signals
    from selenium import webdriver
    
    class JobboleSpider(scrapy.Spider):
        name = "jobbole"
        allowed_domains = ["blog.jobbole.com"]
        start_urls = ['http://blog.jobbole.com/all-posts/']
    
        def __init__(self):
            self.browser = webdriver.Chrome(
                executable_path="E:Python Projectscrapyproject\_ArticleSpiderchromedriver_win32chromedriver.exe"
            )
            super(JobboleSpider, self).__init__()
            dispatcher.connect(self.spider_closed, signals.spider_closed)
    
        def spider_closed(self, spider):
            self.browser.quit()
    
        def parse(self, response):
            pass
    编写middleware在下载时使用chrom打开网页
    import time
    from scrapy.http import HtmlResponse
    class JSPageMiddleware(object):
    
        def process_request(self, request, spider):
            if spider.name == "jobbole":
                spider.browser.get(request.url)
                time.sleep(3)
                return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding="utf-8", request=request)
    配置settings
    DOWNLOADER_MIDDLEWARES = {
        'ArticleSpider.middlewares.JSPageMiddleware': 1,
    }
    重写downloader实现selenium支持异步请求
    需要我们熟悉并遵守scrapy编程规范,可以参考
    1 https://github.com/flisky/scrapy-phantomjs-downloader
    其它浏览器自动化测试工具
    更加轻量型的加载动态页面的工具splash、grid
    特点
    •   比chrom和phantomjs性能更优
    •   支持分布式爬虫
    •   稳定性不如chrom高
    splash-github项目
    1 https://github.com/scrapy-plugins/scrapy-splash
    selenium扩展grid
    1 https://www.oschina.net/question/tag/selenium-grid
    其它浏览器自动化测试工具splinter (纯python开发)
    1 https://github.com/cobrateam/splinter
     
  • 相关阅读:
    【已解决】github中git push origin master出错:error: failed to push some refs to
    好记心不如烂笔头,ssh登录 The authenticity of host 192.168.0.xxx can't be established. 的问题
    THINKPHP 5.0目录结构
    thinkphp5.0入口文件
    thinkphp5.0 生命周期
    thinkphp5.0 架构
    Django template
    Django queryset
    Django model
    Python unittest
  • 原文地址:https://www.cnblogs.com/cq146637/p/9076281.html
Copyright © 2011-2022 走看看