zoukankan      html  css  js  c++  java
  • python:爬虫面试(一)

    跟大家分享一下面试中关于爬虫方面相关的问题。

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

    什么是爬虫?

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

    爬虫基本流程?

    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的基本结构?

    作者:短发元气girl
    链接: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框架执行爬虫的流程?

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

     

    欢迎大家补充交流~

  • 相关阅读:
    [React Testing] Create a Custom Render Function to Simplify Tests of Redux Components
    [React Testing] Test a Custom React Hook with React’s Act Utility and a Test Component
    Android之Android apk动态加载机制的研究
    Android之设备唯一识别
    ios之调用打电话,发短信,打开网址
    ios之如何读取plist
    android之卸载反馈的功能
    Android之针对webview的缓存
    Android之仿String的对象驻留
    Mac与Mac之中的共享方式
  • 原文地址:https://www.cnblogs.com/wxcclub/p/6538618.html
Copyright © 2011-2022 走看看