王老板的创业新公司刚刚融资一个亿, 公司新业务又得需要招人了, 这次招市场最火语言 Python 开发工程师!
Let,s go Python!
有些自学爬虫 (python) 的同学因为没有经历过专业面试, 所以在找工作之前难免有些抓不住重点. 即便掌握技术熟练, 却因为发挥不好而错失工作机会. 今天就和大家分享几道常见的 Python 爬虫面试题, 让你轻轻松松拿到心仪的 offer!
1. 是否了解线程的同步和异步?
线程同步: 多个线程同时访问同一资源, 等待资源访问结束, 浪费时间, 效率低
线程异步: 在访问资源时在空闲等待时同时访问其他资源, 实现多线程机制
2. 是否了解网络的同步和异步?
同步: 提交请求 ->等待服务器处理 ->处理完毕返回 这个期间客户端浏览器不能干任何事
异步: 请求通过事件触发 ->服务器处理 (这是浏览器仍然可以作其他事情)-> 处理完毕
3. 链表和顺序表储存时各自有什么优点?
(1). 顺序表存储
原理: 顺序表存储是将数据元素放到一块连续的内存存储空间, 存取效率高, 速度快. 但是不可以动态增加长度
优点: 存取速度高效, 通过下标来直接存储
缺点:. 插入和删除比较慢; 不可以增长长度
比如: 插入或者删除一个元素时, 整个表需要遍历移动元素来重新排一次顺序
(2). 链表存储
原理: 链表存储是在程序运行过程中动态的分配空间, 只要存储器还有空间, 就不会发生存储溢出问题
优点: 插入和删除速度快, 保留原有的物理顺序, 比如: 插入或者删除一个元素时, 需要改变指针指向即可
缺点: 查找速度慢, 因为查找时, 需要循环链表访问
4. 使用 redis 搭建分布式系统时如何处理网络延迟和网络异常?
由于网络异常的存在, 分布式系统中请求结果存在 "三态" 的概念, 即三种状态:"成功","失败","超时(未知)"
当出现 "超时" 时可以通过发起读取数据的操作以验证 RPC 是否成功(例如银行系统的做法)
另一种简单的做法是, 设计分布式协议时将执行步骤设计为可重试的, 即具有所谓的 "幂等性"
5. 数据仓库是什么?
数据仓库是一个面向主题的, 集成的, 稳定的, 反映历史变化的, 随着时间的流逝发生变化的数据集合. 它主要支持管理人员的决策分析.
数据仓库收集了企业相关内部和外部各个业务系统数据源, 归档文件等一系列历史数据, 最后转化成企业需要的战略决策信息.
特点:
面向主题: 根据业务的不同而进行的内容划分;
集成特性: 因为不同的业务源数据具有不同的数据特点, 当业务源数据进入到数据仓库时, 需要采用统一的编码格式进行数据加载, 从而保证数据仓库中数据的唯一性;
非易失性: 数据仓库通过保存数据不同历史的各种状态, 并不对数据进行任何更新操作.
历史特性: 数据保留时间戳字段, 记录每个数据在不同时间内的各种状态.
6. 你是否了解谷歌的无头浏览器?
无头浏览器即 headless browser, 是一种没有界面的浏览器. 既然是浏览器那么浏览器该有的东西它都应该有, 只是看不到界面而已.
Python 中 selenium 模块中的 PhantomJS 即为无界面浏览器(无头浏览器): 是基于 Qtwebkit 的无头浏览器.
7. 你是否了解 MySQL 数据库的几种引擎?
InnoDB:
InnoDB 是一个健壮的事务型存储引擎, 这种存储引擎已经被很多互联网公司使用, 为用户操作非常大的数据存储提供了一个强大的解决方案.
在以下场合下, 使用 InnoDB 是最理想的选择:
1. 更新密集的表. InnoDB 存储引擎特别适合处理多重并发的更新请求.
2. 事务. InnoDB 存储引擎是支持事务的标准 MySQL 存储引擎.
3. 自动灾难恢复. 与其它存储引擎不同, InnoDB 表能够自动从灾难中恢复.
4. 外键约束. MySQL 支持外键的存储引擎只有 InnoDB.
5. 支持自动增加列 AUTO_INCREMENT 属性.
一般来说, 如果需要事务支持, 并且有较高的并发读取频率, InnoDB 是不错的选择.
MEMORY:
使用 MySQL Memory 存储引擎的出发点是速度. 为得到最快的响应时间, 采用的逻辑存储介质是系统内存.
虽然在内存中存储表数据确实会提供很高的性能, 但当 mysqld 守护进程崩溃时, 所有的 Memory 数据都会丢失.
获得速度的同时也带来了一些缺陷.
一般在以下几种情况下使用 Memory 存储引擎:
1. 目标数据较小, 而且被非常频繁地访问. 在内存中存放数据, 所以会造成内存的使用, 可以通过参数 max_heap_table_size 控制 Memory 表的大小, 设置此参数, 就可以限制 Memory 表的最大大小.
2. 如果数据是临时的, 而且要求必须立即可用, 那么就可以存放在内存表中.
3. 存储在 Memory 表中的数据如果突然丢失, 不会对应用服务产生实质的负面影响.
8.redis 数据库有哪几种数据结构?
5 种数据结构
string
使用 string 时, redis** 大多数情况下 ** 并不会理解或者解析其含义, 无论使用 json,xml 还是纯文本在 redis 看来都是一样的, 只是一个字符串, 只能进行 strlen,append 等对字符串通用的操作, 无法针对其内容进一步操作. 其基本操作命令有 set,get,strlen,getrange,append:
- SET key value
- GET key
- STRLEN key
- GETRANGE key start end
- APPEND key value
在大多数情况之外, 就是 string 中存储的为纯数字的情况, redis 可以将字符串当做数字进行进一步操作, 这些操作包括 decr,decrby,incr,incrby 和 incrbyfloat.
hash
使用 hash 时, 在我看来, 就是 value 本身就是一组 key-value 对, 不过 redis 将这里的 key 称为 field(但是 hkeys 命令为什么不叫 hfields 命令呢哈哈), 也就是 value 是一组 field-value 对. 其基本操作命令有 hset,hget,hmset,hmget,hgetall,hkeys 和 hdel:
- 1 HSET key field value
- 2 HGET key field
- 3 HMSET key field value [field value ...]
- 4 HMGET key field [field ...]
- 5 HGETALL key
- 6 HKEYS key
- 7 HDEL key field [field ...]
- list
使用 list 时, value 就是一个 string 数组, 操作这组 string 时, 可以像对待栈一样使用 pop 和 push 操作, 但是这个栈两端都能进行操作; 也可以像对待数组一样使用一个 index 参数来操作. list 的操作命令略杂, 主要分为两类: L 开头的和 R 开头的, L 代表 LEFT 或者 LIST, 进行一些从列表左端进行的操作, 或者一些与端无关的操作; R 代表 RIGHT, 进行一些从列表右端进行的操作.
set
set 用于存储一组不重复的值, 也可以进行一些集合的操作, 就像数学上的集合, 它是无序的. 基本操作有 sadd 和 sismember:
- SADD key member [member ...]
- SISMEMBER key member
集合操作有: 求交 sinter, 求并 sunion 和求差 sdiff:
- 1 SINTER key [key ...]
- 2 SUNION key [key ...]
- 3 SDIFF key [key ...]
- sorted set
sorted set 类似 set, 但是 sorted set 里每个元素都有一个 score, 这个 score 可用于排序和排名. 基本操作有 zadd,zcount,zrank:
1 ZADD key score member [score member ...]
- ZCOUNT key min max
- ZRANK key member
来源: http://www.jianshu.com/p/0f5cbd596891