精华内容
下载资源
问答
  • 测试用例的几种常见设计方法

    千次阅读 2018-04-11 12:30:50
    测试用例的几种常见设计方法 测试用例常见的设计方法有:等价类划分法、边界值分析法、错误推测法、判定表法、正交实验法。 一.等价类划分法 顾名思义,等价类划分,就是将测试的范围划分成几个互不相交的子集,...

    测试用例的几种常见设计方法



       测试用例常见的设计方法有:等价类划分法、边界值分析法、错误推测法、判定表法、正交实验法。
       一.等价类划分法
      顾名思义,等价类划分,就是将测试的范围划分成几个互不相交的子集,他们的并集是全集,从每个子集选出若干个 有代表性的值作为测试用例。
      例如,我们要测试一个用户名是否合法,用户名的定义为:8位数字组成的字符。
      我们可以先划分子集:空用户名,1-7位数字,8位数字,9位或以上数字,非数字。
      然后从每个子集选出 若干个有代表性的值:
      空用户名:“”       (无效等价类实例,指对于软件规格说明而言,没有意义的、不合理的输入)
      1-7位数字:"234"        (无效等价类实例)
      8位数字:"00000000"     (有效等价类实例,能检验程序是否实现了规格说明中所规定的功能和性能)
      9位或以上数字:"1234567890"     (无效等价类实例)
      非数字:"abc&!!!"                 (无效等价类实例)
      他们5个,就是用等价类划分选出的测试用例。实际上,对于1-7位数字的子集来说,选“234”和“11111”没有本质的区别。
      等价类的划分,最关键的是子集的划分。实际上,非数字还可以继续划分子集:字母,特殊字符。
      究竟要划分到何种程度才合适呢?我请教过做测试的朋友,他的意见是,看你有多少资源和时间,还有,看是否值得。
      对此,我表示赞同,毕竟无论你怎么测试,总会有未发现的缺陷存在,所以,先解决容易被发现的问题再说。
       二.边界值分析法
      长期的测试工作经验告诉我们,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部。因此针对各种边界情况设计测试用例,可以查出更多的错误。选出的测试用例,应选取正好等于、刚刚大于、刚刚小于边界的值,例如,对于在区间min,max的值,测试用例可以记为min,min+,max,max-。
      例如,假定 X 为整数,10≤X≤100,那么 X 在测试中应该取的边界值为:10,11,99,100。
      注:上面只是说边界值,如果是完整的测试,除了边界值外,还需要一个正常值,即12-98之间的任意值。
       三.错误推测法
      错误推测法是指:在测试程序时,人们可以根据经验或直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这些错误的测试用例的方法。
      这种方法没有固定的形式,依靠的是经验和直觉,很多时候,我们都会不知不觉的使用到。
       四.判定表法
      又称为策略表,基于策略表的测试,是 功能测试中最严密的测试方法。该方法适合于逻辑判断复杂的场景,通过穷举条件获得结果,对结果再进行优化合并,会得到一个判断清晰的策略表。
      例如,某公司的对客户分类标准如下:
      顾客每次订货额在 1000元以上(含1000元),信誉好的,订单设“优先”标志;
      信誉不好,但是老客户的,订单设“优先”标志;
      信誉不好,但是新客户的,订单设“正常”标志;
      每次订货额在 1000元以下,订单设“正常”标志。
      绘制的决策表如下:
      此表分两大行,两大列,分别用不同的颜色区别。
      浅蓝:列出所有条件(或称为输入)
      浅灰:列出所有结果(或称为输出,行动或决策)
      浅黄:穷举所有条件的组合
      浅绿:根据每一列的条件,判断出结果
      因为穷举了所有条件,所以可以说这个判断是100%正确的。下一步是对这个表进行合并优化。
       例如,从编号为1,2的列可以看出,顾客订单>=1000,信誉好,不管是新顾客还是老顾客,都设为优先,于是上面的表合并整理后,得到下表
      这样,我们就可以得到更清晰的逻辑判断,也可以更好的协助我们编写测试用例。而决策表,对于开发人员来说一样有用。
      从上面的表格,我们就可以写出更简洁的判断语句。
       五.正交实验法
      用语言描述正交实验法会很抽象难懂,简单说,就是在各因素互相独立的情况下,设计出一种特殊的表格,找出能以少数替代全面的测试用例。
      其中,上面所说的特殊表格就是正交表,是按照一定规则生成的表。
      虽然说是特殊的表格,实际表现形式跟一般的表格没有什么区别,正交表的主要特征是,“均匀分布,整齐划一”,正是因为“均匀”的,所以才能以少数代替全部。
      例如:
      某所大学通信系共2个班级,刚考完某一门课程,想通过“性别”、“班级”和“成绩”这三个查询条件对通信系这门课程的成绩分布,男女比例或班级比例进行人员查询。
      按照传统的方式,我们将会穷举所有的组合,来编写测试用例,组合个数是2*2*2=8。
      排列组合参见下表
      当组合条件不多的时候,穷举暂时没问题,但是,一旦条件多了,组合个数就会以指数形式增长。
      这个时候,就要用到正交表了,通过选出有代表性的测试实例,达到以少数代替全面的效果。
      正交表如何设计呢,这个问题实际很复杂,涉及到组合统计的数学知识,有的正交表甚至到目前为止,还未得出算法。
      我们只能通过已知的模型套上去。
      例如,Dr. Genichi Taguchi 设计的正交表
      https://www.york.ac.uk/depts/maths/tables/orthogonal.htm
      Technical Support ( support.sas.com ) com 提供的
      http://support.sas.com/techsup/technote/ts723_Designs.txt
      首先,我们来看看基本的概念。
      因素:被测的元素称为因素,例如上面的性别,班级,成绩,均为因素,因素的个数我们记为k,此处k=3
      水平:因素的可能值,称为水平。例如班级的可能值为1或2。水平的个数我们记为m,此处正好每个因素的水平都是2,此处m=2。
      那么正交表的行数n的计算公式为,n=k*(m-1)+1,此处为n=3*(2-1)+1=4。即共有4行。
      我们通常用L表示这个正交表,完整的表示为Ln(mk)
      如果每个因素的水平数相等,我们称之为单一水平正交表,例如本例子就是,L4(23)
      各列水平数不完全相同的正交表称为混合水平正交表。如L8(4124),表示有一个因素的水平为4,有4个因素的水平为2。
      按照这个表达式,我们可以去套用已知的正交表。例如本例子是L4(23),从上面提供的两个链接均可以查到例子,虽然表达方式略有不同,但实际是一样的,我们从http://support.sas.com/techsup/technote/ts723_Designs.txt 查到,其正交表的格式为:
      23     n=4
      000
      011
      101
      110
      此处0,1是对可能值的编号,例如,我们可以将(0,1)分别映射为(女,男)(1班,2班)(及格,不及格)
      按照上面的格式,
      000:女  1班  及格
      011:女  2班  不及格
      101:男  1班  不及格
      110:男  2班  及格
      这就是我们所得到的正交表。
       六.总结
      功能测试方法还有很多,例如因果图法,状态转换测试法等,他们都略为复杂,像正交实验法一样,有各自的一套东西,不过本质都是通过画图,让我们更好的思考,最后转化成判定表。
      实际上常用的是前面五种方法,包括:等价类划分法、边界值分析法、错误推测法、判定表法、正交实验法。

    转自:http://www.51testing.com/html/30/n-3719130.html

    展开全文
  • Python爬虫突破封禁的6种常见方法

    万次阅读 多人点赞 2016-08-17 22:36:59
    最常用的方法是写一个自动化程序向网络服务器请求数据(通常是用HTML表单或其他网页文件),然后对数据进行解析,提取需要的信息。本文假定读者已经了解如何用代码来抓取一个远程的URL,并具备表单如何提交及...

    在互联网上进行自动数据采集(抓取)这件事和互联网存在的时间差不多一样长。今天大众好像更倾向于用“网络数据采集”,有时会把网络数据采集程序称为网络机器人(bots)。最常用的方法是写一个自动化程序向网络服务器请求数据(通常是用HTML表单或其他网页文件),然后对数据进行解析,提取需要的信息。

    本文假定读者已经了解如何用代码来抓取一个远程的URL,并具备表单如何提交及JavaScript在浏览器如何运行的机制。想更多了解网络数据采集基础知识,可以参考文后的资料。

    在采集网站的时会遇到一些比数据显示在浏览器上却抓取不出来更令人沮丧的事情。也许是向服务器提交自认为已经处理得很好的表单却被拒绝,也许是自己的IP地址不知道什么原因直接被网站封杀,无法继续访问。

    图片1

    原因可能是一些最复杂的bug,也可能是这些bug让人意想不到(程序在一个网站上可以正常使用,但在另一个看起来完全一样的网站上却用不了)。最有可能出现的情况是:对方有意不让爬虫抓取信息。网站已经把你定性为一个网络机器人直接拒绝了,你无法找出原因。

    接下来就介绍一些网络采集的黑魔法(HTTP headers、CSS和HTML表单等),以克服网站阻止自动采集。不过,先让我们聊聊道德问题。

    网络爬虫的道德与礼仪

    说实话,从道德角度讲,写作以下文字不易。我自己的网站被网络机器人、垃圾邮件生成器、网络爬虫和其他各种不受欢迎的虚拟访问者骚扰过很多次了,你的网站可能也一样。既然如此,为什么还要介绍那些更强大的网络机器人呢?有几个很重要的理由。

    • 白帽子工作。在采集那些不想被采集的网站时,其实存在一些非常符合道德和法律规范的理由。比如我之前的工作就是做网络爬虫,我曾做过一个自动信息收集器,从未经许可的网站上自动收集客户的名称、地址、电话号码和其他个人信息,然后把采集的信息提交到网站上,让服务器删除这些客户信息。为了避免竞争,这些网站都会对网络爬虫严防死守。但是,我的工作要确保公司的客户们都匿名(这些人都是家庭暴力受害者,或者因其他正当理由想保持低调的人),这为网络数据采集工作创造了极其合理的条件,我很高兴自己有能力从事这项工作。 
    • 虽然不太可能建立一个完全“防爬虫”的网站(最起码得让合法的用户可以方便地访问网站),但我还是希望以下内容可以帮助人们保护自己的网站不被恶意攻击。下文将指出每一种网络数据采集技术的缺点,你可以利用这些缺点保护自己的网站。其实,大多数网络机器人一开始都只能做一些宽泛的信息和漏洞扫描,接下来介绍的几个简单技术就可以挡住99%的机器人。但是,它们进化的速度非常快,最好时刻准备迎接新的攻击。 
    • 和大多数程序员一样,我从来不相信禁止某一类信息的传播就可以让世界变得更和谐

    阅读之前,请牢记: 这里演示的许多程序和介绍的技术都不应该在网站上使用。

    爬虫黑科技:网络机器人看起来像人类用户的一些方法

    网站防采集的前提就是要正确地区分人类访问用户和网络机器人。虽然网站可以使用很多识别技术(比如验证码)来防止爬虫,但还是有一些十分简单的方法,可以让你的网络机器人看起来更像人类访问用户。

    1. 构造合理的HTTP请求头

    除了处理网站表单,requests模块还是一个设置请求头的利器。HTTP的请求头是在你每次向网络服务器发送请求时,传递的一组属性和配置信息。HTTP定义了十几种古怪的请求头类型,不过大多数都不常用。只有下面的七个字段被大多数浏览器用来初始化所有网络请求(表中信息是我自己浏览器的数据)。

    图片2

    经典的Python爬虫在使用urllib标准库时,都会发送如下的请求头:

    图片3

    如果你是一个防范爬虫的网站管理员,你会让哪个请求头访问你的网站呢?

    安装Requests

    • 可在模块的网站上找到下载链接
    • (http://docs.python-requests.org/en/latest/user/install/)和安装方法,或者用任意第三方Python模块安装器进行安装。

    请求头可以通过requests模块进行自定义。https://www.whatismybrowser.com/网站就是一个非常棒的网站,可以让服务器测试浏览器的属性。我们用下面的程序来采集这个网站的信息,验证我们浏览器的cookie设置:

    图片4

    程序输出结果中的请求头应该和程序中设置的headers是一样的。

    虽然网站可能会对HTTP请求头的每个属性进行“是否具有人性”的检查,但是我发现通常真正重要的参数就是User-Agent。无论做什么项目,一定要记得把User-Agent属性设置成不容易引起怀疑的内容,不要用Python-urllib/3.4。另外,如果你正在处理一个警觉性非常高的网站,就要注意那些经常用却很少检查的请求头,比如Accept-Language属性,也许它正是那个网站判断你是个人类访问者的关键。

    请求头会改变你观看网络世界的方式 
    假设你想为一个机器学习的研究项目写一个语言翻译机,却没有大量的翻译文本来测试它的效果。很多大型网站都会为同样的内容提供不同的语言翻译,根据请求头的参数响应网站不同的语言版本。因此,你只要简单地把请求头属性从Accept-Language:en-US修改成Accept-Language:fr,就可以从网站上获得“Bonjour”(法语,你好)这些数据来改善翻译机的翻译效果了(大型跨国企业通常都是好的采集对象)。 
    请求头还可以让网站改变内容的布局样式。例如,用移动设备浏览网站时,通常会看到一个没有广告、Flash以及其他干扰的简化的网站版本。因此,把你的请求头User-Agent改成下面这样,就可以看到一个更容易采集的网站了! 
    User-Agent:Mozilla/5.0 (iPhone; CPU iPhone OS 712 like Mac OS X) App leWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53

    2. 设置cookie的学问

    虽然cookie是一把双刃剑,但正确地处理cookie可以避免许多采集问题。网站会用cookie跟踪你的访问过程,如果发现了爬虫异常行为就会中断你的访问,比如特别快速地填写表单,或者浏览大量页面。虽然这些行为可以通过关闭并重新连接或者改变IP地址来伪装,但是如果cookie暴露了你的身份,再多努力也是白费。

    在采集一些网站时cookie是不可或缺的。要在一个网站上持续保持登录状态,需要在多个页面中保存一个cookie。有些网站不要求在每次登录时都获得一个新cookie,只要保存一个旧的“已登录”的cookie就可以访问。

    如果你在采集一个或者几个目标网站,建议你检查这些网站生成的cookie,然后想想哪一个cookie是爬虫需要处理的。有一些浏览器插件可以为你显示访问网站和离开网站时cookie是如何设置的。EditThisCookie(http://www.editthiscookie.com/)是我最喜欢的Chrome浏览器插件之一。

    因为requests模块不能执行JavaScript,所以它不能处理很多新式的跟踪软件生成的cookie,比如GoogleAnalytics,只有当客户端脚本执行后才设置cookie(或者在用户浏览页面时基于网页事件产生cookie,比如点击按钮)。要处理这些动作,需要用Selenium和PhantomJS包。

    Selenium与PhantomJS 
    Selenium(http://www.seleniumhq.org/)是一个强大的网络数据采集工具,最初是为网站自动化测试而开发的。近几年,它还被广泛用于获取精确的网站快照,因为它们可以直接运行在浏览器上。Selenium可以让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。 
    Selenium自己不带浏览器,它需要与第三方浏览器结合在一起使用。例如,如果你在Firefox上运行Selenium,可以直接看到Firefox窗口被打开,进入网站,然后执行你在代码中设置的动作。虽然这样可以看得更清楚,但是我更喜欢让程序在后台运行,所以我PhantomJS(http://phantomjs.org/download.html)代替真实的浏览器。 
    PhantomJS是一个“无头”(headless)浏览器。它会把网站加载到内存并执行页面上的JavaScript,但不会向用户展示网页的图形界面。将Selenium和PhantomJS结合在一起,就可以运行一个非常强大的网络爬虫了,可以处理cookie、JavaScrip、header,以及任何你需要做的事情。 
    可以从PyPI网站(https://pypi.python.org/simple/selenium/)下载Selenium库,也可以用第三方管理器(像pip)用命令行安装。

    你可以对任意网站(本例用的是http://pythonscraping.com)调用webdriver的get_cookie()方法来查看cookie:

    图片5

    这样就可以获得一个非常典型的Google Analytics的cookie列表:

    图片6

    还可以调用deletecookie()、addcookie()和deleteallcookies()方法来处理cookie。另外,还可以保存cookie以备其他网络爬虫使用。下面的例子演示了如何把这些函数组合在一起:

    图片7

    在这个例子中,第一个webdriver获得了一个网站,打印cookie并把它们保存到变量savedCookies里。第二个webdriver加载同一个网站(技术提示:必须首先加载网站,这样Selenium才能知道cookie属于哪个网站,即使加载网站的行为对我们没任何用处),删除所有的cookie,然后替换成第一个webdriver得到的cookie。当再次加载这个页面时,两组cookie的时间戳、源代码和其他信息应该完全一致。从GoogleAnalytics的角度看,第二个webdriver现在和第一个webdriver完全一样。

    3. 正常的时间访问路径

    有一些防护措施完备的网站可能会阻止你快速地提交表单,或者快速地与网站进行交互。即使没有这些安全措施,用一个比普通人快很多的速度从一个网站下载大量信息也可能让自己被网站封杀。

    因此,虽然多线程程序可能是一个快速加载页面的好办法——在一个线程中处理数据,另一个线程中加载页面——但是这对编写好的爬虫来说是恐怖的策略。还是应该尽量保证一次加载页面加载且数据请求最小化。如果条件允许,尽量为每个页面访问增加一点儿时间间隔,即使你要增加一行代码:

    **

    time.sleep(3)
    (小编:3 + 随机数 是不是更好一些?)
    

    **

    合理控制速度是你不应该破坏的规则。过度消耗别人的服务器资源会让你置身于非法境地,更严重的是这么做可能会把一个小型网站拖垮甚至下线。拖垮网站是不道德的,是彻头彻尾的错误。所以请控制采集速度!

    常见表单反爬虫安全措施解密

    许多像Litmus之类的测试工具已经用了很多年了,现在仍用于区分网络爬虫和使用浏览器的人类访问者,这类手段都取得了不同程度的效果。虽然网络机器人下载一些公开的文章和博文并不是什么大事,但是如果网络机器人在你的网站上创造了几千个账号并开始向所有用户发送垃圾邮件,就是一个大问题了。网络表单,尤其是那些用于账号创建和登录的网站,如果被机器人肆意地滥用,网站的安全和流量费用就会面临严重威胁,因此努力限制网站的接入是最符合许多网站所有者的利益的(至少他们这么认为)。

    这些集中在表单和登录环节上的反机器人安全措施,对网络爬虫来说确实是严重的挑战。

    4. 注意隐含输入字段值

    在HTML表单中,“隐含”字段可以让字段的值对浏览器可见,但是对用户不可见(除非看网页源代码)。随着越来越多的网站开始用cookie存储状态变量来管理用户状态,在找到另一个最佳用途之前,隐含字段主要用于阻止爬虫自动提交表单。

    下图显示的例子就是Facebook登录页面上的隐含字段。虽然表单里只有三个可见字段(username、password和一个确认按钮),但是在源代码里表单会向服务器传送大量的信息。

    图片8

    Facebook登录页面上的隐含字段

    用隐含字段阻止网络数据采集的方式主要有两种。第一种是表单页面上的一个字段可以用服务器生成的随机变量表示。如果提交时这个值不在表单处理页面上,服务器就有理由认为这个提交不是从原始表单页面上提交的,而是由一个网络机器人直接提交到表单处理页面的。绕开这个问题的最佳方法就是,首先采集表单所在页面上生成的随机变量,然后再提交到表单处理页面。

    第二种方式是“蜜罐”(honey pot)。如果表单里包含一个具有普通名称的隐含字段(设置蜜罐圈套),比如“用户名”(username)或“邮箱地址”(email address),设计不太好的网络机器人往往不管这个字段是不是对用户可见,直接填写这个字段并向服务器提交,这样就会中服务器的蜜罐圈套。服务器会把所有隐含字段的真实值(或者与表单提交页面的默认值不同的值)都忽略,而且填写隐含字段的访问用户也可能被网站封杀。

    总之,有时检查表单所在的页面十分必要,看看有没有遗漏或弄错一些服务器预先设定好的隐含字段(蜜罐圈套)。如果你看到一些隐含字段,通常带有较大的随机字符串变量,那么很可能网络服务器会在表单提交的时候检查它们。另外,还有其他一些检查,用来保证这些当前生成的表单变量只被使用一次或是最近生成的(这样可以避免变量被简单地存储到一个程序中反复使用)。

    5. 爬虫通常如何避开蜜罐

    虽然在进行网络数据采集时用CSS属性区分有用信息和无用信息会很容易(比如,通过读取id和class标签获取信息),但这么做有时也会出问题。如果网络表单的一个字段通过CSS设置成对用户不可见,那么可以认为普通用户访问网站的时候不能填写这个字段,因为它没有显示在浏览器上。如果这个字段被填写了,就可能是机器人干的,因此这个提交会失效。

    这种手段不仅可以应用在网站的表单上,还可以应用在链接、图片、文件,以及一些可以被机器人读取,但普通用户在浏览器上却看不到的任何内容上面。访问者如果访问了网站上的一个“隐含”内容,就会触发服务器脚本封杀这个用户的IP地址,把这个用户踢出网站,或者采取其他措施禁止这个用户接入网站。实际上,许多商业模式就是在干这些事情。

    下面的例子所用的网页在http://pythonscraping.com/pages/itsatrap.html。这个页面包含了两个链接,一个通过CSS隐含了,另一个是可见的。另外,页面上还包括两个隐含字段:

    图片9

    这三个元素通过三种不同的方式对用户隐藏:

    • 第一个链接是通过简单的CSS属性设置display:none进行隐藏
    • 电话号码字段name="phone"是一个隐含的输入字段
    • 邮箱地址字段name="email"是将元素向右移动50 000像素(应该会超出电脑显示器的边界)并隐藏滚动条

    因为Selenium可以获取访问页面的内容,所以它可以区分页面上的可见元素与隐含元素。通过is_displayed()可以判断元素在页面上是否可见。

    例如,下面的代码示例就是获取前面那个页面的内容,然后查找隐含链接和隐含输入字段:

    图片10

    Selenium抓取出了每个隐含的链接和字段,结果如下所示:

    图片11

    虽然你不太可能会去访问你找到的那些隐含链接,但是在提交前,记得确认一下那些已经在表单中、准备提交的隐含字段的值(或者让Selenium为你自动提交)。

    使用远程服务器来避免IP封锁

    启用远程平台的人通常有两个目的:对更大计算能力和灵活性的需求,以及对可变IP地址的需求。

    6.使用可变的远程IP地址

    建立网络爬虫的第一原则是:所有信息都可以伪造。你可以用非本人的邮箱发送邮件,通过命令行自动化鼠标的行为,或者通过IE 5.0浏览器耗费网站流量来吓唬网管。

    但是有一件事情是不能作假的,那就是你的IP地址。任何人都可以用这个地址给你写信:“美国华盛顿特区宾夕法尼亚大道西北1600号,总统,邮编20500。”但是,如果这封信是从新墨西哥州的阿尔伯克基市发来的,那么你肯定可以确信给你写信的不是美国总统。

    从技术上说,IP地址是可以通过发送数据包进行伪装的,就是分布式拒绝服务攻击技术(Distributed Denial of Service,DDoS),攻击者不需要关心接收的数据包(这样发送请求的时候就可以使用假IP地址)。但是网络数据采集是一种需要关心服务器响应的行为,所以我们认为IP地址是不能造假的。

    阻止网站被采集的注意力主要集中在识别人类与机器人的行为差异上面。封杀IP地址这种矫枉过正的行为,就好像是农民不靠喷农药给庄稼杀虫,而是直接用火烧彻底解决问题。它是最后一步棋,不过是一种非常有效的方法,只要忽略危险IP地址发来的数据包就可以了。但是,使用这种方法会遇到以下几个问题。

    • IP地址访问列表很难维护。虽然大多数大型网站都会用自己的程序自动管理IP地址访问列表(机器人封杀机器人),但是至少需要人偶尔检查一下列表,或者至少要监控问题的增长。 
      • 因为服务器需要根据I地址访问列表去检查每个准备接收的数据包,所以检查接收数据包时会额外增加一些处理时间。多个IP地址乘以海量的数据包更会使检查时间指数级增长。为了降低处理时间和处理复杂度,管理员通常会对IP地址进行分组管理并制定相应的规则,比如如果这组IP中有一些危险分子就“把这个区间的所有256个地址全部封杀”。于是产生了下一个问题。 
      • 封杀IP地址可能会导致意外后果。例如,当我还在美国麻省欧林工程学院读本科的时候,有个同学写了一个可以在http://digg.com/网站(在Reddit流行之前大家都用Digg)上对热门内容进行投票的软件。这个软件的服务器IP地址被Digg封杀,导致整个网站都不能访问。于是这个同学就把软件移到了另一个服务器上,而Digg自己却失去了许多主要目标用户的访问量。

    虽然有这些缺点,但封杀IP地址依然是一种十分常用的手段,服务器管理员用它来阻止可疑的网络爬虫入侵服务器。

    Tor代理服务器

    洋葱路由(The Onion Router)网络,常用缩写为Tor,是一种IP地址匿名手段。由网络志愿者服务器构建的洋葱路由器网络,通过不同服务器构成多个层(就像洋葱)把客户端包在最里面。数据进入网络之前会被加密,因此任何服务器都不能偷取通信数据。另外,虽然每一个服务器的入站和出站通信都可以被查到,但是要想查出通信的真正起点和终点,必须知道整个通信链路上所有服务器的入站和出站通信细节,而这基本是不可能实现的。

    Tor匿名的局限性

    >

    虽然我们在本文中用Tor的目的是改变IP地址,而不是实现完全匿名,但有必要关注一下Tor匿名方法的能力和不足。 
    虽然Tor网络可以让你访问网站时显示的IP地址是一个不能跟踪到你的IP地址,但是你在网站上留给服务器的任何信息都会暴露你的身份。例如,你登录Gmail账号后再用Google搜索,那些搜索历史就会和你的身份绑定在一起。 
    另外,登录Tor的行为也可能让你的匿名状态处于危险之中。2013年12月,一个哈佛大学本科生想逃避期末考试,就用一个匿名邮箱账号通过Tor网络给学校发了一封炸弹威胁信。结果哈佛大学的IT部门通过日志查到,在炸弹威胁信发来的时候,Tor网络的流量只来自一台机器,而且是一个在校学生注册的。虽然他们不能确定流量的最初源头(只知道是通过Tor发送的),但是作案时间和注册信息证据充分,而且那个时间段内只有一台机器是登录状态,这就有充分理由起诉那个学生了。 
    登录Tor网络不是一个自动的匿名措施,也不能让你进入互联网上任何区域。虽然它是一个实用的工具,但是用它的时候一定要谨慎、清醒,并且遵守道德规范。

    在Python里使用Tor,需要先安装运行Tor,下一节将介绍。Tor服务很容易安装和开启。只要去Tor下载页面下载并安装,打开后连接就可以。不过要注意,当你用Tor的时候网速会变慢。这是因为代理有可能要先在全世界网络上转几次才到目的地!

    PySocks

    PySocks是一个非常简单的Python代理服务器通信模块,它可以和Tor配合使用。你可以从它的网站(https://pypi.python.org/pypi/PySocks)上下载,或者使用任何第三方模块管理器安装。

    这个模块的用法很简单。示例代码如下所示。运行的时候,Tor服务必须运行在9150端口(默认值)上:

    图片12

    网站http://icanhazip.com/会显示客户端连接的网站服务器的IP地址,可以用来测试Tor是否正常运行。当程序执行之后,显示的IP地址就不是你原来的IP了。

    如果你想在Tor里面用Selenium和PhantomJS,不需要PySocks,只要保证Tor在运行,然后增加service_args参数设置代理端口,让Selenium通过端口9150连接网站就可以了:

    图片13

    和之前一样,这个程序打印的IP地址也不是你原来的,而是你通过Tor客户端获得的IP地址。

    从网站主机运行

    如果你拥有个人网站或公司网站,那么你可能已经知道如何使用外部服务器运行你的网络爬虫了。即使是一些相对封闭的网络服务器,没有可用的命令行接入方式,你也可以通过网页界面对程序进行控制。

    如果你的网站部署在Linux服务器上,应该已经运行了Python。如果你用的是Windows服务器,可能就没那么幸运了;你需要仔细检查一下Python有没有安装,或者问问网管可不可以安装。

    大多数小型网络主机都会提供一个软件叫cPanel,提供网站管理和后台服务的基本管理功能和信息。如果你接入了cPanel,就可以设置Python在服务器上运行——进入“Apache Handlers”然后增加一个handler(如还没有的话):

    图片14

    这会告诉服务器所有的Python脚本都将作为一个CGI脚本运行。CGI就是通用网关接口(Common Gateway Interface),是可以在服务器上运行的任何程序,会动态地生成内容并显示在网站上。把Python脚本显式地定义成CGI脚本,就是给服务器权限去执行Python脚本,而不只是在浏览器上显示它们或者让用户下载它们。

    写完Python脚本后上传到服务器,然后把文件权限设置成755,让它可执行。通过浏览器找到程序上传的位置(也可以写一个爬虫来自动做这件事情)就可以执行程序。如果你担心在公共领域执行脚本不安全,可以采取以下两种方法。

    • 把脚本存储在一个隐晦或深层的URL里,确保其他URL链接都不能接入这个脚本,这样可以避免搜索引擎发现它。
    • 用密码保护脚本,或者在执行脚本之前用密码或加密令牌进行确认。

    确实,通过这些原本主要是用来显示网站的服务运行Python脚本有点儿复杂。比如,你可能会发现网络爬虫运行时网站的加载速度变慢了。其实,在整个采集任务完成之前页面都是不会加载的(得等到所有“print”语句的输出内容都显示完)。这可能会消耗几分钟,几小时,甚至永远也完成不了,要看程序的具体情况了。虽然它最终一定能完成任务,但是可能你还想看到实时的结果,这样就需要一台真正的服务器了。

    从云主机运行

    虽然云计算的花费可能是无底洞,但是写这篇文章时,启动一个计算实例最便宜只要每小时1.3美分(亚马逊EC2的micro实例,其他实例会更贵),Google最便宜的计算实例是每小时4.5美分,最少需要用10分钟。考虑计算能力的规模效应,从大公司买一个小型的云计算实例的费用,和自己买一台专业实体机的费用应该差不多——不过用云计算不需要雇人去维护设备。

    设置好计算实例之后,你就有了新IP地址、用户名,以及可以通过SSH进行实例连接的公私密钥了。后面要做的每件事情,都应该和你在实体服务器上干的事情一样了——当然,你不需要再担心硬件维护,也不用运行复杂多余的监控工具了。

    总结:爬虫被封禁常见原因列表

    如果你一直被网站封杀却找不到原因,那么这里有个检查列表,可以帮你诊断一下问题出在哪里。

    • 首先,检查JavaScript。如果你从网络服务器收到的页面是空白的,缺少信息,或其遇到他不符合你预期的情况(或者不是你在浏览器上看到的内容),有可能是因为网站创建页面的JavaScript执行有问题。 
    • 检查正常浏览器提交的参数。如果你准备向网站提交表单或发出POST请求,记得检查一下页面的内容,看看你想提交的每个字段是不是都已经填好,而且格式也正确。用Chrome浏览器的网络面板(快捷键F12打开开发者控制台,然后点击“Network”即可看到)查看发送到网站的POST命令,确认你的每个参数都是正确的。 
    • 是否有合法的Cookie?如果你已经登录网站却不能保持登录状态,或者网站上出现了其他的“登录状态”异常,请检查你的cookie。确认在加载每个页面时cookie都被正确调用,而且你的cookie在每次发起请求时都发送到了网站上。 
    • IP被封禁?如果你在客户端遇到了HTTP错误,尤其是403禁止访问错误,这可能说明网站已经把你的IP当作机器人了,不再接受你的任何请求。你要么等待你的IP地址从网站黑名单里移除,要么就换个IP地址(可以去星巴克上网)。如果你确定自己并没有被封杀,那么再检查下面的内容。 
    • 确认你的爬虫在网站上的速度不是特别快。快速采集是一种恶习,会对网管的服务器造成沉重的负担,还会让你陷入违法境地,也是IP被网站列入黑名单的首要原因。给你的爬虫增加延迟,让它们在夜深人静的时候运行。切记:匆匆忙忙写程序或收集数据都是拙劣项目管理的表现;应该提前做好计划,避免临阵慌乱。 
    • 还有一件必须做的事情:修改你的请求头!有些网站会封杀任何声称自己是爬虫的访问者。如果你不确定请求头的值怎样才算合适,就用你自己浏览器的请求头吧。 
    • 确认你没有点击或访问任何人类用户通常不能点击或接入的信息。 
    • 如果你用了一大堆复杂的手段才接入网站,考虑联系一下网管吧,告诉他们你的目的。试试发邮件到webmaster@<域名>或admin@<域名>,请求网管允许你使用爬虫采集数据。管理员也是人嘛!

    【以上内容整理自《Python 网络数据采集》第10、12、14章】

    图片15

    作者:Ryan Mitchell 译者:陶俊杰,陈小莉 定价:59

    原书4.6星好评,一本书搞定数据采集 涵盖数据抓取、数据挖掘和数据分析 提供详细代码示例,快速解决实际问题

    网络上的数据量越来越大,单靠浏览网页获取信息越来越困难,如何有效地提取并利用信息已成为一个巨大的挑战。 本书采用简洁强大的Python语言,介绍了网络数据采集,并为采集新式网络中的各种数据类型提供了全面的指导。第一部分重点介绍网络数据采集的基本原理:如何用Python从网络服务器请求信息,如何对服务器的响应进行基本处理,以及如何以自动化手段与网站进行交互。第二部分介绍如何用网络爬虫测试网站,自动化处理,以及如何通过更多的方式接入网络。

    本文由图灵教育授权「高可用架构」发表。转载请注明来自高可用架构「ArchNotes」微信公众号。

    展开全文
  • Perl模块的三种安装方法

    千次阅读 2013-02-22 21:55:05
    一般来说,安装perl模块常见有源码、CPAN命令、包管理工具等三种方法,本文以安装Net::Telnet模块为例,简单的介绍一下这三种方法。 第一,直接去CPAN官网下载源码包安装,详细的安装方法等,请参照解压目录下...

    一般来说,安装perl模块常见有源码、CPAN命令、包管理工具等三种方法,本文以安装Net::Telnet模块为例,简单的介绍一下这三种方法。

    第一种,直接去CPAN官网下载源码包安装,详细的安装方法等,请参照解压目录下的README或者INSTALL文件:

    ?
    1
    2
    3
    4
    5
    6
    [root@ test ~] # wget http://search.cpan.org/CPAN/authors/id/J/JR/JROGERS/Net-Telnet-3.03.tar.gz
    [root@ test ~] # tar -xzvf Net-Telnet-3.03.tar.gz
    [root@ test ~] # cd Net-Telnet-3.03
    [root@ test Net-Telnet-3.03] # perl Makefile.PL
    [root@ test Net-Telnet-3.03] # make && make test
    [root@ test Net-Telnet-3.03] # make install


    在有的模块的安装过程中,可能会询问一些设置情况,根据你的实际情况选择。
    注意,如果源码包安装过程中出现了依赖别的模块的情况,需要先安装依赖的模块,所以源码安装有时候比较麻烦。

    第二种,用cpan命令在线安装,安装的时候模块名一定要正确:
    1.首先安装一些cpan需要的一些小工具:

    ?
    1
    [root@ test ~] # yum -y install unzip links ftp make wget gpg

    2.然后开始用cpan命令安装,第一次用cpan命令会有很多要设置的,为了简单,除了下面列出来的,其他的我都采用默认,直接回车(更推荐你仔细阅读每一步的提示信息,根据实际情况而进行相应的选择):

    ?
    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
    [root@ test ~] # cpan install Net::Telnet
    ......前略......
    First, pick a nearby continent and country (you can pick several of
    each, separated by spaces, or none if you just want to keep your
    existing selections). Then, you will be presented with a list of URLs
    of CPAN mirrors in the countries you selected, along with previously
    selected URLs. Select some of those URLs, or just keep the old list.
    Finally, you will be prompted for any extra URLs -- file :, ftp :, or
    http: -- that host a CPAN mirror.
     
    (1) Africa
    (2) Asia
    (3) Central America
    (4) Europe
    (5) North America
    (6) Oceania
    (7) South America
    Select your continent (or several nearby continents) [] 2 <----选择你所在的大区域(洲),然后回车
    Sorry! since you don't have any existing picks, you must make a
    geographic selection.
     
    (1) Bangladesh
    (2) China
    (3) Hong Kong
    (4) India
    (5) Indonesia
    (6) Israel
    (7) Japan
    (8) Kazakhstan
    (9) Pakistan
    (10) Republic of Korea
    (11) Russia
    (12) Saudi Arabia
    (13) Singapore
    (14) Taiwan
    (15) Thailand
    (16) Turkey
    Select your country (or several nearby countries) [] 7 <----选择你所在的国家,然后回车
    Sorry! since you don't have any existing picks, you must make a
    geographic selection.
     
    (1) ftp : //ftp .dti.ad.jp /pub/lang/CPAN/
    (2) ftp : //ftp .jaist.ac.jp /pub/CPAN/
    (3) ftp : //ftp .kddilabs.jp /CPAN/
    (4) ftp : //ftp .nara.wide.ad.jp /pub/CPAN/
    (5) ftp : //ftp .riken.jp /lang/CPAN/
    (6) ftp : //ftp .ring.gr.jp /pub/lang/perl/CPAN/
    (7) ftp : //ftp .u-aizu.ac.jp /pub/CPAN/
    (8) ftp : //ftp .yz.yamagata-u.ac.jp /pub/lang/cpan/
    Select as many URLs as you like (by number),
    put them on one line, separated by blanks, e.g. '1 4 5' [] 2 4 5 <----选择你所在的模块下载 ftp 站点,然后回车
    ......前略......

    初次运行CPAN时需要做一些设置,如果您的机器是直接与因特网相联(拨号上网、专线,etc.),那么一路回车就行了,只需要在最后一步选一个离您最近的 CPAN 镜像站点。例如我选的是位于国内的ftp://www.perl87.cn/CPAN/ 。否则,如果您的机器位于防火墙之后,还需要设置ftp代理或http代理。下面是常用 ppm 命令。

      获得帮助
      cpan>help

      列出CPAN上所有模块的列表
      cpan>m

      安装模块,自动完成Net::Server模块从下载到安装的全过程。
      cpan>install Net::Server

      退出
      cpan>quit

      C、使用CPAN模块自动安装方法二:

      cpan -i 模块名

      例如:cpan -i Net::Server

      几个主要的CPAN站点有:

      国内:

      最新更新请查阅 http://cpan.org/SITES.html

      http://www.perl87.cn/CPAN/  网页镜像
      ftp://www.perl87.cn/CPAN/   模块镜像
      
      国外:

      http://www.cpan.org/


    第三种,最简单的方法,使用yum安装:

    ?
    1
    [root@ test ~] # yum -y install perl-Net-Telnet

    但是只有yum源里有的perl模块,才可以通过这种方式安装,所以并不适合所有perl模块。为了让你的yum软件仓库里能有更多常用的软件,建议你除了官方的yum源外,再追加配置EPEL和rpmforge等常见且可以信赖的yum源。

    展开全文
  • 灰度发布常见一般有三种方式

    千次阅读 2018-06-01 11:01:07
    使用Nginx实现灰度发布灰度发布是指在黑与白之间,能够平滑过渡的一发布方式。AB test就是一灰度发布方式,让一部分用户继续用A,一部分...灰度发布常见一般有三种方式:Nginx+LUA方式根据Cookie实现灰度发布根...

    使用Nginx实现灰度发布

     

    灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。

    灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。

    灰度发布常见一般有三种方式:

    • Nginx+LUA方式

    • 根据Cookie实现灰度发布

    • 根据来路IP实现灰度发布

    本文主要将讲解根据Cookie和来路IP这两种方式实现简单的灰度发布,Nginx+LUA这种方式涉及内容太多就不再本文展开了。

    A/B测试流程


     




    Nginx根据Cookie实现灰度发布
     

    根据Cookie查询Cookie键为version的值,如果该Cookie值为V1则转发到hilinux_01,为V2则转发到hilinux_02。Cookie值都不匹配的情况下默认走hilinux_01所对应的服务器。

    两台服务器分别定义为:

    hilinux_01  192.168.1.100:8080
    hilinux_02  192.168.1.200:8080
    • 用if指令实现

    upstream hilinux_01 {
        server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
    }
    
    upstream hilinux_02 {
        server 192.168.1.200:8080 max_fails=1 fail_timeout=60;
    }
    
    upstream default {
        server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
    }
    
    server {
      listen 80;
      server_name  www.hi-linux.com;
      access_log  logs/www.hi-linux.com.log  main;
    
      #match cookie
      set $group "default";
        if ($http_cookie ~* "version=V1"){
            set $group hilinux_01;
        }
    
        if ($http_cookie ~* "version=V2"){
            set $group hilinux_02;
        }
    
      location / {                       
        proxy_pass http://$group;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        index  index.html index.htm;
      }
     }
    • 用map指令实现

    在Nginx里面配置一个映射,$COOKIE_version可以解析出Cookie里面的version字段$group是一个变量,{}里面是映射规则。

    如果一个version为V1的用户来访问,$group就等于hilinux_01。在server里面使用就会代理到http://hilinux_01上。version为V2的用户来访问,$group就等于hilinux_02。在server里面使用就会代理到http://hilinux_02上。Cookie值都不匹配的情况下默认走hilinux_01所对应的服务器。

    upstream hilinux_01 {
        server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
    }
    
    upstream hilinux_02 {
        server 192.168.1.200:8080 max_fails=1 fail_timeout=60;
    }
    
    upstream default {
        server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
    }
    
    map $COOKIE_version $group {
    ~*V1$ hilinux_01;
    ~*V2$ hilinux_02;
    default default;
    }
    
    server {
      listen 80;
      server_name  www.hi-linux.com;
      access_log  logs/www.hi-linux.com.log  main;
    
      location / {                       
        proxy_pass http://$group;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        index  index.html index.htm;
      }
     }

    Nginx根据来路IP实现灰度发布

    如果是内部IP,则反向代理到hilinux_02(预发布环境);如果不是则反向代理到hilinux_01(生产环境)。

    upstream hilinux_01 {
        server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
    }
    
    upstream hilinux_02 {
        server 192.168.1.200:8080 max_fails=1 fail_timeout=60;
    }
    
    upstream default {
        server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
    }
    
    server {
      listen 80;
      server_name  www.hi-linux.com;
      access_log  logs/www.hi-linux.com.log  main;
    
      set $group default;
      if ($remote_addr ~ "211.118.119.11") {
          set $group hilinux_02;
      }
    
    location / {                       
        proxy_pass http://$group;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        index  index.html index.htm;
      }
    }

    如果你只有单台服务器,可以根据不同的IP设置不同的网站根目录来达到相同的目的。

    server {
      listen 80;
      server_name  www.hi-linux.com;
      access_log  logs/www.hi-linux.com.log  main;
    
      set $rootdir "/var/www/html";
        if ($remote_addr ~ "211.118.119.11") {
           set $rootdir "/var/www/test";
        }
    
        location / {
          root $rootdir;
        }
    }

    到此最基本的实现灰度发布方法就讲解完了,如果要做更细粒度灰度发布可参考ABTestingGateway项目。

    ABTestingGateway是新浪开源的一个动态路由系统。ABTestingGateway是一个可以动态设置分流策略的灰度发布系统,工作在7层,基于nginx和ngx-lua开发,使用redis作为分流策略数据库,可以实现动态调度功能。

    ABTestingGateway:https://github.com/CNSRE/ABTestingGateway

    参考文档

    http://www.google.com
    http://www.jianshu.com/p/88f206f48278
    http://blog.chinaunix.net/uid-531464-id-4140473.html


    点关注,不迷路

    文章每周持续更新,可以微信搜索「 十分钟学编程 」第一时间阅读和催更,如果这个文章写得还不错,觉得有点东西的话 ~求点赞👍 求关注❤️ 求分享❤️ 
    各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

    展开全文
  • 常见的几最优化方法

    千次阅读 2016-12-03 13:36:30
    阅读目录 1. 梯度下降法(Gradient Descent) 2. 牛顿法和拟牛顿法(Newton's method & Quasi-Newton Methods) 3. 共轭梯度法(Conjugate Gradient) 4. 启发式优化方法  我们...
  • 常见分类方法

    万次阅读 2016-12-30 10:29:19
    本文只对几种常见的分类方法做简单介绍,详细的讲解和算法网上有很多资源,文中会给出推荐链接。 Content 1. 决策树分类(链接:http://blog.csdn.net/github_36299736/article/details/52749999) 2. 基于规则...
  • 种常见的ps怎么模糊背景的方法

    万次阅读 2017-03-29 19:33:51
    文章总结四种常见的ps怎么模糊背景的方法,通过历史记录画笔、蒙版、钢笔勾勒选区、橡皮擦工具结合模糊命令来模糊背景的思路和操作步骤。  做淘宝店的掌柜们,经常使用模糊背景技术手段来凸显衣服外观。ps怎么模糊...
  • 爬虫突破封禁的6种常见方法 在互联网上进行自动数据采集(抓取)这件事和互联网存在的时间差不多一样长。今天大众好像更倾向于用“网络数据采集”,有时会把网络数据采集程序称为网络机器人(bots)。最常用的方法...
  • excel隔行填充颜色的三种方法

    千次阅读 2016-05-10 15:50:18
     excel隔行填充颜色的方法也很多,本文总结几种常见方法。  excel隔行填充颜色方法一:  添加一辅助列,如A列,分别输入1、2、1、2这样的数字,然后启用筛选,再选中其中的奇数或者偶数行填充颜色。动画演示: ...
  • 利用Python实现中文文本关键词抽取的三种方法 文本关键词抽取,是对文本信息进行高度凝练的一有效手段,通过3-5个词语准确概括文本的主题,帮助读者快速理解文本信息。目前,用于文本关键词提取的主要方法有四...
  • 常见bug调试方法

    千次阅读 2016-06-03 09:45:01
    常见bug调试方法 此处为大量Copy!不喜请喷! The software doesn't do something that the product specification says it should do. The software does something that the product specification ...
  • 点云采样的三种方法

    千次阅读 2020-04-18 18:00:00
    原文链接:https://zhuanlan.zhihu.com/p/86044055 点云采样分类 点云采样的方法有很多常见的有均匀采样,几何采样,随机采样,格点采样等。下面介绍一些常见的采样方法。 格点采样 格点采样,就是把维空间用...
  • 需求挖掘的十三种方法

    万次阅读 2018-12-05 19:01:28
    举个常见的例子,很多使用短信验证码进行注册的产品都会做了防止被刷短信的功能,因为短信验证码也是一成本,如果没有做相关的限制,很容易被使用相关程序进行刷短信,消耗公司的短信数量,从而造成一定的经济损失...
  • 使用python读写CSV文件的三种方法

    万次阅读 2018-02-08 19:56:49
    Python读写csv文件 觉得有用...tf.train.start_queue_runners(coord=coord) # Your code here~ coord.request_stop() coord.join(threads) ''' 还有其他使用python读取文件的各种方法,这里介绍三种,不定期进行补充。
  • Java 重写Object类的常见方法

    千次阅读 2013-09-19 23:18:23
    当我们写一个类的时候,都会对Java.lang.Object类的一些重要方法进行重写,这些方法包含:hashCode(),toString(),equals(),finalize(),clone(),wait(),notify()/notifyAll() 这八个方法。 一 Equals()方法: 1....
  • 查询数据时给列起别名的三种方法

    千次阅读 2017-09-18 10:59:26
    如下表:   语法 描述 列 AS 别名 最容易阅读的技术,不过在SQL的纯化论者中间不流行 列 别名 最通常的技术。多数自动生成的代码是以...这种技术在Transact-SQL中不常见
  • 常见的几编码方式

    万次阅读 多人点赞 2018-05-18 15:29:36
    字符常见的几编码方式2013年12月05日 11:19:32阅读数:45159 无论在是在编辑文本文件的时候,还是在制作网页的时候,总会遇到文本编码方式的问题。如果处理不当,就会出现乱码的问题。因此,有必要对文本的编码...
  • 谈谈常见的迭代优化方法

    万次阅读 2016-02-02 09:54:22
    本文主要介绍三种方法,分别是梯度下降,共轭梯度法(Conjugate Gradient Method)和近似牛顿法(Quasi-Newton)。具体在stanford-nlp中都有对应的实现,由于前两种方法都涉及到梯度的概念,我们首先从介绍梯度开始。 ...
  • Unity3d光影烘焙常见缺陷的解决方法【2020】

    万次阅读 多人点赞 2019-04-11 04:02:40
    由于没有经验,模型上常常出现一些怪异的"黑斑"、“撕裂”、”硬边”、“漏光”现象(如下图所示),反复调试,问题依然得不到解决,搞得精疲力尽,甚至产生了放弃的念头,本文将针对Unity3d烘焙时常见的几“黑斑...
  • 浅谈常见的七加密算法及实现

    万次阅读 多人点赞 2018-09-10 18:38:26
    前言 数字签名、信息加密 是前后端开发都...这里简单的给大家介绍几种常见的签名加密算法和一些典型场景下的应用。 正文 1. 数字签名 数字签名,简单来说就是通过提供 可鉴别 的 数字信息 验证 自身身份 ...
  • 文本归纳了机器阅读理解任务中文章和问题的常见神经网络表示方法
  • matlab中常见txt文件读入的实用方法

    万次阅读 2018-11-14 07:55:23
    matlab中常见txt文件读入的实用方法
  • 四大会计师事务所之一的普华永道(PwC)近日发布了多份解读机器学习基础的图表,其中介绍了机器学习的基本概念、原理、历史、未来趋势和一些常见的算法
  • 【10年运维整理】服务器常见故障及其解决方法

    万次阅读 多人点赞 2018-05-22 16:44:55
    近日小编将针对一些常见的服务器故障现象和解决方法跟管理者分享一下,以便更好的更快的进行故障处理和排查。01服务器常见故障及现象 有关服务器无法启动的主要原因 : ①市电或电源线故障(断电或接触...
  • 种常见的回归分析

    万次阅读 多人点赞 2020-09-26 10:09:32
    回归分析是一预测性的建模技术,它研究的是因变量(目标)和自变量(预测器)之间的关系。这种技术通常用于预测分析,时间序列模型以及发现变量之间的因果关系。例如,司机的鲁莽驾驶与道路交通 事 故数量之间的...
  • XP 下如何查看linux : 如果你有一个Windows/Linux双重启动的系统,你可能会知道这个问题:你可以在Linux里访问...本指南展示了三种从Windows里访问Linux分区(ext2或ext3文件系统)的方法:Explore2fs,
  • 种常见的 CSS 布局

    万次阅读 多人点赞 2018-11-14 20:30:00
    (给前端大全加星标,提升前端技能)作者:浪里行舟 (本文来自作者投稿,简介见末尾)本文概要本文将介绍如下几种常见的布局:单列布局两列自适应布局圣飞布局和双飞翼布局伪等高布...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 218,565
精华内容 87,426
关键字:

常见的三种阅读方法