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

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

什么是爬虫?

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

爬虫基本流程?

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

欢迎大家补充交流~

UT源码105032014098的更多相关文章

  1. UT源码 105032014098

    package exam1; import java.util.Scanner; public class test01 { static String nextDate(int year,int m ...

  2. UT源码 005

    NextDate函数问题 NextDate函数说明一种复杂的关系,即输入变量之间逻辑关系的复杂性 NextDate函数包含三个变量month.day和year,函数的输出为输入日期后一天的日期. 要求 ...

  3. UT源码105032014093

    需求描述: 设计佣金问题的程序 commission方法是用来计算销售佣金的需求,手机配件的销售商,手机配件有耳机(headphone).手机壳(Mobile phone shell).手机贴膜(Ce ...

  4. UT源码+105032014070

    设计三角形问题的程序 输入三个整数a.b.c,分别作为三角形的三条边,现通过程序判断由三条边构成的三角形的类型为等边三角形.等腰三角形.一般三角形(特殊的还有直角三角形),以及不构成三角形.(等腰直角 ...

  5. UT源码 065

    NextDate函数问题 NextDate函数说明一种复杂的关系,即输入变量之间逻辑关系的复杂性 NextDate函数包含三个变量month.day和year,函数的输出为输入日期后一天的日期. 要求 ...

  6. UT源码-124

    (1)设计三角形问题的程序 输入三个整数a.b.c,分别作为三角形的三条边,现通过程序判断由三条边构成的三角形的类型为等边三角形.等腰三角形.一般三角形(特殊的还有直角三角形),以及不构成三角形.(等 ...

  7. UT源码_105032014033

    需求描述: 设计佣金问题的程序 commission方法是用来计算销售佣金的需求,手机配件的销售商,手机配件有耳机(headphone).手机壳(Mobile phone shell).手机贴膜(Ce ...

  8. UT源码+019

    设计三角形问题的程序 输入三个整数a.b.c,分别作为三角形的三条边,现通过程序判断由三条边构成的三角形的类型为等边三角形.等腰三角形.一般三角形(特殊的还有直角三角形),以及不构成三角形.(等腰直角 ...

  9. UT源码162

    (3)设计佣金问题的程序 commission方法是用来计算销售佣金的需求,手机配件的销售商,手机配件有耳机(headphone).手机壳(Mobile phone shell).手机贴膜(Cellp ...

随机推荐

  1. hdu 1198 (并查集 or dfs) Farm Irrigation

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1198 有题目图11种土地块,块中的绿色线条为土地块中修好的水渠,现在一片土地由上述的各种土地块组成,需要浇 ...

  2. js 闭包 理解 copy

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于Javascript初学者应该是很有用的. 一.变量的作用域 要理解 ...

  3. [转载] Linux中的搜索文件命令

    搜索文件用处很大,我们往往需要知道一个文件存放在什么地方,我们又知道Linux是命令强大的一个系统,所以也有好多非常优秀的搜索命令.通常find不常用,因为速度慢,耗费硬盘空间.通常我们先使用wher ...

  4. Docker虚拟化实战学习——基础篇(转)

    Docker虚拟化实战学习——基础篇 2018年05月26日 02:17:24 北纬34度停留 阅读数:773更多 个人分类: Docker   Docker虚拟化实战和企业案例演练 深入剖析虚拟化技 ...

  5. LFI/RFI总结

    目录 0×01 文件包含简介 服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间.这意味着您可以创建供所有网页引用的标准页眉或菜单 ...

  6. 设计服务类网站原型模板分享——Fortyseven

    Fortyseven是一个设计服务网站,设计理念是帮助企业设计出赚钱的品牌和网站.该网站图文排版配色都很不错,很有欧美复古风,多采用大图结合文案排版. 本原型由国产Mockplus(原型工具)和iDo ...

  7. Python Numpy中transpose()函数的使用

    在Numpy对矩阵的转置中,我们可以用transpose()函数来处理. 这个函数的运行是非常反常理的,可能会令人陷入思维误区. 假设有这样那个一个三维数组(2*4*2): array ([[[ 0, ...

  8. DockerDesktop简单安装和使用

    一.在windows10下,安装DockerDesktop: 1.检查windows版本为企业版或专业版,并开启Hyper-v系统设置:电脑的控制面板->程序->启用或关闭Windows功 ...

  9. 【NIFI】 实现数据库到数据库之间数据同步

    本里需要基础知识:[NIFI] Apache NiFI 安装及简单的使用 数据同步 界面如下: 具体流程: 1.使用ExecuteSQL连接mysql数据库,通过写sql查询所需要的数据 2.nifi ...

  10. 数位dp小结

    数位dp其实就是一种用来求区间[l, r]满足条件的数的个数.数位是指:个十百千万,而在这里的dp其实相当于暴力枚举每一位数. 我们通过把l, r的每位数分解出来,然后分别求r里满足条件的数有多少,l ...