下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

了解Python 爬虫面试题 170 道:2019 版

作者:课课家教育     来源: http://www.kokojia.com点击数:1761发布时间: 2019-09-22 21:38:21

标签: python教程python数据库操作python培训

大神带你学编程,欢迎选课

在您开始之前,在你的计算机将需要Python,但您可能不需要下载它。首先检查(在命令行窗口输入python)有没有安装Python!如果你看到了一个Python解释器的响应,那么就能在它的显示窗口中得到一个版本号。通常较新的版本都可以做到Python的向前兼容。

引言

 Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。

.你写爬虫的时候都遇到过什么?反爬虫措施,你是怎么解决的?

通过headers反爬虫;
基于用户行为的发爬虫:(同一IP短时间内访问的频率);
动态网页反爬虫(通过ajax请求数据,或者通过Javascript生成);
解决途径:

对于基本网页的抓取可以自定义headers,将header随request一起发送(一般是User-Agent,Cookie)
使用IP代理池爬取或者降低抓取频率
使用selenium + phantomjs 进行抓取抓取动态数据,或者找到动态数据加载的json页面
2.用的什么框架,为什么选择这个框架?

scrapy是一个功能非常强大的爬虫框架,它不仅能便捷地构建request,还有强大的selector能够方便地解析response,然而它最受欢迎的还是它的性能,即抓取和解析的速度,它的downloader是多线程的,request是异步调度和处理的。这两点使它的爬取速度非常之快。另外还有内置的logging,exception,shell等模块,为爬取工作带来了很多便利。

以下关于scrapy的问题:

1.scrapy的基本结构(五个部分)都是什么?,请求发出去的整个流程?

scrapy由Spider、Engine、Scheduler、Downloader、Item Pipline五个部分组成。发送请求主要由如下几个步骤:

首先Spiders(爬虫)将需要发送请求的url(requests)到Engine(引擎)。
Engine(引擎)把request交给Scheduler(调度器)。
Scheduler经过排序,入队处理后,重新把request发送到Engine。
Engine把request请求通过DownloaderMiddlewares(可选,主要有User_Agent, Proxy代理)交给Downloader(下载器)。
Downloader向网站发送请求,并接受下载响应(Response),将Response返回给Engine。
Response由Engine,经过SpiderMiddlewares(可选)发送到Spiders开始解析。
解析数据完成后,将所需的Items原路返回到Engine。
Engine将Items发送到ItemPipeline(可以是本地,可以是数据库),提取下一个url再次进行循环。
2.scrapy的去重原理 (指纹去重到底是什么原理)

对于每一个url的请求,调度器都会根据请求得相关信息加密得到一个指纹信息,并且将指纹信息和set()集合中的指纹信息进行比对,如果set()集合中已经存在这个数据,就不在将这个Request放入队列中。如果set()集合中没有存在这个加密后的数据,就将这个Request对象放入队列中,等待被调度。

3.scrapy中间件有几种类,你用过那些中间件(详情)

scrapy中间件有Spider Middlewares 和 Downloader Middlewares两种(中间件原理),将fake-useragent和IP代理集成到Middlewares中,使Spider在发送request时主动更换User-Agent和IP。

4.scrapy中间件在哪里起的作用(面向切面编程)

1.爬虫中间件Spider Middleware:主要功能是在爬虫运行过程中进行一些处理.

2.下载器中间件Downloader Middleware:主要功能在请求到网页后,页面被下载时进行一些处理.

代理问题

1.为什么会用到代理?

网站的反爬虫策略会检测到同一个IP访问次数频率过快,从而禁止该IP的访问。因此爬虫过程中需要IP代理避免该问题。

2.代理怎么使用(具体代码,请求在什么时候添加的代理)

class RandomProxyMiddleware(object):
#动态设置ip代理
def process_request(self, request, spider):
get_ip = GetIP() #GetIP是获取代理IP的方法
request.meta["proxy"] = get_ip.get_random_ip()
该方法需要在Spider Middlewares中添加,为了在给网站发送请求前获得有效的代理IP。

3.代理失效了怎么处理?

事先用检测代码检测可用的代理,每隔一段时间更换一次代理,如果出现302等状态码,则立即更换下一个可用的IP。

四.验证码处理

1.登陆验证码处理

