前言

之所以在这里写下python爬虫常见面试题及解答

一是用作笔记,方便日后回忆;

二是给自己一个和大家交流的机会,互相学习、进步,希望不正之处大家能给予指正;

三是我也是互联网寒潮下岗的那批人之一,为了找工作而做准备。

本人对于Python学习创建了一个小小的学习圈子,为各位提供了一个平台,大家一起来讨论学习Python。欢迎各位到来Python学习群:960410445一起讨论视频分享学习。Python是未来的发展方向,正在挑战我们的分析能力及对世界的认知方式,因此,我们与时俱进,迎接变化,并不断的成长,掌握Python核心技术,才是掌握真正的价值所在。

一、题目部分

1、scrapy框架专题部分(很多面试都会涉及到这部分)

(1)请简要介绍下scrapy框架。

scrapy 是一个快速(fast)、高层次(high-level)的基于 python 的 web 爬虫构架,用于抓取web站点并从页面中提取结构化的数据。scrapy 使用了 Twisted异步网络库来处理网络通讯。

(2)为什么要使用scrapy框架?scrapy框架有哪些优点?

1、它更容易构建大规模的抓取项目

2、它异步处理请求,速度非常快

3、它可以使用自动调节机制自动调整爬行速度

(3)scrapy框架有哪几个组件/模块?简单说一下工作流程。

Scrapy Engine: 这是引擎,负责Spiders、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等等!(像不像人的身体?)

Scheduler(调度器): 它负责接受引擎发送过来的requests请求,并按照一定的方式进行整理排列,入队、并等待Scrapy Engine(引擎)来请求时,交给引擎。

Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spiders来处理,

Spiders:它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),

Item Pipeline:它负责处理Spiders中获取到的Item,并进行处理,比如去重,持久化存储(存数据库,写入文件,总之就是保存数据用的)

Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件

Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spiders中间‘通信‘的功能组件(比如进入Spiders的Responses;和从Spiders出去的Requests)

整体架构如下图:

工作流程:

数据在整个Scrapy的流向:

程序运行的时候,

引擎:Hi!Spider, 你要处理哪一个网站?

Spiders:我要处理23wx.com

引擎:你把第一个需要的处理的URL给我吧。

Spiders:给你第一个URL是XXXXXXX.com

引擎:Hi!调度器,我这有request你帮我排序入队一下。

调度器:好的,正在处理你等一下。

引擎:Hi!调度器,把你处理好的request给我,

调度器:给你,这是我处理好的request

引擎:Hi!下载器,你按照下载中间件的设置帮我下载一下这个request

下载器:好的!给你,这是下载好的东西。(如果失败:不好意思,这个request下载失败,然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载。)

引擎:Hi!Spiders,这是下载好的东西,并且已经按照Spider中间件处理过了,你处理一下(注意!这儿responses默认是交给def parse这个函数处理的)

Spiders:(处理完毕数据之后对于需要跟进的URL),Hi!引擎,这是我需要跟进的URL,将它的responses交给函数 def xxxx(self, responses)处理。还有这是我获取到的Item。

引擎:Hi !Item Pipeline 我这儿有个item你帮我处理一下!调度器!这是我需要的URL你帮我处理下。然后从第四步开始循环,直到获取到你需要的信息,

注意!只有当调度器中不存在任何request了,整个程序才会停止,(也就是说,对于下载失败的URL,Scrapy会重新下载。)

以上就是Scrapy整个流程了。

(4)scrapy如何实现分布式抓取?

可以借助scrapy_redis类库来实现。

在分布式爬取时,会有master机器和slave机器,其中,master为核心服务器,slave为具体的爬虫服务器。

我们在master服务器上搭建一个redis数据库,并将要抓取的url存放到redis数据库中,所有的slave爬虫服务器在抓取的时候从redis数据库中去链接,由于scrapy_redis自身的队列机制,slave获取的url不会相互冲突,然后抓取的结果最后都存储到数据库中。master的redis数据库中还会将抓取过的url的指纹存储起来,用来去重。相关代码在dupefilter.py文件中的request_seen()方法中可以找到。

去重问题:

dupefilter.py 里面的源码:

def request_seen(self, request):

fp = request_fingerprint(request)

added = self.server.sadd(self.key, fp)

return not added

去重是把 request 的 fingerprint 存在 redis 上,来实现的。

2、其他常见问题。

(1)爬虫使用多线程好?还是多进程好?为什么?

对于IO密集型代码(文件处理,网络爬虫),多线程能够有效提升效率(单线程下有IO操作会进行IO等待,会造成不必要的时间等待,而开启多线程后,A线程等待时,会自动切换到线程B,可以不浪费CPU的资源,从而提升程序执行效率)。

在实际的采集过程中,既考虑网速和相应的问题,也需要考虑自身机器硬件的情况,来设置多进程或者多线程。

(2)http和https的区别?

A. http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

B. http适合于对传输速度、安全性要求不是很高,且需要快速开发的应用。如web应用,小的手机游戏等等。而https适用于任何场景。

(3)数据结构之堆,栈和队列的理解和实现。

栈(stacks):栈的特点是后进先出。只能通过访问一端来实现数据的储存和检索的线性数据结构。

队列(queue):队列的特点是先进先出。元素的增加只能在一端,元素的删除只能在另一端。增加的一端称为队尾,删除的一端称为队首。

