爬虫之Scrapy框架

1. 什么是 scrapy 框架,其有什么特点?
scrapy 是一个快速、高层次的基于 python 的 web 爬虫构架,用于抓取 web 站点并从页面中提取结构化的数据。scrapy 使用了 Twisted 异步网络库来处理网络通讯。
优点:更适合构建大规模的抓取项目;基于twisted 框架异步处理请求,速度非常快,并发性较好性能较高;采取可读性更强的 xpath 代替正则;支持 shell 方式,方便独立调试写 middleware,方便写一些统一的过滤器;通过管道的方式存入数据库;它可以使用自动调节机制自动调整爬行速度;一些功能已经封装好了,减少了代码量(不用自己造轮子)。
缺点:无法用它完成分布式爬取;基于 twisted 框架,异步框架出错后不会停掉其他任务,数据出错后难以察觉;扩展性比较差,新手上手稍困难,深度定制困难。

2. scrapy 框架的组成模块有哪些?各个模块的功能?
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(下载中间件):可以当作是一个可以自定义扩展下载功能的组件,是更换代理 IP,更换 Cookies,更换 User-Agent,自动重试用于隐藏自己的地方;
Spider Middlewares(Spider中间件):可理解为是一个可以自定扩展和操作引擎和 Spiders 中间‘通信‘的功能组件(比如进入 Spiders 的 Responses; 和从 Spiders 出去的Requests)。

3. scrapy 框架的工作流程什么样的?
1、首先 Spiders 将需要发送请求的 url(requests) 经 ScrapyEngine 交给Scheduler。
2、Scheduler(排序,入队)处理后,经 ScrapyEngine,DownloaderMiddlewares (可选,主要有 User_Agent, Proxy 代理)交给 Downloader。
3、Downloader 向互联网发送请求,并接收下载响应(response)。(如果失败:这个 request 下载失败,然后引擎告诉调度器,这个 request 下载失败了,你记录一下,我们待会儿再下载。)将响应(response)经 ScrapyEngine,SpiderMiddlewares (可选)交给 Spiders。
4、Spiders 处理 response,提取数据并将数据经 ScrapyEngine交给 ItemPipeline 保存(可以是本地,可以是数据库)。提取 url 重新经 ScrapyEngine 交给 Scheduler 进行下一个循环,直到无 url 请求程序停止结束。

一些爬虫相关的面试问题:

1. scrapy 如何实现分布式爬取?
scrapy 不支持分布式,而 scrapy-redis 是一套基于 redis 数据库、运行在 scrapy 框架之上的组件,可以让scrapy 支持分布式策略,Slaver 端共享 Master 端 redis 数据库里的 item 队列、请求队列和请求指纹集合。
为什么选择 redis 数据库,因为 redis 支持主从同步,而且数据都是缓存在内存中的,所以基于 redis 的分布式爬虫,对请求和数据的高频读取效率非常高。

2. 爬虫使用多线程好?还是多进程好?为什么?
对于 IO 密集型代码(文件处理,网络爬虫),多线程能够有效提升效率(单线程下有 IO 操作会进行 IO 等待,会造成不必要的时间等待)。
对于 cpu 密集型(CPU Loading 很高)代码使用多进程。
但是在实际的采集过程中,应该既考虑网速和相应的问题,也需要考虑自身机器硬件的情况,来设置多进程或者多线程。

3. 实现模拟登录的方式有哪些?
1、直接使用一个已知的 cookie 访问(先用浏览器登录得到 cookie,再把 cookie 放在代码里);
2、模拟登陆后再携带得到的cookie进行访问(先向网站发出登录申请(提交用户名以及密码),然后从响应中获得 cookie,在访问其他页面时带上 cookie 就可以了);
3、在程序里调用一个浏览器来访问网站(需用 selenium 库实现)。

4. 什么是分布式爬虫?
什么是分布式?大致来说,就是需要计算的数据量太大,任务太多,一台机器搞不定或者效率极低,需要多台机器共同协作(而不是孤立地各做各的,所以需要通信),最后所有机器完成的任务汇总在一起,完成大量任务。

常用的是主从分布式爬虫(Master-Slave模型)。
所谓主从模式,就是由一台服务器充当 master,若干台服务器充当 slave,master 负责管理所有连接上来的 slave,包括管理 slave 连接、任务调度与分发、结果回收并汇总等;每个 slave 只需要从 master 那里领取任务并独自完成任务最后上传结果即可,期间不需要与其他 slave 进行交流。
这种方式简单易于管理,但是很明显 master 需要与所有 slave 进行交流,那么 master 的性能就成了制约整个系统的瓶颈,特别是当连接上的 slave 数量庞大的时候,很容易导致整个爬虫系统性能下降。

5. 负载均衡问题?
一台服务器性能上限了,需使用服务器集群来提升性能,集群中有一台服务器充当调度者接收所有用户请求,该调度者根据每台服务器的负载情况将请求分配给某台服务器处理。
在这个过程中,调度者如何合理的分配任务从而使得服务器集群的整体性能最优,就是负载均衡问题。

负载均衡的几种常见方式:
HTTP 重定向;DNS 域名解析;反向代理

6. 常见的反爬虫和应对方法?
1、通过 Headers 反爬虫
很多网站会对 Headers 的 User-Agent 进行检测,还有一些网站会对 Referer 进行检测。遇到这类反爬虫机制,可直接在爬虫中添加 Headers,将浏览器的 User-Agent 复制到爬虫的 Headers 中,或者将 Referer 修改为目标网站域名。
2、基于用户行为反爬虫
如检测同一 IP是否在短时间内多次访问同一页面,或者同一账户短时间内是否多次进行相同操作。
对于第一种情况,使用 IP 代理可以解决。可以写一个爬虫用来爬取网上公开的代理 IP,检测后全部保存起来。有了大量代理 IP 后可以每请求几次更换一个 IP。
对于第二种情况,可以在每次请求后随机间隔几秒再进行下一次请求。有些有逻辑漏洞的网站,可以通过请求几次,然后退出登录再重新登录,并继续请求来绕过同一账号短时间内无法多次进行相同请求的限制。
3、动态页面的反爬虫
上述的几种情况大多都是出现在静态页面,还有一部分网站,我们需要爬取的数据是通过 ajax 请求得到,或者通过 JavaScript 生成的。首先用 Fiddler 对网络请求进行分析。如果能够找到 ajax 请求,也能分析出具体的参数和响应的具体含义,就能采用上面的方法,直接利用 requests 或者 urllib2 模拟 ajax 请求,对响应的 json 进行分析得到需要的数据。
但是有些网站把 ajax 请求的参数全部加密了。根本没办法构造所需要的数据的请求。这种情况下需要用 selenium + phantomJS,调用浏览器内核,并利用 phantomJS 执行 js 来模拟人为操作以及触发页面中的 js 脚本。从填写表单到点击按钮再到滚动页面,全部都可以模拟,不考虑具体的请求和响应过程,只是完整的把人浏览页面获取数据的过程模拟一遍。
这套框架能突破大多反爬机制,因为其不是在伪装成浏览器来获取数据(通过添加 Headers 一定程度上就是为了伪装成浏览器),它本身就是浏览器,phantomJS 是一个无界面浏览器,只是操控这个浏览器的不是人而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值