图片验证码:先将验证码图片下载到本地,然后使用云打码识别;
滑动验证码:使用selenium模拟人工拖动,对比验证图片的像素差异,找到滑动的位置然后获取它的location和size,然后 top,bottom,left,right = location['y'] ,location['y']+size['height']+ location['x'] + size['width']  ,然后截图,最后抠图填入这四个位置就行。
2.爬取速度过快出现的验证码处理

设置setting.py中的DOWNLOAD_DELAY,降低爬取速度;

用xpath获取验证码关键字,当出现验证码时,识别验证码后再继续运行。
3.如何用机器识别验证码

模拟登陆问题

1.模拟登陆流程

加载浏览器driver;
获取登录页面;
使用css选择器或者xpath找到账号和密码输入框,并发送账号和密码;
如果出现验证码则需要先识别验证码,在模拟输入验证码或者模拟鼠标拖动;
使用css选择器或者xpath找到登录按钮,使用click模拟点击;
2.cookie如何处理

 采用selenium自动登录获取cookie,保存到文件;
读取cookie,比较cookie的有效期,若过期则再次执行步骤1;
在请求其他网页时,填入cookie,实现登录状态的保持;
3.如何处理网站传参加密的情况

加密的三种情况:

加密+访问次数限制+每个页面相关信息的条目需要点详情进行二次请求;
复杂的加密算法进行参数+时间戳+sig值,后台进行 参数+时间限制;
定时同步cookie+每个界面一个cookie。
破解方法:

使用selenium模拟点击获取详情页面;
获取其相应的api接口,GET接口URL,获取它的json表格内容;
反向分析网页JS加载内容;
六.分布式

1.分布式原理

分布式爬虫主要由主机与从机,我们把自己的核心服务器(主机)称为 master,而把用于跑爬虫程序的机器(从机)称为 slave。

我们首先给爬虫一些start_urls,spider 最先访问 start_urls 里面的 url,再根据我们的 parse 函数,对里面的元素、或者是其他的二级、三级页面进行抓取。而要实现分布式,只需要在这个starts_urls里面做文章就行了。进一步描述如下:

master 产生 starts_urls,url 会被封装成 request 放到 redis 中的 spider:requests,总的 scheduler 会从这里分配 request,当这里的 request 分配完后,会继续分配 start_urls 里的 url。
slave 从 master 的 redis 中取出待抓取的 request,下载完网页之后就把网页的内容发送回 master 的 redis,key 是 spider:items。scrapy 可以通过 settings 来让 spider 爬取结束之后不自动关闭,而是不断的去询问队列里有没有新的 url,如果有新的 url,那么继续获取 url 并进行爬取,所以这一过程将不断循环。
master 里的 reids 还有一个 key 是 “spider:dupefilter” 用来存储抓取过的 url 的 fingerprint(使用哈希函数将url运算后的结果),防止重复抓取,只要 redis 不清空,就可以进行断点续爬。
2.分布式如何判断爬虫已经停止了

3.分布式去重原理

可以用布隆过滤器(Bloom filiter)进行去重。

七.数据存储和数据库问题

1.关系型数据库和非关系型数据库的区别

2.爬下来数据你会选择什么存储方式,为什么

3.各种数据库支持的数据类型,和特点,比如:redis如何实现持久化,mongodb是否支持事物等。

八.python基础问题

1.python2和python3的区别,如何实现python2代码迁移到python3环境

区别:字符串类型、默认字符、print方法、除法的数字类型、导入方式、继承类、元类声明、异常处理、字典、模块合并、部分模块重命名(详情)

代码迁移:python3有个内部工具叫做2to3.py,位置在Python3/tool/script文件夹。

首先CD到这个文件夹,然后调用

py 2to3.py -w f:/xxxx/xxx.py
使用方法

2.python2和python3的编码方式有什么差别?

在python2中主要有str和unicode两种字符串类型,而到python3中改为了bytes和str,并且一个很重要的分别是,在python2中如果字符串是ascii码的话,str和unicode是可以直接进行连接和比较,但是到python3中就不行了,bytes和str是两个独立的类型。另一个重要的是python2中不管是str还是unicode都可以直接写入文件,而不需要加上它是不是str的类型写入方式,但是在python3中如果是写或者读bytes类型就必需带上’b’.

3.迭代器,生成器,装饰器

4.python的数据类型

九.协议问题

