爱玛士关于爬虫的scrapy框架的心得

前言

Scrapy是爬虫必须学会的一个框架!通常人确实很难搞的透彻!不过他的功能方面确实特别好用。python

scrapy

scrapy 是一个异步爬虫框架,使用它,能够屏蔽不少复杂的底层设计,只须要解析下载下来的页面,更多了咱们须要关注的是目标网站/页面爬取的难易程度,该怎么来实现它。虽然是,可是在爬取大量网站可能须要 用分布式的爬虫,固然scrapy 也有web

操做流程图

指定一个起始url后,scrapy就能够根据以上原理图进行工做了。一个最简单的页面,指定页面的url进行第一次请求,通过引擎,交给调度器,而后调度器再返回给引擎,去下载这个页面,拿到这个页面就能够进行解析了。 这里明显看的出来绕了一个圈子,若是最简单的的页面,这样子会发现多了调度这一步。可是通常在实际业务中,特别是分布式爬虫,会有不少url 须要爬取,并且一些url是动态添加到待爬队列的,
咱们将全部的待爬都在调度器进行分配,固然这里也有其余操做,好比,一个url已经调度过,那么会进行标识,作到再也不重复爬取。面试

队列

scrapy 默认的队列redis

SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleLifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.LifoMemoryQueue'
SCHEDULER_PRIORITY_QUEUE = 'queuelib.PriorityQueue'

通常咱们不关心这个队列结构,可是在作分布式时这个队列就须要替换编程

scrapy_redis

scrapy 自己是异步,可是不支持分布式爬取。 要作到分布式爬取,那么须要一个公共的待爬队列网络

scrapy_redis 须要制定队列结构,可在 SpiderQueue,SpiderStack,
SpiderPriorityQueue 中选者一个,形如框架

SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"

scrapy注意事项

这里说一下scrapy的一个要注意的细节问题,对我的来讲,其实他的文档有些地方存在误导,固然我指的是中文文档,格式是标题加内容,区分经过数字。机器学习

scrapy流程问题中下载和请求有什么区别异步

 

流程图

流程图scrapy

 

若是对Python编程、网络爬虫、机器学习、数据挖掘、web开发、人工智能、面试经验交流。感兴趣能够519970686,群内会有不按期的发放免费的资料连接,这些资料都是从各个技术网站搜集、整理出来的,若是你有好的学习资料能够私聊发我,我会注明出处以后分享给你们。

spider经过engine产生Requests给Scheduler,以后经过Downloader产生Responses。这里有一个诡异的现象,好比咱们经过request这个库写一个爬去百度的爬虫

import request
page = request.get('http://www.baidu.com')

可能request拼错了

这样的一行命令,就已经实现了把百度的页面下载下来这个功能,那么请求和下载在这行代码体如今哪里?

每个请求的过程,就已经实现了下载,换句话说,请求就是下载。

那么,所谓scrapy的请求和下载是什么?
请求,就是url
下载,就是请求url或者说访问url

知道了这一点,不少东西均可以理解
好比,下载中间件这个东西
他是在parse函数前仍是后执行?确定是前啊,由于parse是下载
还有就是scrapy.Request在中间件以前仍是以后?按照文档说法,Request经过下载中间件到下载啊,应该是以前啊,但其实,scrapy.Request在中间件后面执行。由于它是下载里面的(请求就是下载)。

固然,若是上面你不相信的话,能够试一下换代理,中间件须要这样一句代码

request.meta['proxy'] = 'http://192.13.2.2:8888'

以后,才是才是请求呢。你不会用的时候,以为不少地方不合理。你就以为工具很烂,应该是你用的很差。

相关文章
相关标签/搜索