一切福田,不離方寸,從心而覓,感無不通。

MySQL 的 20+ 条最佳实践

数据库操作是当今 Web 应用程序中的主要瓶颈。 不仅是 DBA(数据库管理员)需要为各种性能问题操心,程序员为做出准确的结构化表,优化查询性能和编写更优代码,也要费尽心思。 在本文中,我列出了一些针对程序员的 MySQL 优化技术。 在我们开始学习之前,我补充一点:你可以在 Envato Market 上找到大量的 MySQL 脚本和实用程序。   1.优化查询的查询缓存 大部分MySQL服务器都有查询缓存功能。这是提高性能的最有效的方法之一,这是由数据库引擎私下处理的。当同一个查询被多次执行,结果会直接从缓存里提取,这样速度就很快。 主要的问题是,这对程序员来说太简单了,不容易看到,我们很多人都容易忽略。我们实际上是可以组织查询缓存执行任务的。 ? 1 2 3 4 5 6 // query cache does NOT work $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");   // query cache works! $today = date("Y-m-d"); $r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'"); 查询缓存在第一行不执行的原因在于CURDTE()功能的使用。这适用于所有的非确定性功能,就像NOW()和RAND()等等。。。因为功能返回的结果是可变的。MySQL决定禁用查询器的查询缓存。我们所需要做的是通过添加一额外一行PHP,在查询前阻止它发生。   2. EXPLAIN你的选择查询 使用EXPLAIN关键词可以帮助了解MySQL是怎样运行你的查询的。这有助于发现瓶颈和查询或表结构的其它问题。 EXPLAIN的查询结果会展示哪一个索引被使用过,表示怎样扫描和储存的,等等。。。 选择一个SELECT查询(一个有连接的复杂查询会更好),在它的前面添加关键词EXPLAIN,这样就可以直接使用数据库了。结果会以一个漂亮的表来展示。例如,就好比我执行连接时忘了添加一栏的索引: 现在它只会从表2里面扫描9和16行,而非扫描7883行。经验法则是乘以所有“行”那一栏的数字,你的查询性能会跟结果数字成比例的。   3. 获取唯一行时使用LIMIT 1 有时当你查表时,你已经知道你正在查找的结果只有一行。你可能正在获取唯一记录,或者你可能只是查询是否存在满足你的WHERE子句条件的记录。 在这种情况下,将LIMIT 1添加到查询条件中可以提高性能。这样,数据库引擎将在找到刚刚第一个记录之后停止扫描记录,而不是遍历整个表或索引。 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // do I have any users from Alabama?   // what NOT to do: $r = mysql_query("SELECT * FROM user WHERE state = 'Alabama'"); if(mysql_num_rows($r) > 0) {     // … }     // much better: $r = mysql_query("SELECT 1 FROM user WHERE state = 'Alabama' LIMIT 1"); if(mysql_num_rows($r) > 0) {     // … }   4. 索引搜索字段 索引不仅仅是为了主键或唯一键。如果你会在你的表中按照任何列搜索,你就都应该索引它们。 正如你所看到的,这个规则也适用于如 last_name LIKE a%' 的部分字符串搜索。当从字符串的开头搜索时,MySQL就可以使用那一列的索引。 你也应该明白什么样搜索可以不使用有规律的索引。例如,当搜索一个单词时(例如, WHERE post_content LIKE %apple%' […]

龙生   15 May 2017
View Details

MySQL存储过程中游标循环的跳出和继续操作示例

最近遇到这样的问题,在MySQL的存储过程中,游标操作时,需要执行一个conitnue的操作.众所周知,MySQL中的游标循环操作常用的有三种,LOOP,REPEAT,WHILE.三种循环,方式大同小异.以前从没用过,所以记下来,方便以后查阅. 1.REPEAT 复制代码代码如下: REPEAT Statements; UNTIL expression END REPEAT demo DECLARE num INT; DECLARE my_string  VARCHAR(255); REPEAT SET  my_string =CONCAT(my_string,num, , ); SET  num = num +1; UNTIL num <5 END REPEAT; 2.WHILE  复制代码代码如下: WHILE expression DO Statements; END WHILE demo DECLARE num INT; DECLARE my_string  VARCHAR(255); SET num =1; SET str = ; WHILE num  < span>10DO SET  my_string =CONCAT(my_string,num, , ); SET  num = num +1; END WHILE; 3.LOOP(这里面有非常重要的ITERATE,LEAVE) 复制代码代码如下: DECLARE num  INT; DECLARE str  VARCHAR(255); SET num =1; SET my_string = ; loop_label:  LOOP IF  […]