1.http协议,请求由什么组成,每个字段分别有什么用,https和http有什么差距?

请求行(request line)、请求头部(header)、空行和请求数据四个部分组成(详情);

请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本;
请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息;
空行,请求头部后面的空行是必须的;
请求数据也叫主体,可以添加任意的其他数据;
 HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

  HTTPS和HTTP的区别主要如下:

https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
2.证书问题

3.TCP,UDP各种相关问题

十.数据提取问题

1.主要使用什么样的结构化数据提取方式(详情)?

JSON文件

JSON Path
转化为Python类型进行操作(json类)
XML文件

转化为Python类型(xmltodict)
XPath
CSS选择器
正则表达式
2.正则的使用

3.动态加载的数据如何提取?

selenium获取;
分析请求页面,获取它的js请求文件;
4.json数据如何提取

采用正则表达式解析:获取整个json数据后,采用正则表达式匹配到关键词;
基于json格式进行获取:json的数据格式与python的dict是有极大的类似之处。在python的 json 这个包里面提供了两个经典的预处理方法:json.dumps:将ptyhon的dict转成str,json.loads:将str转成python的dict类型;
 

最近在刷面试题,所以需要看大量的 Python 相关的面试题,从大量的题目中总结了很多的知识,同时也对一些题目进行拓展了,但是在看了网上的大部分面试题不是很满意,一个是有些部分还是 Python2 的代码,另一个就是回答的很简单,有些关键的题目,也没有点出为什么,最重要的是还有一些复制粘贴根本就跑不通,这种相信大家深有体会吧,这样就导致我们可能需要去找其他人发的类似的教程。难受啊,所以我决定针对市面上大多的 Python 题目做一个分析,同时也希望大家尽可能的做到举一反三,而不是局限于题目本身。大概就这样吧,有你看过的题目也有你没看到过的。

通过本场 Chat,你将获得如下知识点:

  • 掌握 Python 的基础语法
  • 语法常见的 Python 应用场景
  • 掌握 Python 闭包的使用以及装饰器的使用
  • 生成器和迭代器的使用
  • 常见的设计模式的使用
  • 深浅拷贝的区别
  • 线程、进程、协程的使用
  • 了解 Python 中的元编程和反射
  • 常考的数据结构和算法
  • 爬虫相关知识,网络编程基本知识等

所有题目

语言特性

1.谈谈对 Python 和其他语言的区别
2.简述解释型和编译型编程语言
3.Python 的解释器种类以及相关特点?
4.说说你知道的Python3 和 Python2 之间的区别?
5.Python3 和 Python2 中 int 和 long 区别?
6.xrange 和 range 的区别?

编码规范

7.什么是 PEP8?
8.了解 Python 之禅么?
9.了解 dosctring 么?
10.了解类型注解么?
11.例举你知道 Python 对象的命名规范,例如方法或者类等
12.Python 中的注释有几种?
13.如何优雅的给一个函数加注释?
14.如何给变量加注释?
15.Python 代码缩进中是否支持 Tab 键和空格混用。
16.是否可以在一句 import 中导入多个库?
17.在给 Py 文件命名的时候需要注意什么?
18.例举几个规范 Python 代码风格的工具

数据类型

字符串

19.列举 Python 中的基本数据类型?
20.如何区别可变数据类型和不可变数据类型
21.将"hello world"转换为首字母大写"Hello World"
22.如何检测字符串中只含有数字?
23.将字符串"ilovechina"进行反转
24.Python 中的字符串格式化方式你知道哪些?
25.有一个字符串开头和末尾都有空格,比如“ adabdw ”,要求写一个函数把这个字符串的前后空格都去掉。
26.获取字符串”123456“最后的两个字符。
27.一个编码为 GBK 的字符串 S,要将其转成 UTF-8 编码的字符串,应如何操作?

  1. (1)s="info:xiaoZhang 33 shandong",用正则切分字符串输出'info', 'xiaoZhang', '33', 'shandong' a = "你好 中国 ",去除多余空格只留一个空格。
  2. (1)怎样将字符串转换为小写 (2)单引号、双引号、三引号的区别?
列表