栈:

队列:

这里还会有一个常见的问题,栈溢出的常见情况及解决方案。

什么是栈溢出?

因为栈一般默认为1-2m,一旦出现死循环或者是大量的递归调用,在不断的压栈过程中,造成栈容量超过1m而导致溢出。

栈溢出的几种情况?

1、局部数组过大。当函数内部数组过大时,有可能导致堆栈溢出。

2、递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。

解决方法:

1、用栈把递归转换成非递归。

2、增大栈空间。

转载于:https://juejin.im/post/5c31baf851882525a94e0391

Python爬虫常见面试题(二)相关推荐

  1. python自动化测试常见面试题二_思考|自动化测试面试题第二波

    本内容为企业面试关于自动化测试的考题,大家可以自己思考下如何作答,欢迎把答案留言到本文下方哦. 问题1:设计接口测试⽤用例例时,涉及的是电商系统,其中包括很多修改,如商品.商家.店铺等等,针对这些数据 ...

  2. python工程师-史上最全Python工程师常见面试题集锦,有这一份就够了

    从互联网诞生以来,基本上所有的程序都属于网络程序,也就需要设计到网络编程,在python中,就是在python程序本身这进程内,链接别的服务器进程的通信端口进行通信.在Python程序员找工作的时候, ...

  3. python常用面试题_史上最全Python工程师常见面试题集锦,有这一份就够了

    从互联网诞生以来,基本上所有的程序都属于网络程序,也就需要设计到网络编程,在python中,就是在python程序本身这进程内,链接别的服务器进程的通信端口进行通信.在Python程序员找工作的时候, ...

  4. 2021 python 求职 常见面试题(北京 爬虫/后端)

    python 优缺点 开源,可移植,支持面向过程和面向对象,可扩展性,可嵌入性,库多 慢 用c重写重要部分,GIL python程序运行过程 pyCodeObject 内存 到 pyc 硬盘持久化存储 ...

  5. Python基础常见面试题总结

    文章目录 基础知识题 看程序写结果题 编程题 以下是总结的一些常见的Python基础面试题,帮助大家回顾基础知识,了解面试套路.会一直保持更新状态. PS:加粗为需要注意的点. 基础知识题 1.深拷贝 ...

  6. python开发-常见面试题

    今天总结一下python中常见的面试题: 1.is与==的区别 is比较变量内存地址和值是否相等,==仅仅比较变量的值是否相等 需要注意: 当变量的值较小时(a=1, b=1时,a is b的值是Tr ...

  7. MySQL数据库常见面试题二(传智专修学院2017级java4班)

    1. 在数据库中你怎么把时间进行格式化 例如使用 DATE_FORMAT(time,'%Y-%m-%d') 2. 如果左连接表中 左表有1条数据 右表有4条匹配的数据 结果是怎样的 右表展示4条匹配数 ...

  8. python数据分析常见面试题_python数据分析方向,面试题解答

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 5.从一个数组中找出重复的元素打印出来 NSArray *arr = [NSArrayarrayWithObjects:@"1",@& ...

  9. 链表常见面试题二:约瑟夫环

    面试题1:约瑟夫环 约瑟夫环故事背景: 著名犹太历史学家 Josephus有过以下的故事: 在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中, 39个犹太人决定宁愿死也不 ...

最新文章

  1. 【Qt】Qt中调用python接口
  2. 今日看点:“靠脸进站”的刷脸系统究竟是如何实现的
  3. 任意输入一个整数反转输出
  4. py2exe for python3_使用Py2Exe for Python3创建自己的exe程序
  5. OpenLiberty:注入时出错,适用于TomEE和Wildfly
  6. Ubuntu16.04直接修改root密码
  7. 绝地求生测试服画面优化软件,绝地求生正式服设置详解 教你调校最完美的画质...
  8. java常见经典知识点汇总
  9. 弹载计算机的上市公司,基于无线通信的弹载计算机系统BIT设计
  10. cilium插件测试_Cilium网络概述
  11. Get!程序员成为高级管理者的三次跃升
  12. 第七次CCF-D:游戏
  13. [转]Spring 注解总结
  14. Listary——好用到哭的高效快速搜索工具
  15. java粘包_Java网络通信基础系列-Netty粘包与拆包
  16. 四川省国际科技合作基地(国合基地)申报条件程序
  17. php ThinkPHP文章上一篇、下一篇解决方案
  18. gt710显卡驱动linux,华硕 GT710-SL-2G驱动下载_asus GT710-SL-2G显卡驱动下载-硬件之家...
  19. 静态电影网站模板A(html+css+js)
  20. 安装python3.10.1教程

热门文章

  1. 收购Deis之后,微软首次动作发布了Draft
  2. 初始Java DVD项目
  3. mysql图形化及命令行操作用户权限
  4. 10hibernate_one2many_1
  5. MOOON-server新消息处理接口
  6. SSAS : 如何禁用SSAS的QueryLog
  7. 贴别人的一个文件加密程序!
  8. Windows数据类型探幽——千回百转你是谁?(2)
  9. MySQL定义条件和处理程序_MySQL教程111-MySQL定义条件和处理程序
  10. android vlc 参数,【VLC-Android】LibVLC API简介(至关于VLC的MediaPlayer)