精华内容
下载资源
问答
  • 测试常见种方法

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

    测试用例常见的设计方法有:等价类划分法、边界值分析法、错误推测法、判定表法、正交实验法。

    一、等价类划分法

    顾名思义,顾名思义,等价类划分,就是将测试的范围划分成几个互不相交的子集,他们的并集是全集,从每个子集选出若干个有代表性的值作为测试用例。
      例如,我们要测试一个用户名是否合法,用户名的定义为: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元以下,订单设“正常”标志。
      绘制的决策表如下:
      这里写图片描述
      此表分两大行,两大列,分别用不同的颜色区别。
      浅蓝:列出所有条件(或称为输入)
      浅灰:列出所有结果(或称为输出,行动或决策)
      浅黄:穷举所有条件的组合
      浅绿:根据每一列的条件,判断出结果

    五.正交实验法

    用语言描述正交实验法会很抽象难懂,简单说,就是在各因素互相独立的情况下,设计出一种特殊的表格,找出能以少数替代全面的测试用例。
      其中,上面所说的特殊表格就是正交表,是按照一定规则生成的表。
      虽然说是特殊的表格,实际表现形式跟一般的表格没有什么区别,正交表的主要特征是,“均匀分布,整齐划一”,正是因为“均匀”的,所以才能以少数代替全部。

    展开全文
  • 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」微信公众号。

    展开全文
  • 第一:测试用例格式包括十大特点 用例编号 测试项 测试标题 用例属性 ...3,边界值方法应用步骤 第四:判定表 1,定义 2,重要概念 3,判定表应用步骤 4,案例加以说明判断表 第五,因.

    一:测试用例格式包括十大特点

    1. 用例编号
    2. 测试项
    3. 测试标题
    4. 用例属性
    5. 重要级别:高中低
    6. 预置条件
    7. 测试输入
    8. 操作步骤
    9. 预期结果
    10. 实际结果

    二:等价类

    等价类定义


    等价类划分


    等价类划分规则


    进行等价类用例设计


    案例加以说明

    三:边界值


    边界值的三点


    边界值应用场景


    边界值方法应用步骤


    四:判定表


    定义


    重要概念


    判定表应用步骤


    案例加以说明判断表


    五,因果图


    输入与输入的关系


    输入与输出的关系


    案例加以说明

     

    六,正交试验


    因子和水平的定义


    特点


    设计流程


    注意点


    案例加以说明

     


    七,状态迁移


    定义


    状态


    方法流程

    案例加以说明

    八,流程分析法(场景设计法)


    设计三个场景


    使用方法


    注意点


    案例加以说明

    展开全文
  • 测试用例的几种常见设计方法

    千次阅读 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

    展开全文
  • Java 枚举(enum) 详解7种常见的用法

    万次阅读 多人点赞 2016-08-11 11:14:45
    JDK1.5引入了新的类型——枚举。在Java中它虽然算个“小”功能,却给我的开发带来了“大”方便。...现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 Java代码 publ...
  • 11种常见的多变量分析方法

    万次阅读 2018-10-09 09:31:06
    在社会科学研究中,主要的多变量分析方法包括多变量方差分析(Multivariate analysis of variance,MANOVA)、主成分分析(Principal component analysis)、因子分析(Factor analysis)、典型相关(Canonical ...
  • C++ Map常见用法说明

    万次阅读 多人点赞 2016-11-10 15:07:36
    C++中map提供的是一键值对容器,里面的数据都是成对出现的,如下图:每一对中的第一个值称之为关键字(key),每个关键字只能在map中出现一次;第二个称之为该关键字的对应值。一. 声明//头文件 #include<map>map, ...
  • 数据挖掘是一决策支持过程,它通过高度自动化地分析企业的数据,做出归纳性的推理,从中挖掘出潜在的模式,帮助决策者调整市场策略,减少风险,做出正确的决策。利用数据挖掘进行数据分析常用的方法主要有分类、...
  • Linux中常见软件安装方法常见管理方法

    千次阅读 多人点赞 2019-03-16 20:55:57
    4.进入解压出来的目录,查看README或者INSTALL文件,这两个文件中会告诉安装 方法 5.配置 ./configure 6.编译 make 7.安装 make install 8.测试安装是否成功 注意: 1.如何将windows中的包复制到Linux中呢? ...
  • 在java里面文件上传的方式很多,最简单的依然是FileInputStream、FileOutputStream了,在这里我列举3种常见的文件上传方法代码,并比较他们的上传速度(由于代码是在本地测试,所以忽略网速的影响)还是老规矩,大神...
  • iframe标记常见的几使用方法

    千次阅读 2009-09-30 09:41:00
    这是早期不使用Ajax来异步发送请求的一替代方法,通过在页面上设置不可见的iframe元素,并将其src属性指向需要发送请求的页面地址来发送请求,同域下可以再对返回的页面进行DOM解析来获取数据。另外一个好处在于...
  • 文件的读写 几种常见方法

    千次阅读 2017-05-11 15:24:12
    3、几种类的说明  FileReader中的方法都是从InputStreamReader中继承过来的。  所以FileReader与InputStreamReader返回的都是字符char型。其他的都是字节byte型,如果想要插入行需要加一层...
  • python3爬取网络图片的两种常见方法

    千次阅读 2018-03-10 11:51:52
    以前在python2.7上用爬虫爬取一些文本,但是没...这两天在想爬取一些图片,就在python3上用两方来爬取网络图片。代码如下: # -*- coding:utf-8 -*- import urllib import urllib.request import re def getH...
  • 最上面有详细的说明) * chrome: * System.setProperty("webdriver.chrome.driver", "chromedriver.exe的位置"); * firefox: * System.setProperty("webdriver.gecko.driver", &#...
  • arm-linux笔记3:arm-linux PC文件传输方法总结(4常见方法) 1使用串口终端传输文件 2使用ftp传输文件 3使用nfs传输文件 4使用u盘拷贝 串口的优点是方法简单,不需要过多的配置,不需要联接网络,但是发送...
  • 常见的数据校验方法

    万次阅读 2016-11-05 23:12:38
    常见的数据校验方法   1. 校验是什么 校验,是为保护数据的完整性,用一指定的算法对原始数据计算出的一个校验值。当接收方用同样的算法再算一次校验值,如果两次校验值一样,表示数据完整。   2. 最简单的校验...
  • eclipse常见错误解决方法

    千次阅读 2017-11-23 23:12:49
    eclipse常见错误解决方法
  • 接口请求的六种常见方式

    千次阅读 2020-11-26 18:35:11
    接口请求的六种常见方式: 1、Get 向特定资源发出请求(请求指定页面信息,并返回实体主体) 2、Post 向指定资源提交数据进行处理请求(提交表单、上传文件),又可能导致新的资源的建立或原有资源的修改 3、Put 向...
  • 常见降低圈复杂度方法

    千次阅读 2020-04-27 21:25:32
    圈复杂度计算方式 圈复杂度(CC) = 判断条件个数 + 1 其中1代表函数本身...对if,if~else, if~else if ,for, switch , while语句进行简要说明: If中有几个判断条件算几个,else算一个 else if 有几个判断条件算...
  • Nacos 常见问题及解决方法

    万次阅读 2019-11-05 15:24:34
    在与社区的交流中,我们发现有一些问题出现的频率比较高,为了能够让用户更快的解决问题,我们总结了这篇常见问题及解决方法,这篇文章后续也会合并到 Nacos 官网的 FAQ 里。 如何依赖最新的 Nacos 客户端? 很多...
  • 常见漏洞验证测试方法

    千次阅读 2020-01-17 11:27:43
    收集整理了一些常见漏洞的验证测试方式,以及参考链接。有补充再加 序号 漏洞名称 验证方式 1 跨站脚本 1、 GET方式跨站脚本:1) 在输入的参数后逐条添加以下语句,以第一条为例,输入...
  • rsync常见报错及解决方法

    万次阅读 2016-11-15 22:15:10
    rsync使用时的常见问题: 错误1: rsync: read error: Connection reset by peer (104) rsync error: error in rsync protocol data stream (code 12) at io.c(794) [receiver=3.0.2] 解决:很大可能是服务器端...
  • 测试方法:白盒测试(因为要测源码) 测试内容:模块接口测试(测试模块里面的参数传递是否正确)、局部数据结构测试(测试变量的作用域范围)、路径测试(if-else 判断必须覆盖所有分支)、错误处理
  • // 6. Hide scrollbars: $("#mydiv").getNiceScroll().hide(); // 7. Check for scrollbars resize (when content or position have changed): $("#mydiv").getNiceScroll().resize(); // 8. Scrolling to a ...
  • 常见功能测试设计方法

    万次阅读 2018-09-20 09:47:00
    1)等价类划分  等价类是指某个输入域的子集合.在该子集合中, 各个输入数据对于揭露程序中的错误都是等效的.并合理地假定: 测试某...等价类划分可有两不同的情况: 有效等价类和无效等价类. 题目: 有一报表...
  • 常见预测方法及其特点

    万次阅读 2015-05-07 14:06:26
    常见预测方法及其特点   方法名 适用时间 方法说明 需要数据 定性方法 专家会议法 长期预测 组织专家以会议的形式进行预测,综合专家意见得出结论 市场历史发展资料信息 德尔菲法 ...
  • MACD常见6种战法擒大牛

    千次阅读 2020-06-29 13:42:53
    MACD(Moving Average Convergence and ...第1节 MACD概述以及常见6种战法 MACD的优点在于它的稳定性优于常规的均线系统,避免逆向操作的危险。常规的均线系统诸如5日、10日、20日这样普通的设置,也经常被股民运...
  • 一些常见的特征选择方法

    千次阅读 2016-09-20 18:10:46
    通常有特征抽取和特征选择两种方法。这里分别介绍一下。特征抽取与PCA特征抽取中最常见的当属PCA了。主要思想对于特征之间存在正交关系,数据满足高斯分布或指数分布的数据,作线性变换,使用方差、协方差去噪,生成...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 484,735
精华内容 193,894
关键字:

常见的六种说明方法