4000857126

Python爬虫面试题总结

来源:上海容大教育IT培训机构 发布时间:2018/8/22 14:49:11

今天,容大教育的小编来给大家总结一下Python爬虫的面试技巧,希望给参加Python培训的同学一点儿帮助。


1、对__if__name__=='main'的理解陈述


__name__是当前模块名,当模块被直接运行时模块名为_main_,也就是当前的模块,当模块被导入时,模块名就不是__main__,即代码将不会执行。


2、python是如何进行内存管理的?


a、对象的引用计数机制


python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。


b、垃圾回收


1>当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。


2>当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。


c、内存池机制


Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。


1>Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。


2>Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。


3>对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。


3、请写出一段Python代码实现删除一个list里面的重复元素


#1.使用set函数


list=[1,3,4,5,51,2,3]


set(list)


#2.使用字典函数,


>>>a=[1,2,4,2,4,5,6,5,7,8,9,0]


>>>b={}


>>>b=b.fromkeys(a)


>>>c=list(b.keys())


>>>c


4、Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)


赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。


浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数}


深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}


5、介绍一下except的用法和作用?


try…except…except…else…


执行try下的语句,如果引发异常,则执行过程会跳到except语句。对每个except分支顺序尝试执行,如果引发的异常与except中的异常组匹配,执行相应的语句。如果所有的except都不匹配,则异常会传递到下一个调用本代码的高层try代码中。


try下的语句正常执行,则执行else块代码。如果发生异常,就不会执行如果存在finally语句,后总是会执行。


6、Python中__new__与__init方法的区别


__new__:它是创建对象时调用,会返回当前对象的一个实例,可以用_new_来实现单例


__init__:它是创建对象后调用,对当前对象的一些实例初始化,无返回值


7、常用的网络数据爬取方法


正则表达式


BeautifulSoup


Lxml


8、遇到过得反爬虫策略以及解决方法


1.通过headers反爬虫


2.基于用户行为的发爬虫:(同一IP短时间内访问的频率)


3.动态网页反爬虫(通过ajax请求数据,或者通过JavaScript生成)


4.对部分数据进行加密处理的(数据是乱码)


解决方法:


对于基本网页的抓取可以自定义headers,添加headers的数据


使用多个代理ip进行抓取或者设置抓取的频率降低一些,


动态网页的可以使用selenium+phantomjs进行抓取


对部分数据进行加密的,可以使用selenium进行截图,使用python自带的pytesseract库进行识别,但是比较慢直接的方法是找到加密的方法进行逆向推理。


9、urllib和urllib2的区别


urllib和urllib2都是接受URL请求的相关模块,但是urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。urllib不可以伪装你的User-Agent字符串。


urllib提供urlencode()方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。


10、设计一个基于session登录验证的爬虫方案


11、列举网络爬虫所用到的网络数据包,解析包


网络数据包urllib、urllib2、requests


解析包re、xpath、beautifulsoup、lxml


12、熟悉的爬虫框架


Scrapy框架根据自己的实际情况回答


13、Python在服务器的部署流程,以及环境隔离


14、Django和Flask的相同点与不同点,如何进行选择?


15、写一个Python中的单例模式


classSingleton(object):


_instance=None


def__new__(cls,*args,**kw):


ifnotcls._instance:


cls._instance=super(Singleton,cls).__new__(cls,*args,**kw)


returncls._instance


classMyClass(Singleton):


a=1


one=MyClass()


two=MyClass()


id(one)=id(two)


>>>True


16、Linux部署服务脚本命令(包括启动和停止的shell脚本)


17、你用过多线程和异步嘛?除此之外你还用过什么方法来提高爬虫效率?


scrapy-redis分布式爬取


对于定向爬取可以用正则取代xpath


18、POST与GET的区别


GET数据传输安全性低,POST传输数据安全性高,因为参数不会被保存在浏览器历史或web服务器日志中;


在做数据查询时,建议用GET方式;而在做数据添加、修改或删除时,建议用POST方式;


GET在url中传递数据,数据信息放在请求头中;而POST请求信息放在请求体中进行传递数据;


GET传输数据的数据量较小,只能在请求头中发送数据,而POST传输数据信息比较大,一般不受限制;


在执行效率来说,GET比POST好


19、什么是lambda函数?它有什么好处?


lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数


lambda函数:首要用途是指点短小的回调函数


以上就是容大教育Python在线学习小编给大家分享的文章,希望对小伙伴们有所帮助。


领取试听课
每天限量名额,先到先得
温馨提示:为不影响您的学业,来校区前请先电话或QQ咨询,方便我校安排相关的专业老师为您解答
  • 详情请进入 上海容大教育IT培训...

关于我们 | 招生信息 | 新闻中心 | 学校动态

版权所有:搜学搜课(www.soxsok.com)