腾讯测试开发面试失败总结

昨天接到了秋招以来的第一场面试,面试了腾讯的测试开发岗,自己感觉不是特别好,写此片博客只为总结下此次面试。

以前自己总觉得自己还不错,秋招应该可以找到一份工作,但此次面试对我犹如当头一棒!人不可骄傲,学习是一件终身去完成的事,不要以为自己学会了,就可以做自己可以做的事。记得有个故事:两个人在森林中遇到了一只老虎,那么老虎先吃谁呢?当然是吃跑的慢的。老虎就像这个社会的淘汰法则,你只要比别人慢,或者用程序员的来讲,你的技术只要比别人菜,你就有可能被吃。搞技术开发的,当问题来临时,解决不了,没有什么理由,菜就是原罪。

一、当下都有哪些爬虫技术、与反爬虫手段?

爬虫技术:

1、python自带的urlib2和urlib或者第三方模块request

此种方案适合简单的页面爬虫,比如爬取博客的文章等等,相对于其他的一些高级爬虫来讲,它没有异常处理与请求速度控制等,需要我们取用额外的代码去控制。

2、scrapy框架 

相比urlib等基础爬虫,请求调度、异常处理都已经进行了基础的封装、而且有第三方的csrapy-redis模块支持分布式、使得程序员将重点放在了页面分析与规则编写上面。

3、python selenium和PhantomJS

具有很好的反爬虫技术、可以通过技术手段去模拟出和人非常类似的操作行为,缺点就是速度比较慢、但是爬虫一帮来讲对于速度的要请求不是很高、更注重的是数据的稳定、这种方式对于抓取反爬虫机制做的好的大型网站比较适用

反爬虫技术:

在开始前我先推荐一篇由携程酒店研发部经理写的一篇博文,看完之后对反爬虫有了基本的认识。

1、后台对方问进行统计、如果单个IP访问超过阈值,予以封锁

缺点:容易误伤普通用户并且因为IP的价格较低,使用者完可以买上几十万个IP来爬取信息,因此封锁IP带来的收益与损失不成正比

2、后台对访问进行统计,如果单个的userAgent访问超过了阈值,予以封锁。

缺点:对于未未进行userAgent随机生成的爬虫效果比较好,但是当爬虫去随机生成多个合法的userAgent时,才方法并不成功,对而且杀伤力过大、误伤严重。

3、后台对访问进行统计,如果单个session访问超过阈值,予以封锁。

缺点:session被封锁了,但是session不值钱,重新申请就可以了。

4、通过js脚本去防止防止爬虫:

原因:爬虫的本质来讲只是一段程序、它不会像人一样去应对各种变化,比如验证码、滑动解锁之类的操作。因此网站可以在被用户拿到数据前,强制让用户登录。甚至可以通过js代码去生成一大段的随机数字,然后要求浏览器通过js的运算的数这一段数字的和,在返回给服务器等等。

5、通过君子协议(robots.txt)去限制爬虫

要说最好的爬虫网站莫属google了,但是所有的搜索引擎全部都遵循着一个协议:robots.txt

robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉网络搜索引擎的漫游器
(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。因为一
些系统中的URL是大小写敏感的,所以robots.txt的文件名应统一为小写。robots.txt应放置于网站的根目录
下。如果想单独定义搜索引擎的漫游器访问子目录时的行为,那么可以将自定的设置合并到根目录robots.txt,
或者使用robots元数据(Metadata,又称元数据)。比如我们需要看百度的robots.txt那么我们需要在浏览器输
入www.baidu.com/robots.txt/
robots.txt协议并不是一个规范,而只是约定俗成的,所以并不能保证网站的隐私。注意robots.txt是用字符串
比较来确定是否获取URL,所以目录末尾有与没有斜杠“/”表示的是不同的URL。robots.txt允许使用类
似"Disallow: *.gif"这样的通配符

所以当我们需要爬虫时,我们可以通过遵守这个协议的内容“合法”获得自己的信息。

非常喜欢上面推荐的博客里面的一句话,其实爬虫反爬虫是个游戏,RMB玩家才最牛逼。

没有坚固不可破的盾,也没有刺穿一切的矛,在爬虫与反爬虫里面,成本与性价比才是关键。

二、如何使用python去检测一个服务器发生了内存泄漏?

内存泄露表现为:内存回收低点为不断增高(以每次内存回收的最低点连成一条直线,那么它是一条上升的线):内存的回收频率越来越高,内存的占用率越来越高。

三、python的内存模型?

在Python中一切皆对象,Python的内存模型,也可以说是Python的对象的内存模型。

python因为与C/C++不一样,我们在C/C++中,当实例化一个对象后,在实例化的对象的作用域之外或不再使用该实例化对象时,需要们手动将对象删除,将创建对象申请的内存进行释放。但是在python中我们因为存在垃圾回收机制,所以不需要我们手动去删除一个对象。python中的垃圾是指当对象有一个变量名与他进行连接并引用,但是自某一个该对象的变量名去引用其他对象,该对象没有任何的变量名指向它,那么这个对象就会成为垃圾。

python的垃圾回收机制有三种:引用计数回收器(Reference-count Based Collecter) 、标记清除回收器(Mark-and-sweep Collecter)、世代回收器(Generation Collecter)

一个Python对象即PyObject,必须包含ob_refcnt和ob_type,ob_refcnt是这个对象的引用计数,而ob_type则是指向了一个_typeobject的结构体指针,它是Python内部的一种特殊结构,它是用来指定一个对象类型的类型对象即PyTypeObject。在类型对象中有定义了大量的函数指针,这些函数指针最终都会指向某个函数,或者Null,这些函数指针可以视为类型对象中所定义的操作,而这些操作直接决定者一个对象在运行时所表现的行为。在python中,对象的核心其实非常简单,一个是引用计数,一个是类型信息。当一个pyobject的引用计数为零时,也就是它要被垃圾回收机制回收的时刻。

引用博文

四、详细说明下python的堆和栈

推荐博文:什么是堆和栈,他们在哪?

基本概念:

栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIFO)的特征

堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:(1)二叉树中所有的父节点的值都不大于/不小于其子节点的值(2)根节点的值必定是所有节点中最小/最大的。

将父节点的值不大于子节点且根节点的之最小的称为最小堆,反之称为最大堆。对是一种高级数据结构,在python中有相应的模块deapq

(1)每当线程在创建的时候,操作系统为每一个系统级的线程分配栈,并且每一个线程智能拥有一个栈;当操作系统通过调用语言的运行时(runtime)去为应用程序分配堆。

(2)栈附属于线程,因此当线程结束时栈被返回回收。对通常通过运行是在应用程序启动时被分配,当应用程序(进程)退出时被回收

(3)当线程被创建的时候,设置栈的大小。在应用程序启动的时候,设置堆的大小,但是可以在需要的时候去拓展它(分配器向操作系统申请更多的内存)

(4)栈比堆要快,因为它的存取模式使它可以轻松的释放和重新分配内存,然而堆在分配和释放的时候有更多的复杂的bookkeeping参与,另外在栈上的每个字节被频繁的复用也就意味着他可能映射到处理器缓存中,所以很快

(5)对于堆相对于栈的先进后出模型栈数存储没有固定的顺序位置,你可以在任何顺序插入和删除,因为堆上的内存申请位置是无序的,释放也是无序的。

五、python线程、进程、协程之间的区别

概念:

进程:

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动。进程是系统进行资源分配与调度的一个独立单位。每个进程都有自己独立的内存空间,由于进程比较重量‘占据独立的内存,所以上下文进程的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但是相对也比较安全。

线程:

线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中最小的单元,由于线程ID、程序计数器、寄存器集合、和堆栈共同组成。它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。

协程:

协程,又被称为微线程,一个线程可以拥有多个协程,协程拥有自己的寄存器上下文和栈。协程在执行过程中,可以进行中断,然后转区执行别的子程序,在适当的时候在返回来接着执行,注意:这个过程是在一个子程序中中断,去执行其他的子程序,不是函数调用,有点类似于CPU的中断。

进程与线程比较:

(1)线程是属于进程的,线程运行在进程空进内,同一进程所产生的线程共享同一内存空间。

(2)当进程退出时该进程所产生线程都会被强制退出并清除

(3)线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)

线程与协程比较:

(1)一个线程可以拥有多个协程。

(2)线程进程都是同步机制,而进程是异步。

(3)对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。所以协程的切换比线程方便。

(4)因为协程就是在一个线程内部,对于内存的操作不会出现冲突,向进程与线程那样对共享资源加锁,只需要程序在运行时判断状态即可。

 

 

 

很喜欢玩LOL,以前电子经济圈流传着:电子竞技菜是原罪。现在在找工作时也一样,菜是原罪!!!!

猜你喜欢

转载自blog.csdn.net/m0_37717595/article/details/81407963
今日推荐