面试题1
1.列举python常用的数据结构
字典,集合,列表,字符串,元组
2.字典、集合、列表的区别
列表:
(1)任意对象的有序集合
列表是一组任意类型的值,按照一定顺序组合而成的
(2)通过偏移读取
组成列表的值叫做元素,每一个元素被标识一个索引,第一个索引是0,序列的功能都能实现
(3)可变长度,异构以及任意嵌套
列表中的元素可以是任意类型,甚至是列表类型,也就是说列表可以嵌套
(4)可变的序列
支持索引、切片、合并、删除等操作,塔门都是在原处进行修改列表
(5)对象引用数组
列表可以当成普通的数组,每当用到引用时,Python总是会将这个引用指向一个对象,所以程序只需要处理对象的操作。当把一个对象赋给一个数据结构元素或变量名时,Python总是会存储对象的引用,而不是一个对象的拷贝。
元组:
(1)任意对象的有序集合
与列表相同
(2)通过偏移存取
与列表相同
(3)属于不可变序列类型
类似于字符串,但元组是不可变的,不支持在列表中任何原处修改操作,不支持任何方法调用
(4)固定长度、异构、任意嵌套
固定长度即元组不可变,在不被拷贝的情况长度下固定,与其他同列表
和列表项比较
比列表操作速度快;对数据“写保护”;可用于字符串格式化中,可作为字典的key
字典
(1)通过键而不是偏移量来读取
字典就是一个关联数组,是一个通过关键字索引的对象的集合,使用键-值(key-value)进行存储,查找速度快
(2)任意对象的无序集合
字典中没有特定顺序,以键为象征
(3)可变长、异构、任意嵌套
同列表,嵌套可以包含列表和其他字典等
(4)属于可变映射类型
因为是无序,故不能进行序列操作,但可以在远处修改,通过映射到值。字典是唯一内置的映射类型(键映射到对象)
(5)对象引用表
字典存储的是对象引用,不是拷贝,和列表一样。字典的key是不能变的。list不能作为key,字符串、元组、整数等都可以
和列表相比较,字典的特性:
1.查找和插入的速度极快,不会随着key的增加而增加
2.需要占用大量的内存,内存浪费多
但是列表相反:
1.查找和插入的时间随着元素的增加而增加
2.占用空间小,浪费内存很少
所以字典是用空间来换取时间的一种方法
集合
1.是一组key的集合,但不存储value,并且key不能重复
2。重复元素在集合中自动被过滤
集合可以看成数学意义上的无序和无重复元素的集合,因此,两个集合可以做数学意义上的交集、并集等操作
和字典对比
1.集合和字典的唯一区别仅在于没有存储对应的value
2.集合的原理和字典一样,同样不可以放入可变对象,因为无法判断两个变对象是否相等,也就无法保证集合内部“不会有重复元素”
数据抓取时,常用的包和基础框架是什么
Requests
Selenium
Pyppetter
Aiohttp
Urlib
Gevent
Lxml
Pyquery等等
包:Scrapy Pysipder
HTTP是一个基于TCP/IP通信协议来传递数据,包括html文件、图像、结果等,即是一个客户端和服务器端请求和应答的标准
HTTP协议特点
1.http无连接:限制每次连结只处理一个请求,服务端完成客户端的请求后,即断开连接。(传输速度快,减少不必要的连结,但也意味着每一次访问都要建立一次连结,效率降低)
2.http无状态:对事物处理没有记忆能力。每一次请求都是独立的,不记录客户端任何行为(优点解放服务器,但可能每次请求会传输大量重复的内容信息)
3.客户端/服务端模型:客户端支持web浏览器或其他客户端,服务器通常是apache或list等
4.简单快捷
5.灵活:可以传输任何类型的数据
客户请求消息:
客户端发送一个请求到服务器的请求消息包括以下格式:
请求行,请求头部,空行,请求数据
服务器响应消息:
服务器响应包括如下格式:
状态行,消息报头,空行,响应正文
http协议常用的方法是:
| 1 | GET |
发送请求来获得服务器上的资源,请求体中不会包含请求数据,请求数据放在协议头中。另外get支持快取、缓存、可保留书签等。幂等 |
| 2 | POST |
和get一样很常见,向服务器提交资源让服务器处理,比如提交表单、上传文件等,可能导致建立新的资源或者对原有资源的修改。提交的资源放在请求体中。不支持快取。非幂等 |
| 3 | HEAD |
本质和get一样,但是响应中没有呈现数据,而是http的头信息,主要用来检查资源或超链接的有效性或是否可以可达、检查网页是否被串改或更新,获取头信息等,特别适用在有限的速度和带宽下。 |
| 4 | PUT |
和post类似,html表单不支持,发送资源与服务器,并存储在服务器指定位置,要求客户端事先知道该位置;比如post是在一个集合上(/province),而put是具体某一个资源上(/province/123)。所以put是安全的,无论请求多少次,都是在123上更改,而post可能请求几次创建了几次资源。幂等 |
| 5 | DELETE | 请求服务器删除某资源。和put都具有破坏性,可能被防火墙拦截。如果是https协议,则无需担心。幂等 |
| 6 | CONNECT |
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。就是把服务器作为跳板,去访问其他网页然后把数据返回回来,连接成功后,就可以正常的get、post了。 |
| 7 | OPTIONS | 获取http服务器支持的http请求方法,允许客户端查看服务器的性能,比如ajax跨域时的预检等。 |
| 8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。一般禁用,防止被恶意攻击或盗取信息。 |
get和post区别
| GET | POST | |
| 点击返回/刷新按钮 | 没有影响 | 数据会重新提交 |
| 缓存/添加书签 | 可以 | 不可以 |
| 历史记录 | 有 | 没有 |
| 编码类型 | application/x-www-form-urlencoded |
application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用 多重编码 |
| 是否幂等 | 幂等 | 非幂等 |
| 长度限制 |
http协议没有限制,但是实际浏览器或服务 器有(最大2048) |
理论上没有,可能会收到服务器配置或内存限制 |
| 数据类型限制 | 只能ASCII,非ascii都要编码传输 | 没有限制,允许二进制数据 |
| 安全性 | 数据全部展示在url中,不安全 | 相比get,通过request body传递数据,比较安全 |
| 可见效 | 可见 | 不可见 |
PATCH 和 PUT 比较
| PATCH | PUT | |
| 是否幂等 | 非幂等 | 幂等 |
| 粒度 | 局部,最小粒度,节约网络带宽 | 所有 |
简单列举一下scrapy常用的组件
Spiders(爬虫类)
Scrapy Engine(引擎)
Scheduler(调度器)
Downloader(下载器)
Item Pipeline(处理管道)
spiders:1.告诉scrapy下载哪些url(requests),2.将设置好的item通过yield item,这个item就会由pipelines来进行处理
这两种主要由yield来做的,所以可以yield两种类容
1.yield scrapy.Request:():就是发送请求
2.yield item:就是处理item
调度器:将spiders组件发送过来的requests排队入列,将来就从这个队列中一个一个发送给下载器进行下载
这个调度器是通过优先级队列来实现的
下载器:将从调度器过来的requests下载好,并将下载好的responses传递给该request所对应callback回调函数来处理
ltempipelines:传输数据的管道。主要作用就是处理从spider传递过来的item。默认是由process_item这个方法来处理的
scrapy引擎:组件之间的交互都是由引擎来完成的,组件之间是没有联系的,这是为了降低组件之间的耦合
大众点评是用什么技术做的
一个url组成
第一部分是协议(或称为服务方式)
第二部分是存有该资源的主机IP地址(有时也包括端口号)
第三部分是主机资源的具体地址
http和https的区别
https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用
http是超文本传输协议,信息是明文传输,https则具有安全性的ssl加密传输协议
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
http的连结很简单,是无状态的;https协议是由SSL+Http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全
postman是干什么用的
postman是一种网页调试与发送网页http请求的chrome插件,我们可以用来很方便的模拟get或者post或者其他方式的请求来调试接口
fiddler是干什么用的
对我们来说可以使用fiddler做映射,把远程的js的代码下载到本地进行修改,然后加载网页走本地的js文件。也可以修改一些参数进行调试
抓包工具可以做什么?
1.抓包(Web端和APP端数据包)
2.做接口文档(前提是需要有前端页面)
3.弱网测试(针对APP端)
4.安全测试(模拟数据篡改)
5.做接口测试
6.做并发测试(指标单一,不专业)
7.定位bug(主要针对前端/后端)
http中的cookies是干什么用的
Cookie的作用:Cookie是用于维持服务端会话状态的,通常由服务端写入,在后续请求中,供服务端读取。
HTTP请求,Cookie的使用过程
1.server通过HTTP Response中的“Set-Cookie:header”把cookie发送给client
2.client把cookie通过HTTP Request 中的"Cookie:header"发送给server
3.每次HTTP请求,Cookie都会被发送
http请求发送cookies的条件
1.本地已经缓存有cookies
2.根据请求的URL来匹配cookies的domain、path属性,如果都符合才会发送[url]的匹配规则请查看]
举个例子:访问www.baidu.com时,就不发送www.qq.com的cookies
Cookies查看与存放路径
Cookies查看:大家可以使用抓包工具,这种工具就不多话,网上搜索出很多,使用这些工具中可以清晰的看到Http Request中的Cookie,和Http Response中的cookie
这是我做应用的沙盒路径:/Users/a-hing/Library/Developer/CoreSimulator/Devices/FECA1CCE-4F9D-42B7-AC84-EEB94171E37C/data/Containers/Data/Application/79CEED3E-F7D9-4589-BEA5-44E1345CA71A/Library/cookes
大家可以去到自己应用的沙盒路径下,打开cookies看看里面的内容。
网站的登陆与App的自动登陆原理:
用户在连接服务器时,服务器生成一个唯一的SessionID 。而SessionID这一数据则是保存到客户端,
用Cookie保存的,用户提交页面时,会将 SessionID提交到服务器端,来存取Session数据。
来源https://blog.csdn.net/disuizhi5268/article/details/101729516
解析网页中的数据,是怎么做的
xpath
beautiful soup
pyquery
re
提取网页里面的链接地址,怎么提取
根据节点或连结地址提取
大众点评的字体加密方法
selenium的几种等待方式是
空气质量检测网站的做法
scrapy的中间件写过吗,写的哪几个中间件,干什么的
https://zhuanlan.zhihu.com/p/42498126
怎么加的代理,在scrapy中
见上题

浙公网安备 33010602011771号