python爬⾍常见的⼀些⾯试题
1. 什么是爬⾍
⽹络爬⾍(⼜称为⽹页蜘蛛,⽹络机器⼈,在FOAF社区中间,更经常的称为⽹页追逐者),是⼀种按照⼀定的规则,⾃动地抓取万维⽹信息的程序或者脚本。
2. 什么是URL
URL,即统⼀资源定位符,也就是我们说的⽹址,统⼀资源定位符是对可以从互联⽹上得到的资源的位置和访问⽅法的⼀种简洁的表⽰,是互联⽹上标准资源的地址。互联⽹上的每个⽂件都有⼀个唯⼀的 URL,它包含的信息指出⽂件的位置以及浏览器应该怎么处理它。
laravel中控制器所在文件路径是
3. Scrapy的优缺点
优点:scrapy 是异步的, 对于固定单个⽹站的爬取开发,有优势
缺点:基于 python 的爬⾍框架,扩展性⽐较差,不够灵活.
4. HTTP和HTTPS的区别
http免费, https 协议需要到 ca 申请证书,⼀般免费证书很少,需要交费;
http 是超⽂本传输协议,信息是明⽂传输,https 则是具有安全性的 ssl 加密传输协议;
http 和 https 使⽤的是完全不同的连接⽅式⽤的端⼝也不⼀样,前者是 80,后者是 443;
http的连接很简单,是⽆状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进⾏加密传输、⾝份认证的⽹络协议,⽐http协议安全。
5.HTTPS如何进⾏数据传输
HTTPS 其实就是在 HTTP 跟 TCP 中间加多了⼀层加密层 TLS/SSL。SSL 是个加密套件,负责对 HTTP 的数据进⾏加密。TLS 是SSL 的升级版。现在提到 HTTPS,加密套件基本指的是 TLS。原先是应⽤层将数据直接给到 TCP (是⼀种⾯向连接的、可靠的、基于字节流的传输层通信协议)进⾏传输,现在改成应⽤层将数据给到TLS/SSL,将数据加密后,再给到 TCP 进⾏传输。
6. get和post请求的区别
get请求和post请求都是TCP链接,本质上并⽆区别, 但是由于HTTP的规定和浏览器/服务器的限制导致他们在应⽤过程中体现有所不同: get请求能够被缓存,post不能
get请求会被保存到浏览器的浏览记录⾥,post不能
get请求的url可以保存为书签,post不能
get请求有长度限制,post没有
get产⽣⼀个TCP数据包(把http header和data⼀并发送出去,服务器响应200(返回数据));post产⽣两个TCP数据包(浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据))。
7. Scrapy框架的运⾏机制
scrapy 是⼀个快速(fast)、⾼层次(high-level)的基于 python 的 web 爬⾍构架,⽤于抓取 web 站点并从页⾯中提取结构化的数据。scrapy 使⽤了 Twisted异步⽹络库来处理⽹络通讯
spider将想要爬取的url的request对象传递给engine
engine将request对象传递给scheduler,按某种算法进⾏排队
之后的某个时刻将处理好的request对象传递给enginewordpress中文主题站
engine将request对象传递给downloader
Downloader根据middleware中的规则,使⽤request对象中的url地址发出HTTP请求到⽹站服务器,将服务器返回的响应构造⼀个response对象,包含页⾯的html⽂本,并将response对象返回给engine
engine将response对象传递给spider进⾏数据提取
若提取出item,则由engine传递给itempipeline进⾏数据保存
若提取出url,则由engine传递给scheduler等待新⼀轮的数据抓取.
8. 什么是scrapy_Redis分布式爬⾍
scrapy 是⼀个 Python 爬⾍框架,爬取效率极⾼,具有⾼度定制性,但是不⽀持分布式。⽽ scrapy-redis 是⼀套基于 redis 数据库、运⾏在 scrapy 框架之上的组件,可以让scrapy ⽀持分布式策略,Slaver 端共享 Master 端 redis 数据库⾥的 item 队列、请求队列和请求指纹集合。为什么选择 redis 数据库,因为 redis ⽀持主从同步,⽽且数据都是缓存在内存中的,所以基于 redis 的分布式爬⾍,对请求和数据的⾼频读取效率⾮常⾼.
9. 实现模拟登录的⽅式有哪些
使⽤⼀个具有登录信息的cookie,结合请求报头直接进⾏get请求,访问登录后才能访问的页⾯;
先发送登录界⾯的get请求,在登录页⾯html⾥获取登录所需的参数,结合账号密码,进⾏post请求,若参数进⾏了加密,则需要解密.
10. scrapy的优点
更容易构建⼤规模的爬取项⽬
异步处理请求,速度快
可以使⽤⾃动调节机制⾃动调整抓取速度
提供了⼀个爬⾍任务管理界⾯, 可以实现爬⾍的启动、调试和停⽌,⽀持定时爬取任务
代码简洁,功能强⼤
11. Scrapy的指纹去重
对于每⼀个URL请求,scheduler会根据请求的相关信息加密得到⼀个指纹信息, 并且与set()集合⾥⾯的指纹信息进⾏对⽐, 如果集合中存在这个指纹信息, 那么不会将该request放⼊队列.
12. 关系型数据库和⾮关系型数据库区别?
关系型(表格式):MySQL、Postgresql、Oracle、DB2、SQL Servers12全球总决赛举办地
⾮关系型:Mongodb(⽂档型)、Redis(键值对型)、Hbase(列存储)
1、存储⽅式不同
关系型数据天然就是表格式的,因此存储在数据表的⾏和列中。
⾮关系型数据通常存储在数据集中,就像⽂档、键值对或者图结构。
2、扩展⽅式不同
关系型数据库是纵向扩展,也就是说提⾼处理能⼒,使⽤速度更快速的计算机,这样处理相同的数据集就更快了。
⾮关系型数据库是横向扩展,天然就是分布式的,可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。
3、对事务性的⽀持不同
性能和稳定性关系型优于⾮关系型
13. 怎么选择数据的存储⽅式
Redis基于内存,通过 Key-Value 键值对的的⽅式存储数据,读写速度快,也可做持久化,但是内存空间有限,当数据量超过内存空间时,需扩充内存,但内存价格贵;
MongoDB 是⼀个介于关系数据库和⾮关系数据库之间的产品,是⾮关系数据库当中功能最丰富,最像关系数据库的。它是⼀个内存数据库,数据都是放在内存⾥⾯的。
MySQL基于磁盘,读写速度没有Redis快,但是不受空间容量限制,性价⽐⾼;
14. python2和python3的区别
字符串类型、默认字符、print⽅法、除法的数字类型、导⼊⽅式、继承类、元类声明、异常处理、字典、模块合并、部分模块重命名Python2 既可以使⽤带⼩括号的⽅式,也可以使⽤⼀个空格来分隔打印内容,⽐如 print ‘hi’
Python3 使⽤ print 必须要以⼩括号包括打印内容,⽐如 print(‘hi’)编程有什么好处
python2 range(1,10)返回列表,python3中返回迭代器,节约内存
python2中使⽤ascii编码,python3中使⽤utf-8编码
python2中unicode表⽰字符串序列,str表⽰字节序列
python3中str表⽰字符串序列,byte表⽰字节序列
python2中为正常显⽰中⽂,引⼊coding声明,python3中不需要
python2中是raw_input()函数,python3中是input()函数
15. ⽣成器、迭代器、装饰器
Python的⽣成器是⼀个返回可以迭代对象的函数。容易使⽤,代码量较⼩,内存使⽤更加⾼效。仅仅在需要的时候才使⽤。
迭代器
可以直接作⽤于for循环的数据类型有以下⼏种:
⼀类是集合数据类型,如list,tuple,dict,set,str等
⼀类是generator ,包括⽣成器和带yeild的generator function
这些可以直接作⽤于for循环的对象统称为可迭代对象:Iterable
可以被next()函数调⽤并不断返回下⼀个值的对象称为迭代器:Iterator
装饰器
在函数调⽤前后⾃动打印⽇志,⼜不改变原函数,在代码运⾏期间动态增加功能的⽅式称之为“装饰器”。
装饰器的语法以@开头,接下来是装饰器函数的名字和可选的参数,紧跟着装饰器声明的是被修饰的函数和装饰函数的可选参数。
3⼤特征:
外部函数包含内部函数;
返回⼀个内部函数;
内部函数⽤到外部函数的变量。
16. 多线程和多进程
进程:
⼀个程序在操作系统中被执⾏以后就会创建⼀个进程,通过进程分配资源(cpu、内存、I/O设备)
线程:
线程从属于进程,是程序的实际执⾏者,在⼀个进程执⾏的过程,⼀般会分成很多个⼩的执⾏单位,线程就是这些执⾏单位;线程占⽤的是cpu。
⼀个程序⾄少拥有⼀个进程,⼀个进程⾄少拥有⼀个线程。进程负责资源的调度和分配,线程才是程序真正的执⾏单元,负责代码的执⾏。
由于全局解释锁(GIL)的存在,同⼀时间点只有⼀个线程被执⾏,所以python多线程并不是并⾏执⾏,因此较适合于I/O密集型程序,多进程并⾏执⾏适⽤于CPU密集型程序:
CPU密集型:程序需要占⽤CPU进⾏⼤量的运算和数据处理;
mysql面试题常问
I/O密集型:程序中需要频繁的进⾏I/O操作;例如⽹络中socket数据传输和读取等;
17. 协程
协程(Coroutines)是⼀种⽐线程更加轻量级的存在,是⼀种特殊的函数,正如⼀个进程可以拥有多个线程⼀样,⼀个线程可以拥有多个协程。但是⼀个线程的多个协程的运⾏是串⾏的,当⼀个协程运⾏时,其它协程必须挂起。
⾼并发+⾼扩展性+低成本
跨平台、跨体系架构
⽆需线程上下⽂切换的开销
18. 如何提升Scrapy的爬取效率
默认scrapy开启的并发线程为32个, 可以适当进⾏增加. 在settings配置⽂件中修改`CONCURRENT_REQUESTS = 100值为100, 并发设置成了为100.
降低⽇志级别
在运⾏scrapy时, 会有⼤量⽇志信息的输出, 为了减少CPU的使⽤率. 可以设置log输出信息为INFO或者ERROR. 在配置⽂件中编写: LOG_LEVEL = ‘INFO’
禁⽌cookie
如果不是真的需要cookie, 则在scrapy爬取数据时可以禁⽌cookie从⽽减少CPU的使⽤率, 提升爬取效率. 在配置⽂件中编写:
COOKIES_ENABLED = False.
javascript开发桌面应用禁⽌重试
对失败的HTTP进⾏重新请求(重试)会减慢爬取速度, 因此可以禁⽌重试. 在配置⽂件中编写: RETRY_ENABLED = False 减少下载超时
如果对⼀个⾮常慢的链接进⾏爬取, 减少下载超时可以能让卡住的链接快速被放弃, 从⽽提升效率. 在配置⽂件中进⾏编写:
DOWNLOAD_TIMEOUT = 10 超时时间为10s.
19. ⼀次完整的⽹络请求
域名解析;
TCP的三次握⼿;
建⽴TCP连接后发起HTTP请求;
服务器响应HTTP请求;
浏览器解析html代码,同时请求html代码中的资源(如js、css、图⽚);
最后浏览器对页⾯进⾏渲染并呈现给⽤户。
20. TCP的三次握⼿和四次挥⼿
三次握⼿
第⼀次握⼿:建⽴连接时,客户端发送syn包(syn=x)到服务器,并进⼊SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第⼆次握⼿:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时⾃⼰也发送⼀个SYN包(syn=y),即SYN+ACK 包,此时服务器进⼊SYN_RECV状态;
第三次握⼿:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进⼊ESTABLISHED(TCP连接成功)状态,完成三次握⼿。
四次挥⼿
客户端发出关闭连接报⽂,并停⽌传输数据;
服务器收到关闭连接报⽂,发出确认报⽂;
服务器最后的数据发送完毕后,发出关闭连接报⽂;
客户端收到报⽂,发出确认,在2MSL(最长报⽂段寿命)后进⼊CLOSED状态,服务器收到确认后⽴即进⼊CLOSED状态,完成四次挥⼿;
21. 常见的反爬,怎么解决