Python爬虫工程师面试高频问题与核心知识点解析

Felix
Felix
发布时间:2026-10-13 | 3人浏览过
原创

本文系统梳理Python爬虫工程师面试中的核心问题,涵盖if __name__机制、Python内存管理(引用计数与垃圾回收)、对象拷贝差异、异常处理、常用爬虫库对比及反爬应对方案。深入解析Django与Flask选型、多线程异步优化、POST/GET区别及Lambda表达式,为求职者提供实用的技术参考。

注:以下答案均能在网络资源中找到对应解释。

1. 如何理解 if __name__ == 'main' 的作用?

2. Python 是如何进行内存管理的?

3. 请编写一段 Python 代码,实现删除列表(list)中的重复元素。

4. Python 中如何拷贝一个对象?(需区分赋值、浅拷贝与深拷贝的区别)

5. 请介绍 except 的用法及其作用?

6. Python 中 __new__ 与 __init__ 方法的区别是什么?

7. 列举常用的网络数据爬取方法。

8. 遇到过哪些反爬虫策略?对应的解决方法有哪些?

9. urllib 和 urllib2 的主要区别是什么?

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

11. 列举网络爬虫中常用的网络数据包解析库。

12. 你熟悉哪些爬虫框架?

13. Python 在服务器上的部署流程是怎样的?如何实现环境隔离?

14. Django 和 Flask 的相同点与不同点是什么?在实际项目中如何进行选择?

15. 请写一个 Python 中的单例模式实现。

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

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

18. POST 与 GET 的区别是什么?

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)常用的网络数据爬取方法

  • 正则表达式
  • Beautiful Soup
  • 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、beautiful soup、lxml

12)熟悉的爬虫框架

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

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

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

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

class Singleton(object):
_instance = None
def __new__(cls, *args, **kw):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kw) 
return cls._instance
class MyClass(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 函数:首要用途是指点短小的回调函数

lambda [arguments]:expression
>>> a=lambdax,y:x+y
>>> a(3,11)

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表