30.已知 AList = [1,2,3,1,2],对 AList 列表元素去重,写出具体过程。
31.如何实现 "1,2,3" 变成 ["1","2","3"]
32.给定两个 list,A 和 B,找出相同元素和不同元素
33.[[1,2],[3,4],[5,6]]一行代码展开该列表,得出[1,2,3,4,5,6]
34.合并列表[1,5,7,9]和[2,2,6,8]
35.如何打乱一个列表的元素?

字典

36.字典操作中 del 和 pop 有什么区别
37.按照字典的内的年龄排序

d1 = [
    {'name':'alice', 'age':38},
    {'name':'bob', 'age':18},
    {'name':'Carl', 'age':28},
]

38.请合并下面两个字典 a = {"A":1,"B":2},b = {"C":3,"D":4}
39.如何使用生成式的方式生成一个字典,写一段功能代码。
40.如何把元组("a","b")和元组(1,2),变为字典{"a":1,"b":2}

综合

41.Python 常用的数据结构的类型及其特性?

A:{1:0,2:0,3:0}
B:{"a":0, "b":0, "c":0}
C: {(1,2):0, (2,3):0}
D: {[1,2]:0, [2,3]:0}

42.如何将元组("A","B")和元组(1,2),合并成字典{"A":1,"B":2}
43.Python 里面如何实现 tuple 和 list 的转换?
44.我们知道对于列表可以使用切片操作进行部分元素的选择,那么如何对生成器类型的对象实现相同的功能呢?
45.请将[i for i in range(3)]改成生成器
46.a="hello"和 b="你好"编码成 bytes 类型
47.下面的代码输出结果是什么?

a = (1,2,3,[4,5,6,7],8)
a[2] = 2

48.下面的代码输出的结果是什么?

a = (1,2,3,[4,5,6,7],8)
a[3][0] = 2

操作类题目

49.Python 交换两个变量的值
50.在读文件操作的时候会使用 read、readline 或者 readlines,简述它们各自的左右
51.json 序列化时,可以处理的数据类型有哪些?如何定制支持 datetime 类型?
52.json 序列化时,默认遇到中文会转换成 unicode,如果想要保留中文怎么办?
53.有两个磁盘文件 A 和 B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件 C 中。
54.如果当前的日期为 20190530,要求写一个函数输出 N 天后的日期,(比如 N 为 2,则输出 20190601)。
55.写一个函数,接收整数参数 n,返回一个函数,函数的功能是把函数的参数和 n 相乘并把结果返回。
56.下面代码会存在什么问题,如何改进?

def strappend(num):
    str='first'
    for i in range(num):
        str+=str(i)
    return str

57.一行代码输出 1-100 之间的所有偶数。
58.with 语句的作用,写一段代码?
59.python 字典和 json 字符串相互转化方法
60.请写一个 Python 逻辑,计算一个文件中的大写字母数量

  1. 请写一段 Python连接Mongo数据库,然后的查询代码。
    62.说一说Redis的基本类型
  2. 请写一段 Python连接Redis数据库的代码。
  3. 请写一段 Python连接MySQL数据库的代码。
    65.了解Redis的事务么
    66.了解数据库的三范式么?
    67.了解分布式锁么
    68.用 Python 实现一个 Reids 的分布式锁的功能
    69.写一段 Python 使用 mongo 数据库创建索引的代码

高级特效

70.函数装饰器有什么作用?请列举说明?
71.Python 垃圾回收机制?
72.魔法函数 __call__怎么使用?
73.如何判断一个对象是函数还是方法?
74.@classmethod 和@staticmethod 用法和区别
75.Python 中的接口如何实现?
76.Python 中的反射了解么?
77.metaclass 作用?以及应用场景?
78.hasattr() getattr() setattr()的用法
79.请列举你知道的 Python 的魔法方法及用途。
80.如何知道一个 Python 对象的类型?
81.Python 的传参是传值还是传址?
82.Python 中的元类(metaclass)使用举例
83.简述 any()和 all()方法
84.filter 方法求出列表所有奇数并构造新列表,a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
85.什么是猴子补丁?
86.在 Python 中是如何管理内存的?
87.当退出 Python 时是否释放所有内存分配?

正则表达式

88.使用正则表达式匹配出<html><h1>www.baidu.com</html>中的地址
a="张明 98 分",用 re.sub,将 98 替换为 100
89.正则表达式匹配中(.*)和(.*?)匹配区别?
90.写一段匹配邮箱的正则表达式

其他内容

