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

     

    欢迎大家补充交流~

  • 相关阅读:
    metal的gpu query
    体积雾 global fog unity 及改进
    hdr rt format对颜色的影响
    unity deferred lighting
    unity linear space时 photoshop blend的正确设置
    unity linear work flow
    一些数据 bandwidth之类
    deferred rendering with msaa
    unity 显示mipmaplevel
    【转】在C#中使用SendMessage
  • 原文地址:https://www.cnblogs.com/wxcclub/p/6538618.html
Copyright © 2011-2022 走看看