Python:金九银十,Python高频面试题(第二弹)

Python高频面试题目总结第二弹来了,正在金九银十的伙伴可以看过来了!

一. 简述一下scrapy的基本流程?

scrapy分为9个步骤:

  • Spiders需要初始的start_url或则函数stsrt_requests,会在内部生成Requests给Engine;
  • Engine将requests发送给Scheduler;
  • Engine从Scheduler那获取requests,交给Download下载;
  • 在交给Dowmload过程中会经过Downloader Middlewares(经过process_request函数);
  • Dowmloader下载页面后生成一个response,这个response会传给Engine,这个过程中又经过了
    Downloader Middlerwares(经过process_request函数),在传送中出错的话经过process_exception函数;
  • Engine将从Downloader那传送过来的response发送给Spiders处理,这个过程经过Spiders
  • Middlerwares(经过process_spider_input函数);
  • Spiders处理这个response,返回Requests或者Item两个类型,传给Engine,这个过程又经过Spiders
    Middlewares(经过porcess_spider_output函数);
  • Engine接收返回的信息,如果使Item,将它传给Items
    Pipeline中;如果是Requests,将它传给Scheduler,继续爬虫;

重复第三步,直至没有任何需要爬取的数据
Python:金九银十,Python高频面试题(第二弹)

二. python3.5语言中enumerate的意思是

对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值

enumerate多用于在for循环中得到计数

三. 你是否了解谷歌的无头浏览器?

无头浏览器即headless browser,是一种没有界面的浏览器。既然是浏览器那么浏览器该有的东西它都应该有,只是看不到界面而已。

Python中selenium模块中的PhantomJS即为无界面浏览器(无头浏览器):是基于QtWebkit的无头浏览器。

四. scrapy和scrapy-redis的区别?

scrapy是一个爬虫通用框架,但不支持分布式,scrapy-redis是为了更方便的实现scrapy分布式爬虫,而提供了一些以redis为基础的组件

为什么会选择redis数据库?

因为redis支持主从同步,而且数据都是缓存在内存中,所以基于redis的分布式爬虫,对请求和数据的高频读取效率非常高

什么是主从同步?

在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),当客户端向从服务器发送SLAVEOF命令,要求从服务器复制主服务器时,从服务器首先需要执行同步操作,也即是,将从服务器的数据库状态更新至主服务器当前所处的数据库状态

五. scrapy的优缺点?为什么要选择scrapy框架?

优点:

采取可读性更强的xpath代替正则 强大的统计和log系统 同时在不同的url上爬行 支持shell方式,方便独立调试 写middleware,方便写一些统一的过滤器 通过管道的方式存入数据库

缺点:

基于python爬虫框架,扩展性比较差,基于twisted框架,运行中exception是不会干掉reactor,并且异步框架出错后是不会停掉其他任务的,数据出错后难以察觉

六. scrapy和requests的使用情况?

requests 是 polling 方式的,会被网络阻塞,不适合爬取大量数据

scapy 底层是异步框架 twisted ,并发是最大优势

七. 描述一下scrapy框架的运行机制?

从start_urls里面获取第一批url发送请求,请求由请求引擎给调度器入请求对列,获取完毕后,调度器将请求对列交给下载器去获取请求对应的响应资源,并将响应交给自己编写的解析方法做提取处理,如果提取出需要的数据,则交给管道处理,如果提取出url,则继续执行之前的步骤,直到多列里没有请求,程序结束。

八. 写爬虫使用多进程好,还是用多线程好?

IO密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有IO操作会进行IO等待,造成不必要的时间浪费,而开启多线程能在线程A等待时,自动切换到线程B,可以不浪费CPU的资源,从而能提升程序执行效率)。在实际的数据采集过程中,既考虑网速和响应的问题,也需要考虑自身机器的硬件情况,来设置多进程或多线程

九. 常见的反爬虫和应对方法?

基于用户行为,同一个ip段时间多次访问同一页面 利用代理ip,构建ip池
请求头里的user-agent 构建user-agent池(操作系统、浏览器不同,模拟不同用户)
动态加载(抓到的数据和浏览器显示的不一样),js渲染 模拟ajax请求,返回json形式的数据
selenium / webdriver 模拟浏览器加载
对抓到的数据进行分析
加密参数字段 会话跟踪【cookie】 防盗链设置【Referer

十. 分布式爬虫主要解决什么问题?

面对海量待抓取网页,只有采用分布式架构,才有可能在较短时间内完成一轮抓取工作。

它的开发效率是比较快而且简单的。

后面的高频Python面试题也在继续为大家总结中。可继续关注!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值