• 那是从何处传来的钟声呢?偶尔听到那钟声,平添一份喜悦与向往之情。

爬虫常见面试问题及解答

后端 Nanait 5年前 (2019-09-25) 954次浏览 已收录 0个评论 扫描二维码
文章目录[隐藏]

最近在找实习的过程中,面试过几家爬虫工程师的职位,结合之前 BOSS 直聘爬虫的经历,跟大家分享一下面试中关于爬虫方面的问题。

——————————基础知识——————————

什么是爬虫

请求网站并提取数据的自动化程序

爬虫基本流程?

  1. 发起请求(scrapy 发送 get、post 请求),可能包含请求头等信息,等待服务器相应
  2. 获取服务器响应内容,可能是网页文本(html、json 代码),图片二进制、视频二进制等
  3. 解析内容(正则、xpath、json 解析等 )
  4. 保存数据(本地文件、数据库等)

遇到过什么反爬虫措施,如何解决?

1. 基于用户行为,同一个 ip 段时间多次访问同一页面

利用代理 ip,构建 ip 池

2. 请求头里的 user-agent

构建 user-agent 池(操作系统、浏览器不同,模拟不同用户)

3. 动态加载(抓到的数据和浏览器显示的不一样),js 渲染

模拟 ajax 请求,返回 json 形式的数据

selenium / webdriver 模拟浏览器加载 (chromedriver 安装)

如何提高爬取效率?

爬虫下载慢主要原因是阻塞等待发往网站的请求和网站返回

  1. 采用异步与多线程,扩大电脑的 cpu 利用率;
  2. 采用消息队列模式
  3. 提高带宽

request 请求(封装 http 请求)方式中的 post、get 有什么区别?

  1. GET 一般用于获取/查询资源信息,而 POST 一般用于更新资源信息
  2. get 是在 url 中传递数据,数据放在请求头中,post 是在请求体中传递数据
  3. 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 的基本结构?

爬虫常见面试问题及解答
  • 引擎(Scrapy)
    用来处理整个系统的数据流处理, 触发事务(框架核心)
  • 调度器(Scheduler)
    用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个 URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
  • 下载器(Downloader)
    用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy 下载器是建立在 twisted 这个高效的异步模型上的)
  • 爬虫(Spiders)
    爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让 Scrapy 继续抓取下一个页面
  • 项目管道(Pipeline)
    负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
  • 下载器中间件(Downloader Middlewares)
    位于 Scrapy 引擎和下载器之间的框架,主要是处理 Scrapy 引擎与下载器之间的请求及响应。
  • 爬虫中间件(Spider Middlewares)
    介于 Scrapy 引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
  • 调度中间件(Scheduler Middewares)
    介于 Scrapy 引擎和调度之间的中间件,从 Scrapy 引擎发送到调度的请求和响应。

scrapy 框架执行爬虫的流程?

  1. 引擎从调度器中取出一个链接(URL)用于接下来的抓取
  2. 引擎把 URL 封装成一个请求(Request)传给下载器
  3. 下载器把资源下载下来,并封装成应答包(Response)
  4. 爬虫解析 Response
  5. 解析出实体(Item),则交给实体管道进行进一步的处理
  6. 解析出的是链接(URL),则把 URL 交给调度器等待抓取

———————————数据库———————————

关系型数据库和非关系型数据库的区别?

关系型:MySQL、Oracle、SQL Server、DB2 等

优势:

  • 支持复杂查询。可以用 SQL 语句方便的在一个表以及多个表之间做非常复杂的数据查询
  • 事务支持。使得对于安全性能很高的数据访问要求得以实现

非关系型:MongoDB、Redis 等

优势:

  • 性能高。NOSQL 是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过 SQL 层的解析,所以性能非常高
  • 可扩展性。同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展

数据库索引(类似于书的目录)

类型:

(1)普通索引:没有任何限制

(2)唯一索引:不允许建立索引的列有重复值,但可以有空值

(3)主索引:特殊的唯一索引,不允许有空值

(4)候选索引:唯一性,可以有多个候选索引

优点:加快数据查找的效率

缺点:

  1. 占用磁盘空间
  2. 增加了插入和删除的操作时间。一个表拥有的索引越多,插入和删除的速度越慢,如要求快速录入的系统不宜建过多索引

索引实现方式?

  1. B+树
  2. 散列索引
  3. 位图索引

SQL 里面设置复合索引与单个普通索引的区别?

  1. 复合索引只对和索引中排序相同或相反的 order by 语句优化
  2. 如果存在一个多列索引,任何最左面的索引前缀能被优化器使用。所以联合索引的顺序不同,影响索引的选择,尽量将值少的放在前面。

数据库视图?

视图是从一个或多个表(视图)导出的表,视图与表不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,在对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表

优点:

  • 简化了操作,把经常使用的数据定义为视图

对于一个查询动作频繁发生的话,我们可以创建视图简化

  • 安全性,用户只能查询和修改能看到的数据

将基表中重要的字段信息,可以不通过视图给用户,用户对视图不可以随意的更改和删除,可以保证数据的安全性

  • 逻辑上的独立性,屏蔽了真实表的结构带来的影响

视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来

缺点:

  • 性能差

数据库必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,数据库也要把它变成一个复杂的结合体,需要花费一定的时间

  • 修改限制

当用户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的视图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的

数据库事务?

数据库事务是指作为单个逻辑工作单元执行的一系列操作,要么完全执行,要么完全不执行

性质:

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

三级模式两层映射 ?

  • 外模式

外模式也称为用户模式,它是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。外模式是模式的子集,一个数据库可以有多个外模式。

  • 模式

模式也称为逻辑模式或概念模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。一个数据库只有一个模式,模式位于三级结构的中间层。

  • 内模式

内模式也称为存储模式,一个数据库只有一个内模式,它是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式。

好处:有效地组织、管理数据,提高了数据库的逻辑独立性和物理独立性

  • 外模式/模式映射

当模式被改变时,数据库管理员对各个外模式/模式映射做相应的改变,可以使外模式保持不变。这样,依据数据外模式编写的应用程序就不用修改,保证了数据与程序的逻辑独立性

  • 模式/内模式映射

数据库的存储结构被改变时,数据库管理员对模式/内模式映射做相应的改变,可以使模式保持不变,应用程序相应地也不做变动。这样,保证了数据与程序的物理独立性

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 协议是网站国际互联网界通行的道德规范,其目的是保护网站数据和敏感信息、确保用户个人信息和隐私不被侵犯。因其不是命令,故需要搜索引擎自觉遵守。


何处钟 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:爬虫常见面试问题及解答
喜欢 (1)
[15211539367@163.com]
分享 (0)

您必须 登录 才能发表评论!