Python面试

113 阅读7分钟

1 Linux 的基本命令(怎么区分一个文件还是文件夹)

s -F 在显示名称的时候会在文件夹后添加“/”,在文件后面加“*”。

2 Linux 查看某个服务的端口?

netstat -anp | grep service_name

3 软连接和硬链接的区别?

软连接类似 Windows 的快捷方式,当删除源文件时,那么软链接也失效了。

硬链接可以理解为源文件的一个别名,多个别名所代表的是同一个文件。当 rm 一个文件的时候,那么此文件的硬链接数减1,当硬链接数为 0 的时候,文件被删除。

 4  10 个常用的 Linux 命令?

pwd 显示工作路径

ls 查看目录中的文件

cd /home 进入 '/ home' 目录'

cd .. 返回上一级目录

cd ../.. 返回上两级目录

mkdir dir1 创建一个叫做 'dir1' 的目录

rm -f file1 删除一个叫做file1 的文件',-f 参数,忽略不存在的文件,从不给出提示。

rmdir dir1 删除一个叫做 'dir1' 的目录'

groupadd group_name 创建一个新用户组

groupdel group_name 删除一个用户组

tar -cvf archive.tar file1 创建一个非压缩的 tarball

tar -cvf archive.tar file1 file2 dir1 创建一个包含了 'file1', 'file2' 以及 'dir1'的档案文件

tar -tf archive.tar 显示一个包中的内容

tar -xvf archive.tar 释放一个包

tar -xvf archive.tar -C /tmp 将压缩包释放到 /tmp 目录下

tar -cvfj archive.tar.bz2 dir1 创建一个 bzip2 格式的压缩包

tar -xvfj archive.tar.bz2 解压一个 bzip2 格式的压缩包

tar -cvfz archive.tar.gz dir1 创建一个 gzip 格式的压缩包

tar -xvfz archive.tar.gz 解压一个 gzip 格式的压缩包

5  git 合并文件有冲突,如何处理?

1、git merge 冲突了,根据提示找到冲突的文件,解决冲突如果文件有冲突,那么会有类似的标记

2、修改完之后,执行 git add 冲突文件名

3、git commit 注意:没有-m 选项 进去类似于 vim 的操作界面,把 conflict 相关的行删除掉直接 push 就可以了,因为刚刚已经执行过相关 merge 操作了。

6. 写爬虫是用多进程好?还是多线程好? 为什么?

一般情况下,在选择是使用多进程还是多线程时,主要考虑的业务到底是 型(多线程)还是计算密集型(多进程)。

网络并发适宜使用多线程

数据处理业务是一个比较耗时的计算型操作,那么对数据处理部分应当设为多线程

7  一个包里有三个模块,mod1.py , mod2.py , mod3.py ,但使用 from demopack import * 导入模块时,如何保证只有 mod1 、 mod3 被导入了。
答:在包中增加 __init__.py 文件,并在文件中增加:
_all_=['mod1','mod3']

8  需要登录的网页,如何解决同时限制 ip,cookie,session(其中有一些是动态生成的)在不使用动态爬取的情况下?解决限制 IP 可以使用代理 IP 地址池、服务器;不适用动态爬取的情况下可以使用反编译 JS 文件获取相应的文件,或者换用其他平台(比如手机端)看看是否可以获取相应的 json 文件。

9. 验证码的解决?

图形验证码:干扰、杂色不是特别多的图片可以使用开源库 Tesseract 进行识别,太过复杂的需要借助第三方打码平台。

点击和拖动滑块验证码可以借助 selenium、无图形界面浏览器(chromedirver 或者 phantomjs) 和 pillow 包来模拟人的点击和滑动操作,pillow 可以根据色差识别需要滑动的位置。

10 使用最多的数据库(Mysql,Mongodb,redis 等),对他们的理解?

mysql是关系型数据库,支持事物

MongoDB、Redis是非关系型数据库,不支持事物

