python爬虫相关的一些面试题

tcp,udp区别和特点
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。也就是说,在收发数据前,必须和对方建立可靠的连接。
UDP协议是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。

小结TCP与UDP的区别:
  1.基于连接与无连接;
  2.对系统资源的要求(TCP较多,UDP少);
  3.UDP程序结构较简单;
  4.流模式与数据报模式 ;
  5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

验证码的实现(简述)
1.首先确定滑块滑块间的距离,尺寸,坐标
2.其次随机获取图片,计算缺口的位置,然后模拟图片移动的轨迹
3.然后利用第三方软件进行破解
4.最后调用一下

基本类型
字符串:
列表:
元组:元组与列表类似,不同之处在于元组的元素不能修改;元组使用小括号(),列表使用方括号[];元组创建很简单,只需要在括号中添加元素,并使用逗号(,)隔开即可
字典:字典(dictionary)是除列表之外python中最灵活的内置数据结构类型。列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。字典由键和对应的值组成。字典也被称作关联数组或哈希表。

user-agent
它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

x-path,(文本怎么提取)
string() text()

多进程与多线程
计算密集型:
1、视频的解码、编码
2、科学数据计算
工作需要依赖CPU,多使用进程,建议进程的数量就等于cpu的数量

IO密集型:
1、web
2、文件读写
IO经常阻塞,速度远小于CPU的速度,可以多开辟一些线程,有线程阻塞了,其它线程依然正常工作

总结
进程是系统进行资源分配和调度的一个独立单位
线程是CPU调度和分派的基本单位
一个程序至少有一个进程,一个进程至少有一个线程
计算密集型的任务一般选择多进程,IO密集型的任务一般选择多线程

字符的用法
+连接
length() 获取长度
charAt()获取指定内容
indexOf() 获取索引位置
lastIndexOf从指定位置反索引

url的get和post区别?
GET后退按钮/刷新无害,POST数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
GET书签可收藏,POST为书签不可收藏。
GET能被缓存,POST不能缓存 。
GET编码类型application/x-www-form-url,POST编码类型encodedapplication/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
GET历史参数保留在浏览器历史中。POST参数不会保存在浏览器历史中。
GET对数据长度有限制,当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。POST无限制。
GET只允许 ASCII 字符。POST没有限制。也允许二进制数据。
与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET !POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
GET的数据在 URL 中对所有人都是可见的。POST的数据不会显示在 URL 中。

scrapy已经获取下一页的url,怎么获取下一页。
yield scrapy.Request(传入获取的url)

set是基于什么算法实现的?
二叉树

介绍爬虫用到的技术?

requests、scrapy:爬虫框架和分布式爬虫

xpath:网页数据提取

re:正则匹配

numpy、pandas:处理数据

matplotlib:绘图

mysql:数据存储

redis:爬虫数据去重和url去重

云打码:处理常规验证码

复杂验证码:用selenium模拟登陆、处理滑块验证码等(滑块验证码有方法,之前破解过滑块验证码,有空我会出个基本使用教程,进行滑块验证码破解,但不一定通用,因为每个网站反爬措施设置都不一样)

mvc流程:首先用户提交信息给控制器进行处理,然后通过模型讲用户信息保存到数据库,数据库再把保存结果返回给模型,控制器再保存结果,通过试图产生html页面,并且返回html页面到浏览器。

闭包流程
定义:闭包 当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的变量,且返回的这个函数在外部被执行 ? ? ? ? 就产生了闭包.闭包是一个环境,具体指的就是外部函数--高阶函数。说白了就是一个环境,能够读取其他函数内部的变量。本质上,闭包是将函数内部和函数外部连接起来的桥梁。
用处:1.读取函数内部的变量;
2.这些变量的值始终保持在内存中,不会在外层函数调用后被自动清除。

优点:1:变量长期驻扎在内存中;
2:避免全局变量的污染;
3:私有成员的存在 ;

特性:1:函数套函数;
2:内部函数可以直接使用外部函数的局部变量或参数;
3:变量或参数不会被垃圾回收机制回收 GC;
缺点:
常驻内存 会增大内存的使用量 使用不当会造成内存泄露,详解:
(1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
(2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值

Ajax?
不加载数据可以局部刷新

生成器迭代器
在Python中,这种一边循环一边计算的机制,称为生成器:generator。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

死锁
1.竞争资源
2.程序推进顺序不当
解决
1.预防死锁(摒弃除1以外的条件)
2.避免死锁(银行家算法)
3.检测死锁(资源分配图)
4.解除死锁

tcp创建流程
TCP建立连接需要三次握手,释放连接需要四次握手。
三次握手:客户端向服务器发送信序号,服务器返回序号并且加上自己的序号,客户端发送序号+1给予确认
四次挥手:客户端向服务器请求断开,服务器接收请求,服务器发送关闭信息,客户端再回复服务器已断开

处理过的最难的验证码?
12306点击图片验证码。原理:图片发送给打码平台,平台返回图片位置数值,通过计算返回数字和图片坐标的关系,进行模拟登陆

猜你喜欢

转载自www.cnblogs.com/quietly-elegant/p/10274372.html