跟大家分享一下面试中关于爬虫方面相关的问题。
——————————基础知识——————————
什么是爬虫?
请求网站并提取数据的自动化程序
爬虫基本流程?
- 发起请求(scrapy发送get、post请求),可能包含请求头等信息,等待服务器相应
- 获取服务器响应内容,可能是网页文本(html、json代码),图片二进制、视频二进制等
- 解析内容(正则、xpath、json解析等 )
- 保存数据(本地文件、数据库等)
遇到过什么反爬虫措施,如何解决?
1. 基于用户行为,同一个ip段时间多次访问同一页面
利用代理ip,构建ip池
2. 请求头里的user-agent
构建user-agent池(操作系统、浏览器不同,模拟不同用户)
3. 动态加载(抓到的数据和浏览器显示的不一样),js渲染
模拟ajax请求,返回json形式的数据
selenium / webdriver 模拟浏览器加载 (chromedriver安装)
如何提高爬取效率?
爬虫下载慢主要原因是阻塞等待发往网站的请求和网站返回
- 采用异步与多线程,扩大电脑的cpu利用率;
- 采用消息队列模式
- 提高带宽
request请求(封装http请求)方式中的post、get有什么区别?
- GET一般用于获取/查询资源信息,而POST一般用于更新资源信息
- get是在url中传递数据,数据放在请求头中,post是在请求体中传递数据
- get安全性非常低,post安全性较高,但是get执行效率却比Post方法好
xpath、css选择器及返回类型区分?
response.selector.xpath(css) 为了方便,其中的selector可以省略
返回:由selector组成的list,每个元素都是一个selector对象
1、SelectorList类型
case = response.xpath('//*[@class="content"]/ul/li')
2、List类型
case = response.xpath('//*[@class="content"]/ul/li').extract()
3、str类型
case = ''.join(response.xpath('//*[@class="content"]/ul/li').extract())
extract()[0]选取第一个元素, extract_first()能达到一样的效果
模拟登陆原理?
因为http请求是无状态的,网站为了识别用户身份,需要通过cookie记录用户信息(用户、密码),这些信息都会在手动登陆时记录在post请求的form-data里,那么在爬虫时候只需要将这些信息添加到请求头里即可。
验证码?
可以将验证码下载到本地人工识别填入
分布式原理?
多台机器多个 spider 对多个 url 同时进行处理
——————————框架知识——————————
用的什么框架,为什么选择这个框架?
scrapy,只需要实现少量代码,就能够快速的抓取到数据内容。Scrapy 使用了 Twisted异步网络框架来处理网络通讯,可以加快下载速度,不用自己去实现异步框架,并且包含各种中间件接口,可以灵活的完成各种需求。
scrapy的基本结构?
链接:https://zhuanlan.zhihu.com/p/35794035
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
- 引擎(Scrapy)
用来处理整个系统的数据流处理, 触发事务(框架核心) - 调度器(Scheduler)
用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址 - 下载器(Downloader)
用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的) - 爬虫(Spiders)
爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面 - 项目管道(Pipeline)
负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。 - 下载器中间件(Downloader Middlewares)
位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。 - 爬虫中间件(Spider Middlewares)
介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。 - 调度中间件(Scheduler Middewares)
介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
scrapy框架执行爬虫的流程?
- 引擎从调度器中取出一个链接(URL)用于接下来的抓取
- 引擎把URL封装成一个请求(Request)传给下载器
- 下载器把资源下载下来,并封装成应答包(Response)
- 爬虫解析Response
- 解析出实体(Item),则交给实体管道进行进一步的处理
- 解析出的是链接(URL),则把URL交给调度器等待抓取
———————————数据库———————————
关系型数据库和非关系型数据库的区别?
关系型:MySQL、Oracle、SQL Server、DB2等
优势:
- 支持复杂查询。可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询
- 事务支持。使得对于安全性能很高的数据访问要求得以实现
非关系型:MongoDB、Redis等
优势:
- 性能高。NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高
- 可扩展性。同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展
数据库索引(类似于书的目录)
类型:
(1)普通索引:没有任何限制
(2)唯一索引:不允许建立索引的列有重复值,但可以有空值
(3)主索引:特殊的唯一索引,不允许有空值
(4)候选索引:唯一性,可以有多个候选索引
优点:加快数据查找的效率
缺点:
- 占用磁盘空间
- 增加了插入和删除的操作时间。一个表拥有的索引越多,插入和删除的速度越慢,如要求快速录入的系统不宜建过多索引
索引实现方式?
- B+树
- 散列索引
- 位图索引
SQL里面设置复合索引与单个普通索引的区别?
- 复合索引只对和索引中排序相同或相反的order by 语句优化
- 如果存在一个多列索引,任何最左面的索引前缀能被优化器使用。所以联合索引的顺序不同,影响索引的选择,尽量将值少的放在前面。
数据库视图?
视图是从一个或多个表(视图)导出的表,视图与表不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,在对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表
优点:
- 简化了操作,把经常使用的数据定义为视图
对于一个查询动作频繁发生的话,我们可以创建视图简化
- 安全性,用户只能查询和修改能看到的数据
将基表中重要的字段信息,可以不通过视图给用户,用户对视图不可以随意的更改和删除,可以保证数据的安全性
- 逻辑上的独立性,屏蔽了真实表的结构带来的影响
视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来
缺点:
- 性能差
数据库必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,数据库也要把它变成一个复杂的结合体,需要花费一定的时间
- 修改限制
当用户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的视图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的
数据库事务?
数据库事务是指作为单个逻辑工作单元执行的一系列操作,要么完全执行,要么完全不执行
性质:
- 原子性
- 一致性
- 隔离性
- 持久性
三级模式两层映射 ?
- 外模式
外模式也称为用户模式,它是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。外模式是模式的子集,一个数据库可以有多个外模式。
- 模式
模式也称为逻辑模式或概念模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。一个数据库只有一个模式,模式位于三级结构的中间层。
- 内模式
内模式也称为存储模式,一个数据库只有一个内模式,它是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式。
好处:有效地组织、管理数据,提高了数据库的逻辑独立性和物理独立性
- 外模式/模式映射
当模式被改变时,数据库管理员对各个外模式/模式映射做相应的改变,可以使外模式保持不变。这样,依据数据外模式编写的应用程序就不用修改,保证了数据与程序的逻辑独立性
- 模式/内模式映射
数据库的存储结构被改变时,数据库管理员对模式/内模式映射做相应的改变,可以使模式保持不变,应用程序相应地也不做变动。这样,保证了数据与程序的物理独立性
MySQL用户权限、库权限、表权限的控制?
用户权限:连接数据库需要用户名、密码
库权限:
#给用户hehe赋予操作test库的所有权限
grant all on test.* to hehe@'localhost' identified by '123456';
表权限:
#给用户hehe操作test库goods表的insert,select,update的权限
grant insert,select,update on test.goods to hehe@'localhost' identified
——————————协议方面———————————
http、https协议有什么区别?
- http协议是超文本传输协议,被用于在web浏览器和网站服务器之间传递信息,以明文方式发送内容,不对数据加密,很容易被黑客入侵,安全性不高
- 为了数据传输的安全,https在http的基础上加入了SSL协议,SSL依靠ca证书来验证服务器的身份,为浏览器和服务器之间的通信加密
http状态码?
表示网页服务器http响应状态的3位数字代码
- 2开头 (请求成功)表示成功处理了请求的状态代码
- 3开头 (请求被重定向)表示要完成请求,需要进一步操作
- 4开头 (客户端错误)这些状态代码表示请求可能出错,妨碍了服务器的处理
- 5开头(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误
常见状态码:
200 (成功) 服务器已成功处理了请求
403 (禁止) 服务器拒绝请求
404 (未找到) 服务器找不到请求的网页
408 (请求超时) 服务器等候请求时发生超时
爬虫协议?
Robots协议(也称为爬虫协议、爬虫规则、机器人协议等)也就是robots.txt,网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
Robots协议是网站国际互联网界通行的道德规范,其目的是保护网站数据和敏感信息、确保用户个人信息和隐私不被侵犯。因其不是命令,故需要搜索引擎自觉遵守。
欢迎大家补充交流~