简述scrapy五大核心组件及作用
(1)引擎:负责各个组件之间的通讯信号及数据的传递
(2)爬虫:定义了爬取行为和解析规则,提交item并传给管道
(3)调度器:接受引擎传递的request,并整理排列,然后进行请求的调度
(4)下载器:负责下载request,提交响应给引擎,引擎传递给spider
(5)管道:负责处理spider传递来的item,如去重、持久化存储等

Scrapy框架有哪些优点
(1)框架封装的组件丰富,适用于开发大规模的抓取项目
(2)框架基于Twisted异步框架,异步处理请求,更快捷,更高效
(3)拥有强大的社区支持,拥有丰富的插件来扩展其功能


如何判断scrapy管道类是否需要return item
在scrapy框架中,可以自定义多个管道类,以满足不同的数据持久化需求,当定义多管理类时,多个管道需传递item来进行存储,管道类各有自己的权重,
权重越小,我们认为越接近引擎,越先接受引擎传递来的item进行存储,故欲使权重大的管道能够接受到item,前一个管道必须returnitem,
如果一个管道类后无其他管道类,该管道则无需return item 简述pipeline的核心方法及各方法实现什么功能 (
1)From_crawler:它是一个类方法,用@classmethod装饰,用于获取项目的配置 (2)Open_spider:在爬虫开启时被调用,可在其中连接数据库 (3)process_item:在该方法中实现与数据库的交互,存储数据 (4)close_spider:在爬虫关闭时调用,可在其中关闭数据库连接 scrapy框架的工作流程: 首先Spider(爬虫)将需要发送请求的url(requests)经ScrapyEngine(引擎)交给Scheduer(调度器)。 Scheduler(排序,入队)处理后,经ScrapyEngine(引擎),DownloaderMiddlewares(下载器中间件,可选,主要有User_Agent,Proxy代理)
交给Downloader(下载器)。 Downloader(下载器)向互联网发送请求,并接受下载响应(response)。将响应(response)经ScrapyEngine(引擎),SpiderMiddlewares
(爬虫中间件,可选)交给Spiders(爬虫)。 Spiders(爬虫)处理response(响应界面),提取数据并将数据经ScrapyEngineScrapyEngine(引擎)交给ItemPipeline保存
(可以是本地,也可以是数据库)。提取url重新经ScrapyEngineScrapyEngine(引擎)交给Scheduler(调度器)进入下一个循环。直到无Url请求程序停止结束。
23.增量爬取 ①缓存 通过开启缓存,将每个请求缓存至本地,下次爬取时,scrapy会优先从本地缓存中获得response,这种模式下,再次请求已爬取的网页不用从网络中获得响应,
所以不受带宽影响,对服务器也不会造成额外的压力,但是无法获取网页变化的内容,速度也没有第二种方式快,而且缓存的文件会占用比较大的内存,
在setting.py的以下注释用于设置缓存。这种方式比较适合内存比较大的主机使用。 #HTTPCACHE_ENABLED
= True #HTTPCACHE_EXPIRATION_SECS = 0 #HTTPCACHE_DIR = 'httpcache' #HTTPCACHE_IGNORE_HTTP_CODES = [] #HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage' ②对item实现去重 两种方法判断mongodb中是否存在已有的数据,一是先查询后插入,二是先设置唯一索引或者主键再直接插入,由于mongodb的特点是插入块,查询慢,
所以这里直接插入,需要将唯一信息设置为”_id”列,或者设置为唯一索引,在mongodb中设置方法如下 ③对url实现去重 但是又会有一个问题,就是有可能下次开启时,种子url已经被爬取过了,爬虫会直接关闭,后来想到一个笨方法解决了这个问题,
即在pipeline.py里的open_spider方法中再爬虫开启时删除对种子url的缓存 爬取下来的数据如何去重,说一下scrapy的具体的算法依据。 通过 MD5 生成电子指纹来判断页面是否改变 nutch 去重。nutch 中 digest 是对采集的每一个网页内容的
32 位哈希值,如果两个网页内容完 全一样,它们的 digest 值肯定会一样。 数据量不大时,可以直接放在内存里面进行去重,python 可以使用 set()进行去重。当去重数据 需要持久化时可以使用 redis 的 set 数据结构。 当数据量再大一点时,可以用不同的加密算法先将长字符串压缩成 16/32/40 个字符,再使用 上面两种方法去重。 当数据量达到亿(甚至十亿、百亿)数量级时,内存有限,必须用“位”来去重,才能够满足需 求。Bloomfilter 就是将去重对象映射到几个内存“位”,
  通过几个位的
0/1 值来判断一个对象是 否已经存在。然而 Bloomfilter 运行在一台机器的内存上,不方便持久化(机器 down 掉就什么都没啦),
  也不方便分布式爬虫的统一去重。如果可以在 Redis 上申请内存进行Bloomfilter,以上两个问题就都能解 决了。 simhash 最牛逼的一点就是将一个文档,最后转换成一个
64 位的字节,暂且称之为特征字,然后判断重复只需要判断他们的特征字的距离是不是小于n
  (根据经验这个 n 一般取值为 3),就可以判断两个 文档是否相似。可见 scrapy_redis 是利用 set 数据结构来去重的,
  去重的对象是 request 的 fingerprint(其实 就是用 hashlib.sha1()对 request 对象的某些字段信息进行压缩)。
  其实 fp 就是 request 对象加密 压缩后的一个字符串(
40 个字符,0~f)。

 

posted on 2022-09-27 11:42  topass123  阅读(83)  评论(0编辑  收藏  举报