Q:说一下mysql、redis和MongoDB数据库的区别
A:Redis是一个内存数据库,Redis所有数据都是放在内存中的,持久化是使用RDB方式或者aof方式。MySQL是关系型数据库,数据和索引都存放在硬盘中,到要使用的时候才交换到内存中,能够处理超过内存总量的数据,在不同的引擎上有不同的存储方式。MongoDB的所有数据是存放在硬盘的,所有要操作的数据通过mmap的方式映射到内存某个区域内。然后,MongoDB就在这块区域里面进行数据修改避免了零碎的硬盘操作至于mmap上的内容flush到硬盘就是操作系统的事情了,所以如果MongoDB在内存中修改了数据后mmap数据flush到硬盘之前系统宕机了数据就会丢失。
Q:说说一般爬虫的流程
A:1、爬虫引擎获得初始请求开始抓取。
2、爬虫引擎开始请求调度程序,并准备对下一次的请求进行抓取。
3、爬虫调度器返回下一个请求给爬虫引擎。
4、引擎请求发送到下载器,通过下载中间件下载网络数据。
5、一旦下载器完成页面下载,将下载结果返回给爬虫引擎。
6、引擎将下载器的响应通过中间件返回给爬虫进行处理。
7、爬虫处理响应,并通过中间件返回处理后的items,以及新的请求给引擎。
8、引擎发送处理后的items到项目管道,然后把处理结果返回给调度器,调度器计划处理下一个请求抓取。
9、重复以上步骤,直到爬取完所有的url请求。
Q:简单介绍下scrapy的异步处理?
A:scrapy框架的异步机制是基于twisted异步网络框架处理的,在settings.py文件里可以设置具体的并发量数值(默认是并发量16)。
Q:scrapy和scrapy-redis有什么区别?为什么选择redis数据库?
A:scrapy是一个Python爬虫框架,爬取效率极高,具有高度定制性,但是不支持分布式。而scrapy-redis是一套基于redis数据库、运行在scrapy框架之上的组件,可以让scrapy支持分布式策略,Slaver端共享Master端redis数据库里的item队列、请求队列和请求指纹集合。至于为什么选择redis数据库,因为redis支持主从同步,而且数据都是缓存在内存中的,所以基于redis的分布式爬虫,对请求和数据的高频读取效率非常高。
Q:实现模拟登录的方式有哪些?
A:建立账号池,然后使用cookie;使用一个具有登录状态的cookie,结合请求报头一起发送,可以直接发送get请求,访问登录后才能访问的页面。先发送登录界面的get请求,在登录页面HTML里获取登录需要的数据(如果需要的话),然后结合账户密码,再发送post请求,即可登录成功。然后根据获取的cookie信息,继续访问之后的页面。
Q:如何处理cookie的过期问题?
A:做一个异常类,如果有异常的话cookie抛出异常类在执行程序
Q:分布式有哪些方案,你觉得哪一种最好?
A:主要有celery、beanstalk、gearman,个人认为gearman比较好。原因主要有这么几点:技术类型简单,维护成本低。简单至上,能满足当前的技术需求即可 (分布式任务处理、异步同步任务同时支持、任务队列的持久化、维护部署简单)。有成熟的使用案例,instagram就是使用的gearman来完成图片的处理的相关任务,有成功的经验,我们当然应该借鉴。
面试总结:
回顾这次面试,笔试相对比较基础,面试则重点考察爬虫的专业技能,程度上则有深有浅。总的来说遇到自己会的就尽量说多说全展现出自己的自信和风采,不太了解的按自己的理解和经验尽量阐述即可,并且要保持一个冷静和彬彬有礼的状态。
你想要的传送门: