精华内容
下载资源
问答
  • python实现自动获取IP并发到邮箱

    千次阅读 2016-11-17 23:43:44
    python实现自动获取IP并发到邮箱树莓派没有显示器,而不想设置固定IP,因为要随身携带外出,每个网络环境可能网段不一样。因此想用python写个脚本,让树莓派开机后自动获取本机ip,并且自动发送到我指定邮箱。(完整...

    树莓派没有显示器,而不想设置固定IP,因为要随身携带外出,每个网络环境可能网段不一样。因此想用python写个脚本,让树莓派开机后自动获取本机ip,并且自动发送到我指定邮箱。(完整源码)

    1. 获取所有连接的网络接口,比如有线、wifi等接口
    def get_ip_address():
    
        #先获取所有网络接口
        SIOCGIFCONF = 0x8912
        SIOCGIFADDR = 0x8915
        BYTES = 4096         
        sck = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        names = array.array('B',b'\0' * BYTES)
        bytelen = struct.unpack('iL', fcntl.ioctl(sck.fileno(), SIOCGIFCONF, struct.pack('iL', BYTES, names.buffer_info()[0])))[0]
        namestr = names.tostring()
        ifaces = [namestr[i:i+32].split('\0', 1)[0] for i in range(0, bytelen, 32)]
    
        #再获取每个接口的IP地址
        iplist = []
        for ifname in ifaces:
            ip = socket.inet_ntoa(fcntl.ioctl(sck.fileno(),SIOCGIFADDR,struct.pack('256s',ifname[:15]))[20:24])
            iplist.append(ifname+':'+ip)
        return iplist
    

    2.把IP地址发送到指定邮箱

    def ip_send_mail(iptxt):
    
        #设置收件邮箱
        toaddrs  = 'to@mail.com'
        #设置发送邮箱
        fromaddr = 'send@mail.com' 
    
        #设置发送邮箱的账号密码
        username = 'your_sendmail@mail.com' 
        password = 'your_pass'
    
        #设置SMTP服务器、端口,根据你的邮箱设置,
        server = smtplib.SMTP('smtp.mail.com:25')
        #设置邮件正文,get_ip_address()返回的是list,要转换成str
        ip = '\r\n'.join(iptxt)
    
        #设置邮件标题和正文
        msg = MIMEText(ip,'plain', 'utf-8')
        msg['Subject'] = 'IP For RaspberryPi'
        msg['From'] = fromaddr
        msg['To'] = toaddrs
    
        #启动SMTP发送邮件
        server.ehlo()
        server.starttls()
        server.login(username,password)
        server.sendmail(fromaddr, toaddrs, msg.as_string())
        server.quit()
    

    3.最后调用以上函数运行即可

    if __name__ == '__main__':
    
        #获取IP
        iptxt = get_ip_address()
        #将IP存入文件,如果直接发送邮件,这步可以省略。
        ip_save_file(iptxt)   
        #将IP地址发送到指定邮箱
        ip_send_mail(iptxt)

    4.设置开机运行

    • 把以上代码都放入一个文件,把文件放到树莓派卡里面,如:/home/pi/get_ip_address.py
    • 给python脚本可执行权限

      sudo chmod +x get_ip_address.py

    • 设置系统启动时运行

      sudo vi /etc/profile

      编辑profile文件,在profile最后面,fi之前添加如下:

      python /home/pi/get_ip_address.py

    展开全文
  • 微信分享链接获取标题和小图片

    千次阅读 2019-05-28 11:23:09
    自动获取网页上的一张图片,但是为什么微信浏览器分享到朋友圈时图片却不显示呢? 想要的效果: 现实效果: 在网上搜了一下发现,原来是因为 微信浏览器上自动拉取的图片必须是大于300*300px的图片,( ...

    一、标题

    微信分享链接的小标题:自动拉取title标签的内容。

    二、链接的小图标

    今天测试的时候发现,网页链接在QQ浏览器上打开,分享的小图片是有显示的,

    自动获取网页上的一张图片,但是为什么微信浏览器分享到朋友圈时图片却不显示呢?

     

    v5zpjsub.png

    想要的效果:

    Ã¥þîäÿáÃ¥äúëéþæÃ¥è÷Ã¥æàéâÃ¥åðÃ¥þç

    现实效果:

    Ã¥þîäÿáÃ¥äúëéþæÃ¥è÷Ã¥æàéâÃ¥åðÃ¥þç

    在网上搜了一下发现,原来是因为 微信浏览器上自动拉取的图片必须是大于300*300px的图片,( 会取

     

    最近一张图片符合条件的)。

     

    解决办法:

     

    (一)

     

    在boby 和head之间添加下面的代码即可,图片路径自行修改。

     

    *注意这个图片必须是大于300px*300px的

    < bod y >
    
    < div style ='margin:0 auto;width:0px;height:0px;overflow:hidden;  ' >
    
    
    < img src='/image/data/pic300.jpg' / >
    
    
    < /div >
    
          < /bod y >
    
    
    (二)
    
       var imgUrl = 'http://www.baidu.com/images/share.jpg';  // 分享后展示的一张图片
    
       var lineLink = 'http://www.baidu.com'; // 点击分享后跳转的页面地址
    
       var descContent = "http://www.gettool.cn/GetwxLink/";  // 分享后的描述信息
    
       var shareTitle = 'http://www.gettool.cn/GetwxLink/';  // 分享后的标题
    
    
    var appid = '';  // 应用id,如果有可以填,没有就留空
    
    
            function shareFriend() {
    
                WeixinJSBridge.invoke('sendAppMessage',{
    
                    "appid": appid,
    
                    "img_url": imgUrl,
    
                    "img_width": "200",
    
                    "img_height": "200",
    
                    "link": lineLink,
    
                    "desc": descContent,
    
                    "title": shareTitle
    
                }, function(res) {
    
              //_report('send_msg', res.err_msg);  // 这是回调函数,必须注释掉
    
    
                })
    
            }
    
            function shareTimeline() {
    
                WeixinJSBridge.invoke('shareTimeline',{
    
                    "img_url": imgUrl,
    
                    "img_width": "200",
    
                    "img_height": "200",
    
                    "link": lineLink,
    
                    "desc": descContent,
    
                    "title": shareTitle
    
                }, function(res) {
    
             //_report('timeline', res.err_msg); // 这是回调函数,必须注释掉
    
                });
    
            }
    
            function shareWeibo() {
    
                WeixinJSBridge.invoke('shareWeibo',{
    
                    "content": descContent,
    
                    "url": lineLink,
    
                }, function(res) {
    
                    //_report('weibo', res.err_msg);
    
                });
    
            }
    
    
       // 当微信内置浏览器完成内部初始化后会触发WeixinJSBridgeReady事件。
    
    
       document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
    
                // 发送给好友
    
                WeixinJSBridge.on('menu:share:appmessage', function(argv){
    
                    shareFriend();
    
                });
    
                // 分享到朋友圈
    
                WeixinJSBridge.on('menu:share:timeline', function(argv){
    
                    shareTimeline();
    
                });
    
                // 分享到微博
    
                WeixinJSBridge.on('menu:share:weibo', function(argv){
    
                    shareWeibo();
    
                });
    
            }, false);
    
    

     

    GetwxLink

     

    展开全文
  • 米扑导航在收集网站、验证网站时,需要采集网页标题(title)、描述...本文原文转自米扑博客:PHP 获取网页标题(title)、描述(description)、关键字(keywords)等meta信息 1. PHP 内置函数 get_meta_tags12$meta_ar...

    米扑导航在收集网站、验证网站时,需要采集网页标题(title)、描述(description)、关键字(keywords)等meta信息

    本文将其整理出来,总结的经验分享给大家,欢迎交流、斧正、改进。

    本文原文转自米扑博客:PHP 获取网页标题(title)、描述(description)、关键字(keywords)等meta信息

     

    1. PHP 内置函数 get_meta_tags

    1
    2
    $meta_array = get_meta_tags('https://mimvp.com');
    var_dump($meta_array);

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    array (size=21)
      'description' => string '米扑科技,小而美、简而信,工匠艺术的互联网服务。' (length=72)
      'keywords' => string '米扑科技,米扑,mimvp.com,mimvp,米扑代理,米扑域名,米扑财富,米扑支付,米扑活动,米扑学堂,米扑博客,米扑论坛,小而美,简而信,简单可信赖' (length=175)
      'author' => string '米扑科技' (length=12)
      'version' => string 'mimvp-home-1.2' (length=14)
      'copyright' => string '2009-2017 by mimvp.com' (length=22)
      'mimvp-site-verification' => string 'I-love-mimvp.com-from-20160912' (length=30)
      'baidu-site-verification' => string 'pzH9C12mmf' (length=10)
      'sogou_site_verification' => string 'QCi6brPm84' (length=10)
      '360-site-verification' => string 'd42818ef57d4f110b6c1fdf268c8cb07' (length=32)
      'shenma-site-verification' => string 'f85fa0493059ca7e6b73ad5ae44751ec_1498128383' (length=43)
      'google-site-verification' => string 'DSE-4k0kg0zlz8aGyKmZImOoTkpiIreULTsgMwNqJYE' (length=43)
      'baiduspider' => string 'index,follow' (length=12)
      'googlebot' => string 'index,follow' (length=12)
      'bingbot' => string 'index,follow' (length=12)
      'robots' => string 'index,follow' (length=12)

     

    get_meta_tags 默认是 utf-8 编码,如果遇到 gbk、gb2312编码,则会出现乱码,

    例如,爬取www.qq.com首页,其编码为 gb2312 则出现了乱码:

    1
    2
    $meta_array = get_meta_tags('http://www.qq.com');
    var_dump($meta_array);

    运行结果:

    1
    2
    3
    4
    array (size=3)
      'baidu-site-verification' => string 'cNitg6enc2' (length=10)
      'keywords' => string '��Ѷ,����,�ƾ�,����,��Ƶ,NBA,�Ƽ�,��Ѷ��,��Ѷ,QQ,Tencent' (length=56)
      'description' => string '��Ѷ����2003�괴�������Ѿ���Ϊ��������Ϣ������ֱ���������ữý����Ѷ�Ͳ�ƷΪһ��Ļ�����ý��ƽ̨����Ѷ���������š��Ƽ����ƾ������֡�������������ʱ�еȶ��Ƶ������������û��Բ�ͬ������Ѷ������ͬʱרע��ͬ�������ݣ����쾫Ʒ��Ŀ����˳Ӧ������չ���ƣ��Ƴ�����ֱ���ȴ�����ʽ���ı����û���ȡ��Ѷ�ķ�ʽ��ϰ�ߡ�' (length=314)

     

    解决乱码,方法有二种(其实,方法有很多,这里先介绍两种)

    方法1

    需加上 header 头编码,正确代码格式如下:

    1
    2
    3
    header("content-type:text/html; charset=gb2312");
    $meta_array = get_meta_tags('http://www.qq.com');
    var_dump($meta_array);

     

    方法2

    通用的编码解决方案:

    1
    2
    3
    header("content-type:text/html; charset=xxx");
    $meta_array = get_meta_tags('http://www.qq.com');
    var_dump($meta_array);

    注意:charset=xxx 表示让浏览器自动适配正确的编码,不会造成乱码错误,header函数仅在PHP中使用

     

    小结:

    PHP 内置函数get_meta_tags 虽然可以获取meta信息,但是也有其缺点

    1)可能会出现编码错误、中文乱码,如上 https://mimvp.com(UTF-8) 和 http://www.qq.com(GB2312

    2) meta 获取的信息不全面,例如米扑科技首页(https://mimvp.com)还有 <meta charset="utf-8"> 等meta标签没有包含显示出来

     

     

    2. 爬取网页,正则匹配

    爬取网页内容,然后进行正则匹配

    1)爬取网页内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    function get_siteurl_curlinfo($url='https://mimvp.com', $timeout=5, $conntimeout=3) {
        $ch = curl_init();
        $url_host = explode("/", $url)[2];
         
        $header = array();
        array_push($header, 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36');
        array_push($header, 'Referer:' . $url);
        array_push($header, 'host:' . $url_host);
        array_push($header, 'accept:  text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8');
        array_push($header, 'upgrade-insecure-requests:1');
         
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);        // HTTP 头中的 "Location: "重定向
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        // 字符串返回
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);    // https请求 不验证证书和hosts
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_HEADER, 1);                // 0表示不输出Header,1表示输出
        curl_setopt($ch, CURLOPT_NOBODY, 0);                // 0表示不输出Body,1表示输出
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $conntimeout);     // 尝试连接时等待的秒数。设置为0,则无限等待
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout+5);              // 允许 cURL 函数执行的最长秒数
        curl_setopt($ch, CURLOPT_URL, $url);
        $output = curl_exec($ch);
        $curl_info = curl_getinfo($ch);
        curl_close($ch);
         
        $curl_info['page_info'] = get_page_info($output, $curl_info);
        return $curl_info;
    }

     

    2)正则匹配

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    function get_page_info($output) {
        $page_info = array();
        $page_info['site_title'] = '';
        $page_info['site_description'] = '';
        $page_info['site_keywords'] = '';
        $page_info['friend_link_status'] = 0;
        $page_info['site_claim_status'] = 0;
        $page_info['site_home_size'] = 0;
         
        if(empty($output)) return $page_info;
         
        # Keywords
        preg_match('/<META\s+name=["\']keywords[\'"]\s+content=["\']?([\w\W]*?)["\']/si', $output, $matches);
        if (empty($matches[1])) {
            preg_match('/<META\s+content=["\']([\w\W]*?)["\']\s+name=["\']keywords["\']/si', $output, $matches);
        }
        if (empty($matches[1])) {
            preg_match('/<META\s+http-equiv=["\']keywords["\']\s+content=["\']([\w\W]*?)["\']/si', $output, $matches);
        }
        if (empty($matches[1])) {
            preg_match('/<META\s+content=["\']keywords["\']\s+http-equiv=["\']([\w\W]*?)["\']/si', $output, $matches);
        }
        if (!empty($matches[1])) {
            $page_info['site_keywords'] = $matches[1];
        }
         
        # Description
        preg_match('/<META\s+name=["\']description["\']\s+content=["\']([\w\W]*?)["\']/si', $output, $matches);
        if (empty($matches[1])) {
            preg_match('/<META\s+content=["\']([\w\W]*?)["\']\s+name=["\']description["\']/si', $output, $matches);
        }
        if (empty($matches[1])) {
            preg_match('/<META\s+http-equiv=["\']description["\']\s+content=["\']([\w\W]*?)["\']/si', $output, $matches);
        }
        if (empty($matches[1])) {
            preg_match('/<META\s+content=["\']description["\']\s+http-equiv=["\']([\w\W]*?)["\']/si', $output, $matches);
        }
        if (!empty($matches[1])) {
            $page_info['site_description'] = $matches[1];
        }
         
        # Title
        preg_match('/<TITLE>([\w\W]*?)<\/TITLE>/si', $output, $matches);
        if (!empty($matches[1])) {
            $page_info['site_title'] = $matches[1];
        }
         
        # mimvp-site-verification
        preg_match('/<META\s+name=["\']mimvp-site-verification["\']\s+content=["\']([\w\W]*?)["\']/si', $output, $matches);
        preg_match('/<META\s+name="mimvp-site-verification"\s+content="([\w\W]*?)"/si', $output, $matches);
        if (empty($matches[1])) {
            preg_match('/<META\s+content=["\']([\w\W]*?)["\']\s+name=["\']mimvp-site-verification["\']/si', $output, $matches);
        }
        if (!empty($matches[1])) {
            $page_info['site_claim_status'] = $matches[1];
        }
         
        # mimvp-friend-link
        if(strstr($output, 'https://proxy.mimvp.com') != "") {
            $page_info['friend_link_status'] = 1;
        }
         
        $page_info['site_home_size'] = strlen($output);
         
        return $page_info;
    }

    这里,正则匹配的代码在网上也可以找到,但米扑科技对其进行了优化

    优化1)兼容单引号、双引号,兼容content前后顺序,兼容 name 和 http-equiv

    优化2)不仅匹配keywords和description,还匹配了标题(title)、自定义网站归属认证(mimvp-site-verification)、友情链接检测(friend_link_status)

    优化3)统计了正文网页大小,网页打开时间(上面代码没给出,可自己去实现,给出关键代码)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    //  获取毫秒的时间戳
    function getMillisecond() {
        //  $microtime = microtime();
        //  $time = explode(" ", $microtime);           // 毫秒 + 秒   0.51026400 1436683760
        //  $time = $time[1] . ($time[0] * 1000);       // 拼接成毫秒,   1436683760510.264
        //  $time2 = explode(".", $time)[0];            // 取毫秒整数        1436683760510
        //  $time3 = $time2 / 1000;                     // 毫秒转成秒        1436683760.51
        //  $res = sprintf('%01.3f', $time3);           // 格式小数秒        1436683760.510
         
        $time = explode(" ", microtime());
        return $time[1] + $time[0];
    }
     
    // 计算提取结果的耗时
    $cost_time_start = getMillisecond();
     
    echo "stat cost time";
     
    $cost_time = getMillisecond() - $cost_time_start;
    $res["cost_time"] = sprintf('%01.6f', $cost_time); 

     

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    array (size=27)
      'url' => string 'https://mimvp.com/' (length=18)
      'content_type' => string 'text/html; charset=UTF-8' (length=24)
      'http_code' => int 200
      'header_size' => int 254
      'request_size' => int 320
      'filetime' => int -1
      'ssl_verify_result' => int 0
      'redirect_count' => int 0
      'total_time' => float 0.072495
      'namelookup_time' => float 0.015999
      'connect_time' => float 0.023155
      'pretransfer_time' => float 0.051711
      'size_upload' => float 0
      'size_download' => float 20824
      'speed_download' => float 287247
      'speed_upload' => float 0
      'download_content_length' => float -1
      'upload_content_length' => float -1
      'starttransfer_time' => float 0.072301
      'redirect_time' => float 0
      'redirect_url' => string '' (length=0)
      'primary_ip' => string '47.95.6.112' (length=11)
      'certinfo' =>
        array (size=0)
          empty
      'primary_port' => int 443
      'local_ip' => string '192.168.31.191' (length=14)
      'local_port' => int 62474
      'page_info' =>
        array (size=6)
          'site_title' => string '米扑科技 - 简单可信赖' (length=30)
          'site_description' => string '米扑科技,小而美、简而信,工匠艺术的互联网服务。' (length=72)
          'site_keywords' => string '米扑科技,米扑,mimvp.com,mimvp,米扑代理,米扑域名,米扑财富,米扑支付,米扑活动,米扑学堂,米扑博客,米扑论坛,小而美,简而信,简单可信赖' (length=175)
          'friend_link_status' => int 0
          'site_claim_status' => string 'I-love-mimvp.com-from-20160912' (length=30)
          'site_home_size' => int 21078

     

    正则匹配,表面看似乎已经满足了需求,不仅匹配了keywords和description,还获得了title、自定义meta、特定友情链接判断等

    实际上,这里的正则匹配仍然无法用于项目,因为其内藏的问题还有很多,例如:

    1
    2
    3
    4
    5
    6
    <?php
    header("content-type:text/html; charset=xxx");
     
    $url = "https://mimvp.com";     // 默认 utf-8
    $url = "http://www.qq.com";     // 默认 gb2312,需添加 header,否则乱码
    $url = "https://www.dajie.com"; // content在前,name在后,匹配错误(从第一个content开始,从最后一个name结束)

    网页编码、乱码问题,似乎可以用 header 函数来解决,但是 content在前,name在后,匹配错误的问题,却没法解决!

    例如,匹配大街网的结果如下(部分):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    'page_info' =>
        array (size=6)
          'site_title' => string '求职找工作 - 人才招聘 - 大街网' (length=42)
          'site_description' => string '大街网是中国职业社交网站的缔造者,帮你找到更好的工作并工作的更好。24000000职业人士在这里创建立体化职业档案,打造职业形象,维系和拓展职业人脉,获取职业洞察。' (length=230)
          'site_keywords' => string '大街网是中国职业社交网站的缔造者,帮你找到更好的工作并工作的更好。24000000职业人士在这里创建立体化职业档案,打造职业形象,维系和拓展职业人脉,获取职业洞察。" name="description"/>
        <meta content="大街网,找工作,招聘,求职,校园招聘,应届生求职,职业档案,找实习,职业形象,职业 档案,中国职业社交网站缔造者。' (length=422)
          'friend_link_status' => int 0
          'site_claim_status' => int 0
          'site_home_size' => int 171181

    可见,site_keywords 中包含了 <meta content=" 内容,原因看大街网的网页源码

    1
    2
    3
    4
    <title>求职找工作 - 人才招聘 - 大街网</title>
    <link rel="shortcut icon" href="https://assets.dajieimg.com/images/favicon.ico" />
    <meta content="大街网是中国职业社交网站的缔造者,帮你找到更好的工作并工作的更好。24000000职业人士在这里创建立体化职业档案,打造职业形象,维系和拓展职业人脉,获取职业洞察。" name="description"/>
    <meta content="大街网,找工作,招聘,求职,校园招聘,应届生求职,职业档案,找实习,职业形象,职业 档案,中国职业社交网站缔造者。" name="keywords"/>

    匹配出错的原因,即上文我已经在注释里说明的:content在前,name在后,匹配错误(从第一个content开始,从最后一个name结束)

    这里,使用 get_meta_tags('https://www.dajie.com'); 则不会出现上面的问题,但其无法获取标题title等meta信息

    有没有更好的方法呢?既能获得正确的meta,又能获得title、自定义meta、特定字符串匹配(如友情链接)等

    答案,当然是有的,但是需要自己写代码实现,且比正则匹配、get_meta_tags 的功能更加强大!

     

     

    3. 改进网页正则匹配

    前面的两个方法,并不能完全且完美的满足我们米扑科技的最基本的需求:

    需求1) 正确的获取 keywords、description

    需求2) 正确的获取 title、自定义meta、检测特定字符串(如友情链接)等

    于是,自己动手写了

    原理思路:

    1)首先,正则匹配,获取全部的meta信息

    2)然后,保存每一个meta的key和value到数组(实现了一个自己的get_meta_tags函数)

    3)最后,提取 keywords和description

     

    优化的正则匹配代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    function get_page_info($output, $curl_info=array()) {
        $page_info = array();
        $page_info['site_title'] = '';
        $page_info['site_description'] = '';
        $page_info['site_keywords'] = '';
        $page_info['friend_link_status'] = 0;
        $page_info['site_claim_status'] = 0;
        $page_info['site_home_size'] = 0;
         
        if(empty($output)) return $page_info;
         
        // 获取网页编码,把非utf-8网页编码转成utf-8,防止网页出现乱码
        $meta_content_type = '';
        if(isset($curl_info['content_type']) && strstr($curl_info['content_type'], "charset=") != "") {
            $meta_content_type = explode("charset=", $curl_info['content_type'])[1];
        }
        if($meta_content_type == '') {
            preg_match('/<META\s+http-equiv="Content-Type"\s+content="([\w\W]*?)"/si', $output, $matches);       // 中文编码,如 http://www.qq.com
            if (empty($matches[1])) {
                preg_match('/<META\s+content="([\w\W]*?)"\s+http-equiv="Content-Type"/si', $output, $matches);
            }
            if (empty($matches[1])) {
                preg_match('/<META\s+charset="([\w\W]*?)"/si', $output, $matches);       // 特殊字符编码,如 http://www.500.com
            }
            if (!empty($matches[1]) && strstr($matches[1], "charset=") != "") {
                $meta_content_type = explode("charset=", $matches[1])[1];
            }
        }
        if(!in_array(strtolower($meta_content_type), array('','utf-8','utf8'))) {
            $output = mb_convert_encoding($output, "utf-8", $meta_content_type);        // gbk, gb2312
        }
         
        // 若网页仍然有乱码,有乱码则gbk转utf-8
        if(json_encode( $output ) == '' || json_encode( $output ) == null) {
            $output = mb_convert_encoding($output, "utf-8", 'gbk');
        }
         
        $page_info['site_home_size'] = strlen($output);
         
        # Title
        preg_match('/<TITLE>([\w\W]*?)<\/TITLE>/si', $output, $matches);
        if (!empty($matches[1])) {
            $page_info['site_title'] = $matches[1];
        }
         
        // 正则匹配,获取全部的meta元数据
        preg_match_all('/<META(.*?)>/si', $output, $matches);
        $meta_str_array = $matches[0];
         
        $meta_array = array();
        $meta_array['description'] = '';
        $meta_array['keywords'] = '';
         
        foreach($meta_str_array as $meta_str) {
            preg_match('/<META\s+name="([\w\W]*?)"\s+content="([\w\W]*?)"/si', $meta_str, $res);
            if(!empty($res)) $meta_array[strtolower($res[1])] = $res[2];
             
            preg_match('/<META\s+content="([\w\W]*?)"\s+name="([\w\W]*?)"/si', $meta_str, $res);
            if(!empty($res)) $meta_array[strtolower($res[2])] = $res[1];
             
            preg_match('/<META\s+http-equiv="([\w\W]*?)"\s+content="([\w\W]*?)"/si', $meta_str, $res);
            if(!empty($res)) $meta_array[strtolower($res[1])] = $res[2];
             
            preg_match('/<META\s+content="([\w\W]*?)"\s+http-equiv="([\w\W]*?)"/si', $meta_str, $res);
            if(!empty($res)) $meta_array[strtolower($res[2])] = $res[1];
             
            preg_match('/<META\s+scheme="([\w\W]*?)"\s+content="([\w\W]*?)"/si', $meta_str, $res);
            if(!empty($res)) $meta_array[strtolower($res[1])] = $res[2];
             
            preg_match('/<META\s+content="([\w\W]*?)"\s+scheme="([\w\W]*?)"/si', $meta_str, $res);
            if(!empty($res)) $meta_array[strtolower($res[2])] = $res[1];
        }
         
        $page_info['site_keywords'] = $meta_array['keywords'];
        $page_info['site_description'] = $meta_array['description'];
        $page_info['meta_array'] = $meta_array;
         
        # mimvp-site-verification
        preg_match('/<META\s+name="mimvp-site-verification"\s+content="([\w\W]*?)"/si', $output, $matches);
        if (empty($matches[1])) {
            preg_match('/<META\s+content="([\w\W]*?)"\s+name="mimvp-site-verification"/si', $output, $matches);
        }
        if (!empty($matches[1])) {
            $page_info['site_claim_status'] = 1;
        }
         
        # mimvp-site-verification
        if(strstr($output, 'https://proxy.mimvp.com') != "") {
            $page_info['friend_link_status'] = 1;
        }
         
        return $page_info;
    }

    运行结果,解决方法1 大街网的问题:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    'page_info' =>
        array (size=7)
          'site_title' => string '求职找工作 - 人才招聘 - 大街网' (length=42)
          'site_description' => string '大街网是中国职业社交网站的缔造者,帮你找到更好的工作并工作的更好。24000000职业人士在这里创建立体化职业档案,打造职业形象,维系和拓展职业人脉,获取职业洞察。' (length=230)
          'site_keywords' => string '大街网,找工作,招聘,求职,校园招聘,应届生求职,职业档案,找实习,职业形象,职业 档案,中国职业社交网站缔造者。' (length=149)
          'friend_link_status' => int 0
          'site_claim_status' => int 0
          'site_home_size' => int 171177
          'meta_array' =>
            array (size=6)
              'description' => string '大街网是中国职业社交网站的缔造者,帮你找到更好的工作并工作的更好。24000000职业人士在这里创建立体化职业档案,打造职业形象,维系和拓展职业人脉,获取职业洞察。' (length=230)
              'keywords' => string '大街网,找工作,招聘,求职,校园招聘,应届生求职,职业档案,找实习,职业形象,职业 档案,中国职业社交网站缔造者。' (length=149)
              'referrer' => string 'always' (length=6)
              'content-type' => string 'text/html; charset=UTF-8' (length=24)
              'x-ua-compatible' => string 'ie=8' (length=4)
              'saoatech-site-verification' => string 'N2Y5MzU2M2YyNmVhOTllMGQwYmI4NzAwMTIxYmE2ZDU=' (length=44)

    一切都在代码里,核心有两个:

    1)匹配了所有meta信息,实现了自定义的 get_meta_tags

    2)解决网页乱码的问题,否则获取的数据是乱码或为空

    正则匹配,基本可以解决一切问题了

    但是用正则解决的问题,一般还会考虑有HTMP Parse解析来提取元素 element

     

     

    4. HTML Dom 解析网页,提取元素内容

    方法3 正则解析网页,是一个非常好的方法,这里再附加介绍一种 HTML Dom 解析,替换方法3的正则匹配即可

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    $doc = new DOMDocument();
    @$doc->loadHTML($output);
     
    // title
    $nodes = $doc->getElementsByTagName('title');
    $title = $nodes->item(0)->nodeValue;
     
    // meta
    $meta_array = array();
    $metas = $doc->getElementsByTagName('meta');
    for ($i = 0; $i < $metas->length; $i++) {
        $meta = $metas->item($i);
        if($meta->getAttribute('name')) {
            $meta_array[strtolower($meta->getAttribute('name'))] = $meta->getAttribute('content');
        }
        if($meta->getAttribute('http-equiv')) {
            $meta_array[strtolower($meta->getAttribute('http-equiv'))] = $meta->getAttribute('content');
        }
        if($meta->getAttribute('scheme')) {
            $meta_array[strtolower($meta->getAttribute('scheme'))] = $meta->getAttribute('content');
        }
    }
     
    $page_info['site_title'] = $title;
    $page_info['site_keywords'] = $meta_array['keywords'];
    $page_info['site_description'] = $meta_array['description'];
    $page_info['meta_array'] = $meta_array;

    遇到问题,一般采用方法3 和 方法4,基本可以解决80%的网页抓取问题

    此方法4和方法3,能够正常解析网页的前提是网页内容不能有乱码,

    解决乱码详见方法1和方法3,深究代码,注释已给出了四种方法

    下面给出测试case,供你验证乱码问题:

    1
    2
    3
    4
    5
    6
    7
    <?php
    header("content-type:text/html; charset=xxx");
     
    $url = "https://mimvp.com";     // 默认 utf-8
    $url = "http://www.qq.com";     // 默认 gb2312,需添加 header,否则乱码
    $url = "https://www.dajie.com"; // content在前,name在后,匹配错误(从第一个content开始,从最后一个name结束)
    $url = "http://dytt8.net";      // 无法获得网页编码,则用 json_encode( $output ) == '' 检测网页乱码

     

     

    附上 HTML <meta> 标签

    定义和用法

    <meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词。

    <meta> 标签位于文档的头部,不包含任何内容。<meta> 标签的属性定义了与文档相关联的名称/值对。

     

    HTML 与 XHTML 之间的差异

    在 HTML 中,<meta> 标签没有结束标签。

    在 XHTML 中,<meta> 标签必须被正确地关闭。

     

    提示和注释

    注释:<meta> 标签永远位于 head 元素内部。

    注释:元数据总是以名称/值的形式被成对传递的。

     

    必需的属性

    属性描述
    contentsome_text定义与 http-equiv 或 name 属性相关的元信息

    可选的属性

    属性描述
    http-equiv

    content-type

    expires

    refresh

    set-cookie

    把 content 属性关联到 HTTP 头部。
    name

    author

    description

    keywords

    generator

    revised

    others

    把 content 属性关联到一个名称。
    schemesome_text定义用于翻译 content 属性值的格式。

     

     

    总结

    至此,本文比较详细、全面的总结了PHP获取网页标题(title)、描述(description)、关键字(keywords)等meta信息的多种方法

    方法3,米扑科技自己写代码,改进了网页匹配,实现了获取全部meta信息,比PHP内置的 get_meta_tags 函数功能更加强大,也实现了一些自定义需求,基本满足了米扑科技的项目要求。其中,还有一些技术细节处理,需根据项目改进优化,这里就不给出了。

    本文分析了抓取网页遇到的多种问题,并给出了一个比较完善的匹配解决方案,

    本文基本可解决90%的网页匹配问题,余下的10%问题,在项目中遇到了就去逐步解决

    例如,有些网站禁止了curl、wget爬虫,也有的强制需要cookie、referer、host等header参数

    解决方案就是 PHP + Selenium + Firefox,通过虚拟浏览器爬取展现网页内容,并抓取其内容再解析,且听下文分解

     

    应用实例

    本文PHP匹配抓取网页,应用于米扑科技的项目有米扑导航米扑代理米扑博客米扑域名

    为方便客户,米扑科技提供了对外的API接口https://site.mimvp.com/api/header.php


    展开全文
  • 概述:如何获取最新数据,定时任务自动刷新,但是如果利用Boostrap Table 的refresh或load方法,虽然能完成这个功能,问题是这样刷,整个页面会闪动一下。那么如何没有闪动这个不好效果,就要利用Bootstrap append...

        概述:如何获取最新数据,定时任务自动刷新,但是如果利用Boostrap Table 的refresh或load方法,虽然能完成这个功能,问题是这样刷,整个页面会闪动一下。那么如何没有闪动这个不好效果,就要利用Bootstrap append方法。append就是连接问题,那么问题来了,如何去除重复数据?

    方法一:可以选中整个表所有数据,然后一个一个剔除。(这是正常常规方法)。

    方法二:是不是可以记录一下最后一条数据,怎么记录?然后你将这个作为条件参数传入后台查询数据库(这样可以减少查询数据量和Bootstrap比较的次数),打算采用第二种方法

    1、前提条件

    • 引入jquery.js, 笔者采用是版本 v1.11.1
    • 引入Boostrap  笔者采用是版本 bootstrap-3.3.7-dist
    • 引入Bootstrap Table   最新版

    2、引入css和js

    css:注意修改成你的href


    js: 注意修改成你的src


    html:

    <table id="table">
    </table>

    3、自定义js

    更新时间:2018年3月22日14:21:31

    更新内容:增加sortName:'creTime',  增加一个排序列,采用降序 (防止maxId(等于每页显示数量)对应是本页最大值)

    <script type="text/javascript" charset="utf-8">
    	var maxId=0;  //保存主键最大值
    		$('#table').bootstrapTable({
    			url : '/demo/coffee/getCoffee',
    			pagination : true,  //展示分页
    			showFooter : false,  //展示页脚
    			showHeader : true,  //展示页头
    			striped : true,    //深浅颜色条纹行
    			sortName: 'creTime',  //以时间为排序列
    			sortOrder:"desc",  //降序
    			columns : [ {
    				checkbox : true
    			}, {
    				field : 'id',
    				title : '序号',
    				//visible : false, //注意这个要可见,否则下面Formatter不会执行
    				formatter : function(value, row, index) {
    					if(value>maxId){
    						console.log(maxId);
    						//主键最大值
    						maxId = value;
    					}
    					return value;
    				}
    			} /* , {
    				title : '序号',//标题  可不加  
    				formatter : function(value, row, index) {
    					return index + 1;
    				}
    			} */, {
    				field : 'name',
    				title : '名称',
    				visible : false
    			}, {
    				field : 'status',
    				title : '状态',
    				formatter : function(value, row, index) {
    					if (value == 0) {
    						return '禁用';
    					} else if (value == 1) {
    						return '启用';
    					}
    
    				},
    				visible : false
    			}, {
    				field : 'opt',
    				title : '内容'
    			}, {
    				field : 'creTime',
    				title : '创建时间',
    				sortable: true,
    				formatter : function(value, row, index) {
    					if(value==null){
    						return "-";
    					}
    					return formatterDate(value);
    				}
    			}]
    		});
    		//定时任务调用
    		var timer2=window.setInterval(function(){
    			getFreshData();
    			console.log(maxId);
    		},1000); 
    		
    		function getFreshData(){
    			//继续查询命令执行状态
    			 $.ajax({
    					url : '/demo/coffee/getCoffee?id='+maxId,  //作为参数传入后台进行检验,只查询大于这个maxId的数据
    					method : 'get'
    				}).done(function(msg) {
    					var array = eval('('+msg+')');
    					//将数据追加到表格中
    					$('#table').bootstrapTable('append', array);
    					
    				});
    		}
    		function formatterDate(value) {
    			var da = new Date(value);
    			var year = da.getFullYear() + '-';
    			var month = da.getMonth() + 1 + '-';
    			var date = da.getDate() + ' ';
    			var hour = (da.getHours() > 9 ? da.getHours() : '0' + da.getHours())
    					+ ':';
    			var min = (da.getMinutes() > 9 ? da.getMinutes() : '0'
    					+ da.getMinutes())
    					+ ':';
    			var sec = (da.getSeconds() > 9 ? da.getSeconds() : '0'
    					+ da.getSeconds());
    			return [ year, month, date, hour, min, sec ].join('');
    		}
    	</script>

    关键位置:

    • id字段中Formatter函数中保存当前最大主键值
    • 定时任务调用

    url : '/demo/coffee/getCoffee?id='+maxId,   注意换成你自己请求地址

    4、整个文件:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet"
    	href="../bootstrap-3.3.7-dist/css/bootstrap.min.css"></link>
    <!-- Latest compiled and minified CSS -->
    <link rel="stylesheet" href="../css/bootstrap-table.min.css">
    </head>
    <body>
    	
    	<table id="table">
    
    	</table>
    	<script type="text/javascript" src="../lib/jquery.js"></script>
    	<script type="text/javascript"
    		src="../bootstrap-3.3.7-dist/js/bootstrap.min.js" ></script>
    	<!-- Latest compiled and minified JavaScript -->
    	<script src="../lib/bootstrap-table.min.js" ></script>
    
    	<!-- Latest compiled and minified Locales -->
    	<script src="../lib/bootstrap-table-zh-CN.min.js">
    		
    	</script>
    	<script type="text/javascript" charset="utf-8">
    	var maxId=0;  //保存主键最大值
    		$('#table').bootstrapTable({
    			url : '/demo/coffee/getCoffee',
    			pagination : true,
    			showFooter : false,
    			showHeader : true,
    			striped : true,
    			sortable: true,
    			sortOrder:"asc",
    			columns : [ {
    				checkbox : true
    			}, {
    				field : 'id',
    				title : '序号',
    				//visible : false, //注意这个要可见,否则下面Formatter不会执行
    				formatter : function(value, row, index) {
    					if(value>maxId){
    						console.log(maxId);
    						//主键最大值
    						maxId = value;
    					}
    					return value;
    				}
    			} /* , {
    				title : '序号',//标题  可不加  
    				formatter : function(value, row, index) {
    					return index + 1;
    				}
    			} */, {
    				field : 'name',
    				title : '名称',
    				visible : false
    			}, {
    				field : 'status',
    				title : '状态',
    				formatter : function(value, row, index) {
    					if (value == 0) {
    						return '禁用';
    					} else if (value == 1) {
    						return '启用';
    					}
    
    				},
    				visible : false
    			}, {
    				field : 'opt',
    				title : '内容'
    			}, {
    				field : 'creTime',
    				title : '创建时间',
    				sortable: true,
    				formatter : function(value, row, index) {
    					if(value==null){
    						return "-";
    					}
    					return formatterDate(value);
    				}
    			}]
    		});
    		//定时任务调用
    		var timer2=window.setInterval(function(){
    			getFreshData();
    			console.log(maxId);
    		},1000); 
    		
    		function getFreshData(){
    			//继续查询命令执行状态
    			 $.ajax({
    					url : '/demo/coffee/getCoffee?id='+maxId,  //作为参数传入后台进行检验,只查询大于这个maxId的数据
    					method : 'get'
    				}).done(function(msg) {
    					var array = eval('('+msg+')');
    					//将数据追加到表格中
    					$('#table').bootstrapTable('append', array);
    					
    				});
    		}
    		function formatterDate(value) {
    			var da = new Date(value);
    			var year = da.getFullYear() + '-';
    			var month = da.getMonth() + 1 + '-';
    			var date = da.getDate() + ' ';
    			var hour = (da.getHours() > 9 ? da.getHours() : '0' + da.getHours())
    					+ ':';
    			var min = (da.getMinutes() > 9 ? da.getMinutes() : '0'
    					+ da.getMinutes())
    					+ ':';
    			var sec = (da.getSeconds() > 9 ? da.getSeconds() : '0'
    					+ da.getSeconds());
    			return [ year, month, date, hour, min, sec ].join('');
    		}
    	</script>
    </body>
    </html>

    涉及后台查询到数据库,你可以参考Spring+SpringMVC相关内容

    这里只是抛砖引玉的。

    展开全文
  • 今天帮朋友处理一个电脑问题,于是将忘记多年的批处理捡了回来,写了下面这个修改IP地址的批处理,其实网上有很多,但网络连接的名字不是本地连接就是其他固定名称,这段代码将会先去获取网络连接名称,再进行IP地址...
  • 一部分编码部分encoder,目的是获取image的特征,不同于其他方法直接将最后全连接层的vector(反映图片整体特征)拿过来,此处,作者提取的是卷积层的输出,这样能够将局部的图片信息提取出来,分别进行生成sentence...
  • ios快捷指令使用指南-TUST校园网认证自动连接登录

    千次阅读 热门讨论 2021-04-22 12:35:40
    快捷指令使用指南-TUST校园网认证自动连接登录 1.引言 快捷指令iCloud链接: 快捷指令版:https://www.icloud.com/shortcuts/7ceeba786eb046d0b23b0a6509563d17 自动化版:...
  • 当我们在连接一些公共场所的Wifi时,会发现这些Wifi都是不需要密码的,秒连接,但是网络一般不可用,需要二次弹出页面然后进行连接! 一般是接入公共网络,弹出认证页面,根据规则认证,最后连通网络。 其实原理...
  • WiFi功能也算简单,主需要导入使用苹果系统自带的框架即可,仅仅单纯的获取手机当前连接的WiFi名称,或者获取手机系统显示的WiFi列表,那就so easy了。这里我介绍一下WiFi开发主要的步骤和流程,一些其他的使用细节...
  • #获取视频标题 def getVedioName(url,av): r = requests.get(url,headers=header).text #取得网站代码 #a.*?b 匹配最短的,以a开始,以b结束的字符串。 #如果把它应用于aabab的话,它会匹配aab(第一到第三个字符...
  • 狂码近万字,只为让你学会SEO编程,用python实现完美标题自动生成 小5玩大数据2019-06-11 10:08 502 SEO Python公开课   因为近期官网上线了很多新功能,最近一段时间我介绍5118自家产品确实有点多,有些朋友...
  • 完整的框架源码下载...一、Python+unittest+requests+HTMLTestRunner 完整的接口自动化测试框架搭建_00——框架结构简解 首先配置好开发环境,下载安装Python并...
  • java获取数据库信息

    千次阅读 2019-05-26 11:15:33
    备用: package com.ren.test; import org.junit.Test; import java.sql.*; public class GetInfo { //获取数据库连接 public static Connection getConnection() { Connection conn = null; ...
  •  其实标题中有两层意思:第一层意思是在一些数据库管理不那么严格的中小型企业,可以通过Excel中的ODBC数据接口,与数据库或者数据仓库建立连接,直接快速取数,提高工作效率;第二层意思是Excel 2...
  • 本文是鉴于有些粉丝的工作需求,有时候需要遇到这些文件的处理。因此,我写了一个文章集合,供大家参考,整篇文章已经整理成册(如下图所示),如有需求,请私聊! 目录 ...       5)获取表格.
  • 如需转载请注明出处:python–爬虫–获取和解析存储网页内容–以薄荷网为例 我们在之前的文章中已经学习了如何进行数据抓包和截取 以及分析 访问网页。 例如: 抓取app数据教程–fiddler抓包数据截取-薄荷app为例 本章...
  • 2019 Python接口自动化测试框架实战开发(一)

    万次阅读 多人点赞 2019-06-28 15:55:25
    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!...整个项目分为四个部分:接口基础丶接口开发丶Unittest与接口测试结合以及接口自动化框架从设计到开发 接口基础包括:H...
  • by_index(0) # 获取单个表格值 (2,1)表示获取第3行第2列单元格的值 value = table.cell_value(2, 1) print("第3行2列值为",value) # 获取表格行数 nrows = table.nrows print("表格一共有",nrows,"行") # 获取第4列...
  • 【Android 应用开发】Android应用的自动更新模块

    万次阅读 多人点赞 2013-11-27 15:05:10
    Android自动更新模块, 适用于任何软件 , 附带该模块的源码, 拷贝即用
  • Dubbo消费者无法连接到生产者提供的服务?内网IP?

    万次阅读 多人点赞 2016-09-29 21:00:40
    环境:Cent OS 7.0背景:这篇文章的标题可以设置为如下几个,因为他都是同一个解决方法: (1)Dubbo注册zookepper时为什么会自动使用内网IP? (2)Dubbo消费者无法连接到生产者提供的服务 (3)。。。场景还原1...
  • ②当B打开之后会看到美女图片并不知道会获取自己的位置(第一次需要得到用户许 可,注意:A可提前几天或当天在B不知道的情况下让小B的手机号关注了公众号并且选择了同意获取位置),定位成功之后会自动发送给A一条模板...
  • 注意:华为手机需要先上架华为应用市场才可以自动更新apk。其他手机可能也需要先上架 关于安卓8.0不显示下载通知问题:https://blog.csdn.net/meixi_android/article/details/83379335 关于安卓8.0不能自动安装...
  • “ 介绍有关自动测试工具-uirecorder环境搭建” 01—目录 1.介绍 2.注意事项 3.介绍 4.环境搭建 5.重点提及一下nodejs的安装。 6.创建一个工程:录制web页面 7.扩展:录制app   02—注意事项 1.文件夹...
  • Power BI 如何获取数据做可视化

    千次阅读 2018-07-01 22:45:35
    l 获取数据 Power BI Desktop 可连接到种类广泛的多种数据源,包括本地数据库、Excel 工作表和云服务等。 它可帮助清理数据和设置数据格式,以使数据更为有用,包括拆分和重命名列、更改数据类型和处理日期。还可...
  • Typora自动编号功能——最强版

    万次阅读 多人点赞 2019-02-25 02:43:59
    Typora自动编号功能 文章目录Typora自动编号功能前言如何修改主题自动编号功能如何使主题生效总结参考 前言 最近切到Typora写需求文档和开发...但是,文档写多了之后,就发现一个问题,虽然MarkDown支持6级标题...
  • 数据库快速入门例子代码 下面的内容将简单说明怎样使用数据库。更详细的信息请阅读各个函数的单独介绍页面。...注意: 如果你的所有页面均要求初始化数据库类,你可以让它自动加载。详见 数据库连接。 多结果标准
  • java连接打印机

    千次阅读 2019-07-11 20:26:33
    使用连接线选择usb端口,完成后可以打印空白页进行测试。刚开始的时候因为找不到连接线,我使用笔记本蓝牙进行连接,选用串口com4连接,也可以进行打印。 得力打印机 下载驱动,配置端口,安装驱动。 后台 pom....
  • 原文标题:关于ADO.Net连接池(Connection Pool)的一些个人见解一下是原文:建立池连接可以显著提高应用程序的性能和可缩放性。SQL Server .NET Framework 数据提供程序自动为 ADO.NET 客户端应用程序提供连接池...
  • 自动识别图形验证码

    万次阅读 2008-04-22 14:05:00
    现在大多数网站都采用了验证码来防止暴力破解或恶意提交。但验证码真的就很安全吗?真的就不能被机器识别?...首先我马上在这个页面用右键菜单看源代码知道验证码获取页面后 你可以直接用 http://www.XXXX.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 69,631
精华内容 27,852
关键字:

自动获取链接的标题