mongodb、mysql、redis的使用根据如何方便进行选择

希望速度快的时候,选择MongoDB或者是Redis

数据量过大的时候,选择频繁使用的数据存入Redis,其他的存入MongoDB

MongoDB不用提前建表建数据库,使用方便,字段数量不确定的时候使用MongoDB

后续需要用到数据之间的关系,此时考虑使用mysql

 11 字符集和字符编码

字符是各种文字和符号的总称,包括各个国家文字、标点符号、图形符号、数字等

字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集有:ASCII 字符集、ISO 8859 字符集、GB2312 字符集、BIG5 字符集、GB18030 字符集、Unicode 字符集等。

字符编码就是以二进制的数字来对应字符集的字符。常见的编码字符集(简称字符集)有:unicode、ASCII、GB2312、GBK、GB13080

注意:Unicode 字符集有多种编码方式,如 UTF-8、UTF-16 等;ASCII 只有一种;大多数 MBCS(包括 GB2312)也只有一种。

 12. cookie 过期的处理问题?

因为 cookie 存在过期的现象,一个很好的处理方法就是做一个异常类,如果有异常的话 cookie 抛出异常类在执行程序。

将cookie写入文件,当抛出异常的时候,读取cookie。

13. HTTPS 是如何实现安全传输数据的。

HTTPS 其实就是在 HTTP 跟 TCP 中间加多了一层加密层 TLS/SSL。SSL 是个加密套件,负责对 HTTP的数据进行加密。TLS 是 SSL 的升级版。现在提到 HTTPS,加密套件基本指的是 TLS。原先是应用层将数据直接给到 TCP 进行传输,现在改成应用层将数据给到 TLS/SSL,将数据加密后,再给到 TCP 进行传输。

14. TTL,MSL,RTT?

MSL:报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

TTL:TTL 是 time to live 的缩写,中文可以译为“生存时间”,由源主机设置初始值,存储了一个 ip 数据报可以经过的最大路由数,每经过一个处理他的路由 器此值就减 1,当此值为 0 则数据报将被丢弃,TTL 与 MSL 是有关系的但不是简单的相等 的关系,MSL 要大于等于 TTL。

RTT: RTT 是客户到服务器往返所花时间(round-trip time,简称 RTT),RTT 受网络传输拥塞程序的变化而变化。

15. requests 返回的 content 和 text 的区别?

a)response.text 返回的是 Unicode 型数据;

a)response.content 返回的是 bytes 类型,也就是二进制数据;

b)获取文本使用,response.text;

b)获取图片,文件,使用 response.content;

c)response.text         类型:str

解码类型: 根据 HTTP 头部对响应的编码作出有根据的推测,推测的文本编码

如何修改编码方式:response.encoding=”gbk”

c)response.content        类型:bytes

解码类型: 没有指定

如何修改编码方式:response.content.decode(“utf8”)

16. robots 协议

Robots 协议:网站通过 Robots 协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。

17. dumps,loads 与 dump,load 的区别?

json.dumps()将 pyhton 的 dict 数据类型编码为 json 字符串;json.loads()将 json 字符串解码为 dict 的数据类型;json.dump(x,y) x 是 json 对象, y 是文件对象,最终是将 json 对象写入到文件中;json.load(y) 从文件对象 y 中读取 json 对象。

18. 怎么获取加密的数据?

1. Web 端加密可尝试移动端(app)

2. 解析加密,看能否破解3. 反爬手段层出不穷,js 加密较多,只能具体问题具体分析分析前端 js 文件,找到加密解密数据的 js 代码,用 Python 代码实现或者利用 js2py 或 pyexecjs等执行 js 代码

19 怎么监控爬虫的状态

1. 使用 python 的 STMP 包将爬虫的状态信心发送到指定的邮箱

2. Scrapyd、pyspider

3. 引入日志集成日志处理平台来进行监控,如 elk