91.解释一下 python 中 pass 语句的作用?
92.简述你对 input()函数的理解
93.python 中的 is 和==
94.Python 中的作用域
95.三元运算写法和应用场景?
96.了解 enumerate 么?
97.列举 5 个 Python 中的标准模块
98.如何在函数中设置一个全局变量
99.pathlib 的用法举例
100.Python 中的异常处理,写一个简单的应用场景
101.Python 中递归的最大次数,那如何突破呢?
102.什么是面向对象的 mro
103.isinstance 作用以及应用场景?
104.什么是断言?应用场景?
105.lambda 表达式格式以及应用场景?
106.新式类和旧式类的区别
107.dir()是干什么用的?
108.一个包里有三个模块,demo1.py, demo2.py, demo3.py,但使用 from tools import *导入模块时,如何保证只有 demo1、demo3 被导入了。
109.列举 5 个 Python 中的异常类型以及其含义
110.copy 和 deepcopy 的区别是什么?
111.代码中经常遇到的*args, **kwargs 含义及用法。
112.Python 中会有函数或成员变量包含单下划线前缀和结尾,和双下划线前缀结尾,区别是什么?
113.w、a+、wb 文件写入模式的区别
114.举例 sort 和 sorted 的区别
115.什么是负索引?
116.pprint 模块是干什么的?
117.解释一下 Python 中的赋值运算符
118.解释一下 Python 中的逻辑运算符
119.讲讲 Python 中的位运算符
120.在 Python 中如何使用多进制数字?

121.怎样声明多个变量并赋值?

算法和数据结构

122.已知:

AList = [1,2,3]
BSet = {1,2,3}

(1) 从 AList 和 BSet 中 查找 4,最坏时间复杂度那个大?

(2) 从 AList 和 BSet 中 插入 4,最坏时间复杂度那个大?
123.用 Python 实现一个二分查找的函数
124.python 单例模式的实现方法
125.使用 Python 实现一个斐波那契数列
126.找出列表中的重复数字
127.找出列表中的单个数字
128.写一个冒泡排序
129.写一个快速排序
130.写一个拓扑排序
131.python 实现一个二进制计算
132.有一组“+”和“-”符号,要求将“+”排到左边,“-”排到右边,写出具体的实现方法。
133.单链表反转
134.交叉链表求交点
135.用队列实现栈
136.找出数据流的中位数
137.二叉搜索树中第 K 小的元素

爬虫相关

138.在 requests 模块中,requests.content 和 requests.text 什么区别
139.简要写一下 lXML 模块的使用方法框架
140.说一说 scrapy 的工作流程
了解Python 爬虫面试题 170 道:2019 版_python教程_python数据库操作_python培训_课课家

141.scrapy 的去重原理
142.scrapy 中间件有几种类,你用过哪些中间件
143.你写爬虫的时候都遇到过什么?反爬虫措施,你是怎么解决的?
144.为什么会用到代理?
145.代理失效了怎么处理?
146.列出你知道 header 的内容以及信息
147.说一说打开浏览器访问 www.baidu.com 获取到结果,整个流程。
148.爬取速度过快出现了验证码怎么处理
149.scrapy 和 scrapy-redis 有什么区别?为什么选择 redis 数据库?
150.分布式爬虫主要解决什么问题
151.写爬虫是用多进程好?还是多线程好? 为什么?
152.解析网页的解析器使用最多的是哪几个
153.需要登录的网页,如何解决同时限制 ip,cookie,session(其中有一些是动态生成的)在不使用动态爬取的情况下?
154.验证码的解决(简单的:对图像做处理后可以得到的,困难的:验证码是点击,拖动等动态进行的?)
155.使用最多的数据库(mysql,mongodb,redis 等),对他的理解?

网络编程

156.TCP 和 UDP 的区别?
157.简要介绍三次握手和四次挥手
158.什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?

并发

159.举例说明 conccurent.future 的中线程池的用法
160.说一说多线程,多进程和协程的区别。
161.简述 GIL
162.进程之间如何通信
163.IO 多路复用的作用?
164.select、poll、epoll 模型的区别?
165.什么是并发和并行?
167.解释什么是异步非阻塞?
168.threading.local 的作用?

Git 面试题

169.说说你知道的 git 命令
170.git 如何查看某次提交修改的内容

Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。

 

折叠编辑本

 
赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程