前言
Scrapy是爬虫必须学会的一个框架!一般人确实很难搞的透彻!不过他的功能方面确实特别好用。
scrapy
scrapy 是一个异步爬虫框架,使用它,可以屏蔽很多复杂的底层设计,只需要解析下载下来的页面,更多了我们需要关注的是目标网站/页面爬取的难易程度,该怎么来实现它。虽然是,但是在爬取大量网站可能需要 用分布式的爬虫,当然scrapy 也有
操作流程图
指定一个起始url后,scrapy就可以根据以上原理图进行工作了。一个最简单的页面,指定页面的url进行第一次请求,经过引擎,交给调度器,然后调度器再返回给引擎,去下载这个页面,拿到这个页面就可以进行解析了。 这里明显看的出来绕了一个圈子,如果最简单的的页面,这样子会发现多了调度这一步。但是一般在实际业务中,特别是分布式爬虫,会有很多url 需要爬取,而且一些url是动态添加到待爬队列的,
我们将所有的待爬都在调度器进行分配,当然这里也有其他操作,比如,一个url已经调度过,那么会进行标识,做到不再重复爬取。
队列
scrapy 默认的队列
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流程问题中下载和请求有什么区别
流程图
如果对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'
之后,才是才是请求呢。你不会用的时候,觉得很多地方不合理。你就觉得工具很烂,应该是你用的不好。
点赞,关注,收藏
作者:达Q的星
链接:https://www.jianshu.com/p/2aa24df4f624