关于Scrapy框架的一些笔记

MongoDB与Redis

Redis和MongoDB,Redis一般称之为缓存、MongoDB一般称之为数据库。

Redis主要把数据存储在内存中,其“缓存”的性质远大于其“数据存储“的性质,其中数据的增删改查也只是像变量操作一样简单;

MongoDB却是一个“存储数据”的系统,增删改查可以添加很多条件,就像SQL数据库一样灵活

Splash与Selenium

Splash支持异步处理,同时可以获取多个爬取结果;Selenium中每个页面渲染下载是在Download Middleware里完成的,整个过程是阻塞式的
所以,Splash的爬取效率要高于Selenium

Spider

spider继承自scrapy.spiders.Spider。它是最基本的spider类,其他spider必须继承这个类

运行流程

  1. 以初始的URL初始化Request,并设置回调函数(默认使用parse)。当该Request成功请求并返回时,Response生成并作为参数传给该回调函数
  2. 在回调函数内分析返回的网页内容。返回结果有两种形式。一种是解析到有效结果返回字典或者Item对象,他们经过处理后保存。另一种是解析得到下一个链接(如下一页),可以利用此链接构造Request并设置新的回调函数,返回Request等待后续调度
  3. 如果返回的是字典或者Item对象,可以通过Feed Exports等组件将结果存入文件。如果设置了Pipline的话,可以使用Pipline的处理过程
  4. 如果返回的是Request,那么Request执行成功得到Response后,Response会被传递到Request中定义的回调函数,在回调函数中再次使用选择器来分析新得到的网页内容,并分析数据生成Item或字典

Item Pipeline

Item Pipeline是项目管道,他的调度发生在spider生成Item之后。当spider解析完Response后,Item就会传递到Item Pipeline,被定义的Item Pipeline会被依次执行,完成一系列的处理过程。

核心方法

  1. process_item(item,spider)
    必须要实现的方法,被定义的Item Pipline会默认调用这个方法对Item进行处理。
    如果返回的是Item对象,那么此Item会被优先级低的Item Pipline的process_item()方法处理,直到所有方法被调用完毕
    如果返回的是DropItem异常,那么此Item会被丢弃,不再进行处理
  2. open_spider(self,spider)
    在spider开启时被调用
  3. close_spider(spider)
    在spider关闭时调用
  4. from_crawler(cls,crawler)
    类方法,用@classmethod标识,是一种依赖注入的方式。通过crawler对象,可以拿到Scrapy的所有核心组件,如全局配置的信息,之后创建一个Pipeline实例。参数cls是class,最后返回class实例

当有多个Item Pipline时,可修改setting,设置优先级
ITEN_PIPELINES={
‘-----.pipelines.----’:300,
‘----.pipelines.----’:301,
}
数字越小,优先级越高

Image Pipeline

Scrapy提供了专门用来下载的Pipeline,包括文件和图片下载。原理与页面抓取相同,支持同步和异步。

  1. 首先定义存储路径,在settings.py中添加:IMAGES_STORE=’./images’,这样下载的图片会保存到本项目的images文件中。
  2. 内置的ImagesPipeline会默认读取Item的image_urls字段,并认为该字段是一个列表形式,它会遍历Item的image_urls字段,然后取出每个URL进行图片下载。
  3. 如果取出的图片链接不是image_urls字段存储,也不是列表形式,则需要重新定义。
  4. 重新定义需要继承自ImagesPipeline,并重写几个方法
 from scrapy import Requset
 from scrapy.exceptions import DropItem
 from scrapy.pipelines.images import ImagesPipeline
 class Image_DownloadPipeline(ImagesPipeline):
 	def file_path(self,request,response=None,info=None):
 		url = request.url
 		file_name = url.spilt('/')[-1]
 		return file_name
 	def item_completed(self,results,itme,info):
 		image_path = [x['path'] for ok ,x in results if ok]
 		if not image_path:
 			raise DropItem('Image Download Failed')
 		return item
 	def get_media_requests(self,item,info):
 		yield Request(item['url'])

get_media_requests()
第一个参数item是爬取生成的Item对象。取出其中的url字段,生成Request对象并加入到调度队列,等待被调度,执行下载
file_path()
该方法用来返回保存的文件名
item_completed()
当单个Item完成下载时调用此方法进行处理。results参数是该item对应的下载结果,它是一个列表形式,列表每一个元素是一个元组,其中包含了下载成功和失败的信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scrapy是一个纯Python实现的应用框架,用于爬取网站数据和提取结构化数据。它具有以下优势: 1. 简单易用:用户只需要定制开发几个模块,就可以轻松地实现一个爬虫,用于抓取网页内容和图片等。 2. 高效快捷:Scrapy使用了Twisted异步网络框架来处理网络通讯,加快网页下载速度。它还提供了各种中间件接口,能够灵活地满足各种需求。 Scrapy框架的运行和部署可以通过Scrapyd来管理。Scrapyd是一个用于管理Scrapy的部署和运行的服务程序。它通过发送请求来控制Scrapy项目的运行、停止、结束或删除等操作。同时,Scrapyd还可以管理多个爬虫,方便我们部署Scrapy并查看爬虫日志。 如果想在Django中运行Scrapy框架,可以参考一些示例代码。这些示例代码详细介绍了如何在Django中集成和运行Scrapy框架,对于学习和工作具有一定的参考价值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [scrapy爬虫框架及运行流程](https://blog.csdn.net/weixin_42213622/article/details/106138594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [笔记十五:如何使用scrapyd去部署和运行scrapy框架](https://blog.csdn.net/qq_41082423/article/details/82876939)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [如何在django中运行scrapy框架](https://download.csdn.net/download/weixin_38613548/12853073)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值