龙生   15 May 2017
View Details

MySQL字符串连接函数

MySQL中 concat 函数 使用方法: CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。 注意: 如果所有参数均为非二进制字符串,则结果为非二进制字符串。 如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。 一个数字参数被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型 cast, 例如: SELECT CONCAT(CAST(int_col AS CHAR), char_col) MySQL的concat函数可以连接一个或者多个字符串,如 mysql> select concat( 10 ); + + | concat( 10 ) | + + | 10   | + + 1 row in set (0.00 sec) mysql> select concat( 11 , 22 , 33 ); + + | concat( 11 , 22 , 33 ) | + + | 112233 | + + 1 row in set (0.00 sec) MySQL的concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL mysql> select concat( 11 , 22 ,null); + + […]

龙生   15 May 2017
View Details

c# WebBrowser如何伪造http referer

webbrowser1.Navigate(url, _self , null, Referer:http://www.xxxx.com );   from:http://blog.csdn.net/sunshuqian2005/article/details/23561535

龙生   15 May 2017
View Details

用n多的框架写同一个demo

最近有了比较长的空闲时间。 所以看了很多很多不同的语言,框架。 java用了很多年了,总觉得眼界都被java影响了,所以想从新开始学一点新的东西。 而一旦开始选择开始的路径,完美主义的小心思就出来作祟了。 泛泛的接触了好多好多东西,基本上主流的语言,框架都把入门文档看了个遍。 到最后都没有达到最初想学点东西的目的,反而看文档的能力提高不少 所以,我决定不再单纯的看了。 我觉得执行下面的计划,动手写写。这也是为什么文章开始就要写明发表时间,因为未来会发生什么谁也不知道,我得到的结果只是当下我认为的好结果而已。 仅此而已 这里是列表文本测试方式:controller层上返回服务器当前时间 new Date().getTime() //long类型 开发方式:使用各个框架的引导教程默认设置去写代码,尽量写最少的代码完成demo 测试的框架:jfinal(java),grails(groovy),play(scala),springboot-undertow(java),express(js),beego(golang),compojure(clojure) .看情况增加 测试内容:ab进行压测测试,开发效率(完成所花费的时间),上手难度,扩展性(面对需求频繁更改的可维护性) 压测命令:ab -n 100000 -c 1000 -k http://localhost:8080/ 测试机器:amdFX 6300 3.5G+8G+windows10 因为都是主观感受,因此对其他人来说没有任何参考价值 没有任何参考价值 没有任何参考价值 没有任何参考价值 重要的事情说三遍,免得别人以为我在宣扬啥。 下面开始贴图 jfinal jfianl是我用的最多的框架,目前整个公司也在用,真的用起来很爽,最喜欢orm层设计,可以不写字段,对于需要频繁变更数据库结构的前期开发非常顺手。扩展起来也很方便,毕竟是java系。上手的话和在测的这些比较对于0基础的朋友来说属于困难。 jfinal+tomcat9m 不打包,使用idea直接运行起来,配置文件里面关闭dev jfinal+tomcat8 war包 关闭dev jfinal + jetty9 war包 关闭dev spring spring是jee开发绕不过去的大山,springboot用的人越来越多,其实我之所以要看springboot只是对undertow这个框架感兴趣。因此测试结果也是直接测试undertow内核下的性能。 springboot上手难度的话个人感觉比jfianl简单一些,比着教程可以跑起来,不过对于不了解java的朋友来说 看到一大堆注解,会疯掉。 springboot+undertow idea中直接run scala scala号称是会干掉java的jvm语言,多范式,spark,这门语言本身有很强烈的光环,而且play作为非常牛逼的全栈框架,给人的体验是极爽的。写代码->刷新看结果,不需要重新编译。唯一感觉不好的是,scala这门语言好晦涩 .各种符号,各种+-*/,各种箭头。语言本身上手难度决定了这个框架的上手难度。 play groovy groovy是大家经常用却不知道它的语言,这么说的原因是,gradle就是groovy开发的。grails是groovy借鉴ruby on rails框架开发的web 框架,对新人极其友好,命令行里面,create-controller,create-doman,create-service。直到现在我还能回想起那种写代码顺畅的感觉。而且grails3以后,底层实现直接使用spring4+hibernate5。对于ssh系的开发人员来说,上手速度杠杠的。因此测试也是两种,console中直接执行使用的jetty,使用main函数执行使用springboot。而且由于本身是脚本语言,代码修改非常方便。 grails3 console中直接运行 grails3-springboot nodejs 作为nodejs杀手框架express,让前端人员在各种领域里面虐杀各种后台开发人员。俗话说的好,凡事能用js实现的东西,早晚要用js实现。上手速度没有比他更快了。而且写的是js的代码,简单又好学。nodejs真心不错的。 express4 clojure clojure 是jvm下面的一门lisp方言。俗话说,每过一段时间,总有一小撮人发现这个世界上还有另外一个世界叫lisp,并且他们妄想lisp能够统领全世界。其实lisp下面有不少web框架可以用,为什么选择compojure这个框架,主要原因还是http-kit。compojure默认配置使用jetty7执行,效率没法看了,但是换成http-kit内核以后,速度飞起.测试完http-kit以后,我对这个框架产生非常大的兴趣,有谁知道有http-kit有哪些应用吗? 这个速度真的是可怕啊。 上手难度:你知道lisp吗? compojure 默认配置 compojure+http-kit golang golang作为google亲儿子语言,不用多说了。好多朋友都喜欢,我去年也用了好一阵子,确实很好,而且beego作为国人开发的框架,教程的丰富程度,从视频到文字应有尽有。但是,不知道是什么原因,在我的机器上beego测试出来的速度有点匪夷所思的慢,这个值大家看看就成了 这个值大家看看就成了 这个值大家看看就成了这个值大家看看就成了 重要的事情说三遍,要不然我就成beego黑了. beego 默认配置 测试全部完成以后发现,其实测试本身没啥意义,因为都是默认配置,和优化以后效率就没有什么可比性了。因此只能图个乐呵。 茄子萝卜各有所爱,何必在意细节 from:https://my.oschina.net/jsmagic/blog/802851

龙生   15 May 2017
View Details

如何在CentOS 7中安装Git

Git是在今天的软件开发行业一个非常有用的版本控制工具。我一直使用Git。于是为Linux公社的读者写一篇如何在CentOS 7中安装Git教程 什么是Git? 如果你曾经使用过Github这样的网站或者在Bitbucket 购买过代码,把它展示给你的朋友,那么你可能知道Git是什么。至少,你肯定对它有过了解。 Git是软件开发中最广泛使用的版本控制系统,其最初发布于九年前的2005年4月7日,主要是为了保证一个大型的分布式开发项目的顺利进行。和客户端 服务器系统的开发不同,开发者独立于网络访问或中央服务器,因为每个Git的工作目录是一个全面的资料库。 创始人Linus Torvalds决定遵循GNU通用公共许可证第二版的协议条款,免费的发布Git。维基百科中可以了解到,有许多语言来正在开发这个版本控制系统,如Perl, Bash, C and Tcl。 在GentOS7上安装Git之前,我必须明确Git支持主流的操作系统,如Linux,POSIX,Windows和OS X. 分割线 GitHub 教程系列文章: GitHub 使用教程图文详解  http://www.linuxidc.com/Linux/2014-09/106230.htm Git 标签管理详解 http://www.linuxidc.com/Linux/2014-09/106231.htm Git 分支管理详解 http://www.linuxidc.com/Linux/2014-09/106232.htm Git 远程仓库详解 http://www.linuxidc.com/Linux/2014-09/106233.htm Git 本地仓库(Repository)详解 http://www.linuxidc.com/Linux/2014-09/106234.htm Git 服务器搭建与客户端安装  http://www.linuxidc.com/Linux/2014-05/101830.htm Git 概述 http://www.linuxidc.com/Linux/2014-05/101829.htm 分享实用的GitHub 使用教程 http://www.linuxidc.com/Linux/2014-04/100556.htm 分割线 前期准备 请确保您的机器上安装有CentOS 7系统以及一个帐户具有root权限。因为我们需要在系统上安装软件。 安装Git 从源代码编译 从源代码编译和安装软件并不是很难,但是可以肯定它需要一些知识,我强烈建议仔细地按照本教程的每个步骤,尤其是如果你之前还没有这样做过。 这个方法可以使我们获得包含最新的功能的最新的版本,但这种方法的缺点是,一旦安装完成正在被在CentOS系统中使用的yum包管理器不能更新 因为一些软件包之间有依赖关系,我们必须你必须以手动安装一些软件,才可以继续安装。于是我们可以打开CentOS7终端,运行以下命令。 拿到root权限 su root 使用下面的命令 sudo yum install Development Tools 如果 上面的命令没有执行,也可以使用下面的命令来解决这个问题。 yum  groupinstall Development Tools 选择Y并按下回车键。 然后运行下面的命令来安装需要本教程的一些其他的包。 1 sudo yum install gettext–devel openssl–devel perl–CPAN perl–devel zlib–devel 一旦依赖已经安装那么,我们需要找出并下载的Git软件的最新版本。下面的截图显示,我们可以得到最新版本的页面信息。 你可以从上面的截图看到最新的版本是V2.3.0。不要下载带有-rc的,因为它代表了一个候选发布版本。 通过使用wget的工具下载的Git的2.3.0版本。 1 wget https://Github.com/Git/Git/archive/v2.3.0.tar.gz 然后使用tar工具来解压您刚刚下载的.tar归档文件。 tar xvf v2.3.0.tar.gz   然后使用cd命令更改工作目录,如下所示。 […]

龙生   15 May 2017
View Details

你应该知道的9款流行 Web 框架及其优缺点

对于 Web 开发人员来说,找到一些合适的工具,能让工作轻松许多。这其中,Web 框架更是提升工作效率的“利器”。但因为可选的 Web 框架非常多,如何选择也是一件令人头疼的事情。 本文列出了9款目前比较流行的 Web 框架,并对优缺点进行分析,希望能对大家有所帮助。(内容主要编译自Ken Mazaika的The 9 Most In-Demand Web Frameworks And What You Need To Know About Them) 首先, 什么是 Web 框架? 当 Web 浏览器使用 HTTP 和在其他地方运行的服务器(计算机)通讯时,这些服务器会收到一些通知: 所选的 URL 如何输入网址(通过表单提交或只是在浏览器栏中输入网址) 服务器要干很多事情,比如: 读取数据库里的数据和添加数据 找到正确的结果(用户是否被允许查看试图访问的页面?是否要发送到不同的URL?等等) 构建用户将看到的网页 如果要提供更复杂的功能,就需要执行更多的步骤。作为开发人员,则需要对想要的功能列出一系列解决方案。Web 框架就是其中可选的解决方案之一。 进入正题: 1、Ruby on Rails 编程语言:Ruby 简介: Ruby on Rails 是一个已经被许多公司采用的 Web 框架,是 Ruby 编程语言中 Web 框架的鼻祖,获得了大量开发者的采用。DHH(Rails 的创始人)曾用它15分钟左右创建一个博客。 Rails 的一大特点是约定优于配置(convention over configuration)。这意味着,它比较模式化、标准化和“约定化”,开发者通常做的是相同的事情,可以让代码写到最少。 Rails 还使用了 MVC(Model-View-Controller),让架构更有组织性,更周密。 优点: Rails 具有强大的命令行界面,通过几个简单的命令就能在新的应用上启动和运行。 Rails 已经存在很长时间了,并且广泛被使用,网络上有很多关于它的教程。 Rails 简单易用,即便是复杂的问题,也能相对快速解决。 缺点: Rails 自动挂钩了很多东西。启动器里就包含很多文件,并且有相当多的配置代码是自动编写的,有些人可能会对此担心。 整体来看,鉴于其灵活性及便捷性,Rails 是一个非常理想的 Web 框架,值得初学者优先学习。 2、Sinatra 编程语言:Ruby 简介: 上面的5行代码就是做一个最低限度配置的空 Web 应用所需要的全部代码, 如果拿它和 Ruby on […]

龙生   15 May 2017
View Details

10+ 款 Web 开发常备工具

工欲善其事,必先利其器。如今 Web 开发标准越来越高,Web 开发者也在不断寻找途径提升自己的技能。为使大家的开发工作更顺利进行,本文整理了 10+ 款比较优秀的 Web 开发工具,希望对你有帮助。 喜欢的不要忘了收藏、点赞和打赏哦,感谢大家的支持! Bootstrap Bootstrap 是快速开发 Web 应用程序的前端工具包。它是一个 CSS 和 HTML 的集合,它使用了最新的浏览器技术,给你的 Web 开发提供了时尚的版式,表单,buttons,表格,网格系统等等。 DEMO:http://getbootstrap.com/     Atom Atom 是 Github 专门为程序员推出的一个跨平台文本编辑器。具有简洁和直观的图形用户界面,并有很多有趣的特点:支持 CSS,HTML,JavaScript 等网页编程语言。它支持宏,自动完成分屏功能,集成了文件管理器。 DEMO:https://atom.io/ Foundation Foundation 是一个易用、强大而且灵活的框架,用于构建基于任何设备上的 Web 应用。提供多种 Web 上的 UI 组件,如表单、按钮、Tabs 等。 DEMO:http://foundation.zurb.com/ Fiddler Fiddler 是一个 http 调试代理,它能够记录所有的你电脑和互联网之间的 http 通讯,Fiddler 可以也可以让你检查所有的 http 通讯,设置断点,以及 Fiddle 所有的“进出”的数据。Fiddler 要比其他的网络调试器要更加简单,因为它不仅暴露 http 通讯还提供一个用户友好的格式。 DEMO:http://www.telerik.com/fiddler Cloud9 IDE Cloud9 IDE 是一个基于 Node.JS 构建的 JavaScript 程序开发 Web IDE。它拥有一个非常快的文本编辑器,支持为 JS,HTML,CSS 和这几种的混合代码进行着色显示。Cloud9 IDE 还为 node.js 和 Google Chrome 集成调试器,可以在 IDE 中启动、暂停和停止。 DEMO:http://c9.io/ Notepad++ Notepad++ 是一款非常有特色的编辑器,是开源软件,可以免费使用。支持的语言: C, C++ , Java , C#, XML, HTML, […]

龙生   15 May 2017
View Details

Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

大纲 一、前言 二、环境准备 三、安装与配置Nginx 四、Nginx之反向代理 五、Nginx之负载均衡 六、Nginx之页面缓存 七、Nginx之URL重写 八、Nginx之读写分离 注,操作系统为 CentOS 6.4 x86_64 , Nginx 是版本是最新版的1.4.2,所以实验用到的软件请点击这里下载:http://yunpan.cn/QXIgqMmVmuZrm 一、前言 在前面的几篇博文中我们主要讲解了Nginx作为Web服务器知识点,主要的知识点有nginx的理论详解、nginx作为web服务器的操作讲解、nginx作为LNMP架构的讲解,不清楚的博友可以回头看看,在这一篇博客中我们主要讲解, nginx的反向代理、负载均衡、缓存、URL重写以及读写分离详解。好了,下面我们来具体说一说。 二、环境准备 1. 操作系统 CentOS 6.4 x86_64 2.软件版本 Nginx 1.4.2 3.实验拓扑 注,实验拓扑见下文。 4.安装yum源 1 2 3 [root@nginx ~]# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm [root@web1 ~]# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm [root@web2 ~]# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm 5.各节点时间同步 1 2 3 [root@nginx ~]# ntpdate 202.120.2.101 [root@web1 ~]# ntpdate 202.120.2.101 [root@web2 ~]# ntpdate 202.120.2.101 6.关闭防火墙与SELinux 1 2 3 4 5 6 7 8 9 10 11 12 [root@nginx ~]# service iptables stop [root@nginx ~]# chkconfig iptables off  […]

龙生   15 May 2017
View Details

网页抓取以及一些防范的方法

随着互联网的兴起,网页抓取已经被越来越多的人所应用,可以用来做各种白色的,黑色的,灰色的程序。典型的如一淘就是正大光明的去抓取电商之间的价格来作对比。 然而,作为服务器端来说,网页抓取就是噩梦,一方面增大了服务器的压力,另一方面用机器人做了很多应该被禁止去做的事。 如何防范他们,我想,是现在服务器端一个需要研究的课题。这里就总结一下各种防范的措施。 如果严格的定义这个问题,我们就是要做人机识别。也就是我们不知道来的请求是人还是机发出来的,但是要根据行为特征或者是一些方法去判断请求到底来自人还是机(这个很像是图灵测试,但并不完全一样)。 所以,服务器在执行实际任务之前,需要对请求去判断到底是不是来自机器。而这个判断,针对不同机器人的方法方式,又有很多应对方法。 1. 常规办法。(这里的常规办法,实际上并不能完全应付网页抓取,之所以写下来,是总结一下对于抓取有障碍的地方。) User-Agent: 通过它可以判断客户端的浏览器,但是客户端可以更改 Referer:一般用它来防盗链,referer指被请求页面的前一页,同样可以被客户端程序总结并利用 Cookie:一般用来做认证,所以这个基本上是许多客户端程序必须要做的事,要么勾住一个已有的cookie来登陆,要么模拟一个新的页面来产生新的cookie HTTPS:一般用来防止半路被人截取消息,但是如果你本身也是客户端的话……你可以直接去解密消息,甚至附上需要的证书 2.验证码,上面讲的方式都可以被客户端程序利用,究竟什么方式才可以阻止机器呢?一个已经被广为接受的方式就是使用验证码。验证码是个比较好的方式,但是,真正要设计好却不太容易。 比较差的方式见参考2,这样的验证码通常是防不住聪明的客户端的。 另一种极端的方式即复杂到人都快要辨识不出来的,会带来很差的用户体验。 所以,稍好一点的方式是提出有一定智能才能回答的问题,比如新浪微博会问“黑龙江的省会”之类的常识性问题。(还有的会问1+1=?,我相信这也是很容易识别的) 当然,现在还有的方式是结合广告的验证码,这样还把商业模式也融入其中,比较典型的如:XX银行存款已经突破2亿,然后将其中银行两个字标成红色,剩下的蓝色,并要你输入红色的字。 但是验证码并非万能和一劳永逸的,首要的一点就是要考虑用户体验,不能用在所有的地方,只能用在关键性的入口 于是客户端程序又蠢蠢欲动了,只需要把验证码抓回来给人输入一次,后面便畅通无阻。 3.冻结IP,针对客户端程序频繁或者并发抓取的特征,可以将频繁或抓取的ip封锁(有的服务器提供配置),比如说一个网页正常人来操作需要0.7ms以上,但是客户端程序却能够0.3ms请求一次,这种频繁请求就能被判断作机器刷新,于是一个新的方式就是在系统全局范围内记录ip(比如hashtable或者memcache)以及访问时间,当访问时间较短时就暂时冻结该ip过来的请求。 好吧,道高一尺魔高一丈,客户端这时候就会采用多IP或者代理来访问(即分布式的客户端) 4.多IP的冻结,应当明白,多IP同样会有行为模式。比如来自同一个网段,一旦发现,可以封锁整个网段(虽然比较愚蠢),有的爬虫采用定时轮转,也很容易发现(时间比较规律,请求数量同样很大)。 于是又有的爬虫开始丢弃这些模式,并把自己伪装得更像人 5.利用js执行。大多数客户端程序都是直接请求html,同时只执行html而并不执行javascript(难度比较大),于是,可以在请求的js里面放入一段js,正常执行时该js会访问服务器端并留下一个痕迹,但是如果是爬虫,就会发现大量的请求后不会留下该痕迹,于是,封之。 上面说了,是大多数客户端程序。也就是说还有少数更聪明的。利用浏览器内核(比如webkit)或者配合js引擎(比如v8)来抓取…… 6.。。。貌似人类已经很难阻止了爬虫了,如果要说阻止,那同样还是抓取量是一个比较明显的特征(因为爬虫不可能像人一样那么慢,否则海量网页很难完成) 参考:图灵测试 http://baike.baidu.cn/view/94296.htm 简单的验证码 http://xiaoxia.org/2011/08/04/discussion-on-certain-webpage-code-and-bypassing-validation/ 防爬总结 http://www.cnblogs.com/xoray007/archive/2011/11/22/2258366.html 另一篇python如何爬网页的文章 http://www.pythonclub.org/python-network-application/observer-spider 反爬虫的实践 http://robbinfan.com/blog/11/anti-crawler-strategy from:http://blog.csdn.net/liweisnake/article/details/8847354

龙生   15 May 2017
View Details