xml地图|网站地图|网站标签 [设为首页] [加入收藏]
网页截图完毕重大词高亮,静态构造函数
分类:编程

定义:

1. 静态构造函数用于初始化静态数据,或用于执行仅需执行一次的特殊操作。

Web截图实现关键词高亮

  • 本质是函数(装饰其他函数),是为其他函数添加附加功能

2. 静态构造函数既没有访问修饰符,也没有参数。

代码

from selenium import webdriver
import time
import sys
import re
from PIL import Image
from io import BytesIO

DEBUG_MODE = True

with open("jquery.min.js") as jquery_file:
    JQUERY_SCRIPT = jquery_file.read()


def log(msg):
    if DEBUG_MODE:
        print(msg)


def capture_with_highlight(url, save_fn="capture.png", keywords=None):
    def init_browser():
        browser = webdriver.PhantomJS(service_log_path="log/"+save_fn+".log")
        browser.set_window_size(1400, 900)
        browser.set_page_load_timeout(40)  
        browser.set_script_timeout(40)
        return browser
    browser=init_browser()                                 
    log("正在打开页面:"+url)
    browser.get(url)  # Load page
    log("执行滚动脚本")
    browser.execute_script("""
        var y = 0;
        var step = 100;
        window.scroll(0, 0);

        function f() {
            if (y < document.body.scrollHeight) {
            y += step;
            window.scroll(0, y);
            setTimeout(f, 100);
            } else {
            window.scroll(0, 0);
            document.title += "scroll-done";
            }
        }
        setTimeout(f, 1000);
    """)

    for i in range(30):
        if "scroll-done" in browser.title:
            break
        time.sleep(1)

    log("滚动完成,判定关键词命中并添加高亮")
    if keywords:
        reg = "(" + ")|(".join(keywords) + ")"

        def loading_jquery(browser):
            has_jq = browser.execute_script(
                """return typeof(jQuery)!="undefined" """)
            if not has_jq:
                log("加载jquery脚本")
                browser.execute_script(JQUERY_SCRIPT)

        loading_jquery(browser)
        has_hit = browser.execute_script(
            """return $('body')&&/%s/.test($('body').text())""" % reg)
        if not has_hit:
            log("未在页面上找到关键词")
            browser.close()
            return False
        browser.execute_script("""
            var addHighlight=function(){
                var re=RegExp("%s")
                var hits = jQuery('body').find("*")
                                    .filter(function () {
                                        var obj = jQuery(this).clone();
                                        obj.find(':nth-child(n)').remove();
                                        return re.test(obj.text()); 
                                    })
                re.global = true
                hits.each(function () {
                    var html = jQuery(this).html()
                    html = html.replace(re, "%s")
                    jQuery(this).html(html)
                });
            }
            addHighlight()
            """ % (reg, "".join(["$%s" % (i + 1) for i in range(len(keywords))])))
    png_data = browser.get_screenshot_as_png()
    img = Image.open(BytesIO(png_data))
    background = Image.new("RGB", img.size, (255, 255, 255))
    background.paste(img, mask=img.split()[3])
    background.save("img/"+save_fn, 'JPEG', quality=80)
    return True


if __name__ == "__main__":
    capture_with_highlight(
        "https://item.jd.com/10124713723.html", keywords=["老字号"])

原则:

3. 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。

结果(部份截图)

图片 1

  • 不能修改被装饰函数的源代码
  • 不能修改被装饰函数的调用方式

4. 无法直接调用静态构造函数。

流程图

图片 2

 

5. 如果静态构造函数引发异常,运行时将不会再次调用该构造函数,并且在程序运行所在的应用程序域的生存期内,类型将保持未初始化。

实现装饰器知识储备:

    class Program
    {
        static void Main(string[] args)
        {
            // 在bus1实例化后调用静态构造函数,只调用一次
            Bus bus1 = new Bus(71);
            Bus bus2 = new Bus(72);
            bus1.Drive();
            System.Threading.Thread.Sleep(3600);
            bus2.Drive();
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
    public class Bus
    {
        protected static readonly DateTime globalStartTime;
        protected int RouteNumber { get; set; }
        static Bus ()
        {
            globalStartTime = DateTime.Now;
            Console.WriteLine("static constructor sets global start time to {0}", globalStartTime.ToLongTimeString());
        }
        public Bus (int routeNum)
        {
            RouteNumber = routeNum;
            Console.WriteLine("Bus #{0} is created", RouteNumber);
        }
        public void Drive()
        {
            TimeSpan elapsedTime = DateTime.Now - globalStartTime;
            Console.WriteLine("{0} is starting its route {1:N2} minutes after global start time {2}", this.RouteNumber, elapsedTime.TotalMilliseconds, globalStartTime.ToLongTimeString());
        }
    }

本文由澳门新葡亰手机版发布于编程,转载请注明出处:网页截图完毕重大词高亮,静态构造函数

上一篇:没有了 下一篇:右外连接,Pycharm的安装和使用
猜你喜欢
热门排行
精彩图文