爬虫入门五(Scrapy架构流程介绍、Scrapy目录结构、Scrapy爬取和解析、Settings相关配置、持久化方案)

news2025/1/13 13:37:28

文章目录

  • 一、Scrapy架构流程介绍
  • 二、Scrapy目录结构
  • 三、Scrapy爬取和解析
    • Scrapy的一些命令
    • css解析
    • xpath解析
  • 四、Settings相关配置提高爬取效率
    • 基础配置
    • 增加爬虫的爬取效率
  • 五、持久化方案

一、Scrapy架构流程介绍

Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架。因此Scrapy使用了一种非阻塞(又名异步)的代码来实现并发。整体架构大致如下:

在这里插入图片描述

官网链接:https://docs.scrapy.org/en/latest/topics/architecture.html

官方原文解释:
1.The data flow in Scrapy is controlled by the execution engine, and goes like this:
	The Engine gets the initial Requests to crawl from the Spider.
(引擎从Spider获取要爬行的初始请求。)
2.The Engine schedules the Requests in the Scheduler and asks for the next Requests to crawl.
(引擎在调度器中对请求进行调度,并要求对下一个请求进行爬取。)
3.The Scheduler returns the next Requests to the Engine.
(调度器将下一个请求返回给引擎。)
4.The Engine sends the Requests to the Downloader, passing through the Downloader Middlewares (see process_request()).
(引擎将请求发送给下载器,通过下载器中间件(请参阅process_request())。)
5.Once the page finishes downloading the Downloader generates a Response (with that page) and sends it to the Engine, passing through the Downloader Middlewares (see process_response()).
(一旦页面完成下载,Downloader就会生成一个响应(使用该页面)并将其发送给引擎,通过Downloader中间件传递(请参阅process_response())。)
6.The Engine receives the Response from the Downloader and sends it to the Spider for processing, passing through the Spider Middleware (see process_spider_input()).
(引擎从下载器接收响应,并通过Spider中间件将其发送给Spider进行处理(参见process_spider_input())。)
7.The Spider processes the Response and returns scraped items and new Requests (to follow) to the Engine, passing through the Spider Middleware (see process_spider_output()).
(Spider处理响应,并通过Spider Middleware(参见process_spider_output())将抓取的项和新的请求返回给引擎。)
8.The Engine sends processed items to Item Pipelines, then send processed Requests to the Scheduler and asks for possible next Requests to crawl.
(引擎将处理过的项目发送到项目管道,然后将处理过的请求发送到调度器,并请求抓取可能的下一个请求。)
9.The process repeats (from step 1) until there are no more requests from the Scheduler.
(该过程重复(从步骤1开始),直到没有来自Scheduler的更多请求。)
	'架构'
	爬虫:spiders(自己定义的,可以有很多),定义起始爬取的地址,解析规则
    引擎:engine ---》控制整个框架数据的流动,大总管
    调度器:scheduler---》要爬取的 requests对象,放在里面,排队,去重
    下载中间件:DownloaderMiddleware---》处理请求对象,处理响应对象,下载中间件,爬虫中间件
    下载器:Downloader ----》负责真正的下载,效率很高,基于twisted的高并发的模型之上
    爬虫中间件:spiderMiddleware----》处于engine和爬虫直接的(用的少)
    管道:piplines---》负责存储数据(管道,持久化,保存,文件,mysql)
	'-----------------'

引擎(EGINE)
	引擎负责控制系统所有组件之间的数据流,并在某些动作发生时触发事件。有关详细信息,请参见上面的数据流部分。

调度器(SCHEDULER)
	用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL的优先级队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址

下载器(DOWLOADER)
	用于下载网页内容, 并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的

爬虫(SPIDERS)--->在这里写代码
	SPIDERS是开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求

项目管道(ITEM PIPLINES)
	在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作

下载器中间件(Downloader Middlewares)
	位于Scrapy引擎和下载器之间,主要用来处理从EGINE传到DOWLOADER的请求request,已经从DOWNLOADER传到EGINE的响应response,
	你可用该中间件做以下几件事:设置请求头,设置cookie,使用代理,集成selenium

爬虫中间件(Spider Middlewares)
	位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入(即responses)和输出(即requests)

二、Scrapy目录结构

myfirstscrapy 			# 项目名
   myfirstscrapy            # 文件夹名字,核心代码,都在这里面
   	spiders            # 爬虫的文件,里面有所有的爬虫
       	__init__.py
       	baidu.py      # 百度爬虫 
       	cnblogs.py    #cnblogs爬虫
       items.py # 有很多模型类---》以后存储的数据,都做成模型类的对象,等同于django的models.py
       middlewares.py # 中间件:爬虫中间件,下载中间件都写在这里面
       pipelines.py   #项目管道---》以后写持久化,都在这里面写
       run.py         # 自己写的,运行爬虫
       settings.py    # 配置文件  django的配置文件
  scrapy.cfg          # 项目上线用的,不需要关注

-以后咱们如果写爬虫,写解析,就写 spiders 下的某个py文件   咱么写的最多的
-以后配置都写在settings 中
-以后想写中间件:middlewares
-以后想做持久化:pipelines,items

三、Scrapy爬取和解析

Scrapy的一些命令

	1 创建项目:scrapy startproject 项目名
	2 创建爬虫:scrapy genspider 爬虫名 爬取的地址
		scrapy gensipder cnblogs www.cnblogs.com
	3 运行爬虫
		运行cnblgos爬虫---》对首页进行爬取
	    scrapy crawl 爬虫名字
	    scrapy crawl cnblogs
	    
	    scrapy crawl cnblogs --nolog  不打印日志
	    
	    
	4 快速运行,不用命令
		项目根路径新建 run.py,写入如下代码,以后右键运行run.py 即可
	    from scrapy.cmdline import execute
		execute(['scrapy', 'crawl', 'cnblogs', '--nolog'])
	    
	    
	    
	5 解析数据---》提供了解析库--》css和xpath
		1 response对象有css方法和xpath方法
	        -css中写css选择器     response.css('')
	        -xpath中写xpath选择   response.xpath('')
	    2 重点1-xpath取文本内容
	        	'.//a[contains(@class,"link-title")]/text()'
	        -xpath取属性
	       	 	'.//a[contains(@class,"link-title")]/@href'
	        -css取文本
	        	'a.link-title::text'
	        -css取属性
	        	'img.image-scale::attr(src)'
	    3 重点2.extract_first()  取一个
	        .extract()        取所有

css解析

import scrapy
class CnblogsSpider(scrapy.Spider):
    name = "cnblogs"
    allowed_domains = ["www.cnblogs.com"]
    start_urls = ["https://www.cnblogs.com"]

    def parse(self, response):
        # response 就是爬取完后的对象
        # print(response.text)
        '使用css解析'
        article_list = response.css('article.post-item')
        for article in article_list:
            title = article.css('a.post-item-title::text').extract_first()
            # 取出所有后单独处理
            desc = article.css('p.post-item-summary::text').extract()
            real_desc = desc[0].replace('\n','').replace(' ','')
            if not real_desc:
                real_desc = desc[1].replace('\n', '').replace(' ', '')
            # print(title)
            # print(real_desc)
            # 作者名字
            author = article.css('footer.post-item-foot>a>span::text').extract_first()
            # print(author)
            # 头像
            image_url = article.css('img.avatar::attr(src)').extract_first()
            # print(image_url)
            # 发布日期
            data = article.css('span.post-meta-item>span::text').extract_first()
            # print(data)
            # 文章地址
            url = article.css('a.post-item-title::attr(href)').extract_first()
            print('''
                文章名:%s
                文章摘要:%s
                文章作者:%s
                作者头像:%s
                文章日期:%s
                文章地址:%s

            '''%(title,real_desc,author,image_url,data,url))

xpath解析

import scrapy
class CnblogsSpider(scrapy.Spider):
    name = "cnblogs"
    allowed_domains = ["www.cnblogs.com"]
    start_urls = ["https://www.cnblogs.com"]

    def parse(self, response):
	     '使用xpath解析'
	     article_list = response.xpath('//article[@class="post-itme"]')
	     for article in article_list:
	         title = article.xpath('.//a[@class="post-item-title"]/text()').extract_first()
	         # 取出所有后单独处理
	         desc = article.xpath('.//p[@class="post-item-summary"]/text()').extract()
	         real_desc = desc[0].replace('\n','').replace(' ','')
	         if not real_desc:
	             real_desc = desc[1].replace('\n', '').replace(' ', '')
	         # print(title)
	         # print(real_desc)
	         # 作者名字
	         author = article.xpath('.//footer.[@class="post-item-foot"]/a/span/text()').extract_first()
	         # print(author)
	         # 头像
	         image_url = article.xpath('.//img[@class="avatar"]/@src').extract_first()
	         # print(image_url)
	         # 发布日期
	         data = article.xpath('.//span[@class="post-meta-item"]/span/text()').extract_first()
	         # print(data)
	         # 文章地址
	         url = article.xpath('.//a[@class="post-item-title"]/@href').extract_first()
	         print('''
	             文章名:%s
	             文章摘要:%s
	             文章作者:%s
	             作者头像:%s
	             文章日期:%s
	             文章地址:%s
	         '''%(title,real_desc,author,image_url,data,url))

四、Settings相关配置提高爬取效率

基础配置

	1.是否遵循爬虫协议
	ROBOTSTXT_OBEY = False		# 正常来说你都来爬虫了 还遵循 ?
	2.LOG_LEVEL 日志级别
		LOG_LEVEL='ERROR'			# 可以查看具体信息 不会显示无效信息
	3.USER_AGENT					# 电脑UA版本信息
		user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
	4.默认请求头
		DEFAULT_REQUEST_HEADERS = {
		   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
		   'Accept-Language': 'en',
		}
	5.爬虫中间件
		SPIDER_MIDDLEWARES = {
		  'cnblogs.middlewares.CnblogsSpiderMiddleware': 543,
		}
	6.下载中间件
		DOWNLOADER_MIDDLEWARES = {
		    'cnblogs.middlewares.CnblogsDownloaderMiddleware': 543,
		}
	7.持久化配置
		ITEM_PIPELINES = {
		    'cnblogs.pipelines.CnblogsPipeline': 300,
		}
	8.爬虫项目名称
		BOT_NAME = 'myfirstscrapy'
	9.指定爬虫类的Py文件的位置
		SPIDER_MODULES = ['myfirstscrapy.spiders']
		NEWSPIDER_MODULE = 'myfirstscrapy.spiders'

增加爬虫的爬取效率

	1.增加并发量
		# 默认scrapy开启的并发线程为32个,可以适当进行增加。在settings配置文件中修改
		CONCURRENT_REQUESTS = 100
	2.降低日志级别
		# 在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为INFO或者ERROR即可。
		LOG_LEVEL = 'INFO'
	3.禁止Cookie
		# 如果不是真的需要cookie,则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率,提升爬取效率。
		COOKIES_ENABLED = False
	4.禁止重试
		# 对失败的HTTP进行重新请求(重试)会减慢爬取速度,因此可以禁止重试。
		RETRY_ENABLED = False
	5.减少下载超时
		# 如果对一个非常慢的链接进行爬取,减少下载超时可以能让卡住的链接快速被放弃,从而提升效率。
		DOWNLOAD_TIMEOUT = 10 	# 超时时间为10s

五、持久化方案

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1471045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

好书推荐丨细说Python编程:从入门到科学计算

文章目录 写在前面Python简介推荐图书内容简介编辑推荐作者简介 推荐理由粉丝福利写在最后 写在前面 本期博主给大家推荐一本Python基础入门的全新正版书籍,对Python、机器学习、人工智能感兴趣的小伙伴们快来看看吧~ Python简介 Python 是一种广泛使用的高级、解…

企微hook框架

https://wwm.lanzoum.com/ipUTp1ot1twh 密码:hvev 免费的企微框架 支持文本消息,图片消息,视频消息,文件消息。 其他可自行下载测试。 有兴趣可以进群交流。720192224 BOOL WxWorkSendData(string data) { WX_GETOBJDATA ob…

一键生成请求方法的工具 —— OpenAPI Typescript Codegen

文章目录 用法自定义请求参数的方法1)使用代码生成器提供的全局参数修改对象2)直接定义 axios 请求库的全局参数,比如:全局请求响应拦截器 报错解决 用法 首先下载axios npm install axios官网:https://github.com/f…

数字人的未来:数字人对话系统 Linly-Talker + 克隆语音 GPT-SoVITS

🚀数字人的未来:数字人对话系统 Linly-Talker 克隆语音 GPT-SoVITS https://github.com/Kedreamix/Linly-Talker 2023.12 更新 📆 用户可以上传任意图片进行对话 2024.01 更新 📆 令人兴奋的消息!我现在已经将强…

乡村研学|乡村研学小程序|基于微信小程序的乡村研学平台设计与实现(源码+数据库+文档)

乡村研学小程序目录 目录 基于微信小程序的乡村研学平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 (1)乡村研学管理 (2)商品信息管理 (3)商品类型管理 …

全网公开的大模型评测数据集整理

全网公开的大模型评测数据集整理。 开源大模型评测排行榜 https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard 其数据是由其后端lm-evaluation-harness平台提供。 数据集 英文测试 MMLU https://paperswithcode.com/dataset/mmlu MMLU(大规模多…

【力扣 - 有效的括号】

题目描述 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同…

AIGC实战——扩散模型(Diffusion Model)

AIGC实战——扩散模型 0. 前言1. 去噪扩散概率模型1.1 Flowers 数据集1.2 正向扩散过程1.3 重参数化技巧1.4 扩散规划1.5 逆向扩散过程 2. U-Net 去噪模型2.1 U-Net 架构2.2 正弦嵌入2.3 ResidualBlock2.4 DownBlocks 和 UpBlocks 3. 训练扩散模型4. 去噪扩散概率模型的采样5. …

项目实战:Qt监测操作系统cpu温度v1.1.0(支持windows、linux、国产麒麟系统)

若该文为原创文章,转载请注明出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/136277231 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

第三节:kafka sarama 遇到Bug?

文章目录 前言一、先上结果二、刨根问底总结 前言 前面两节,我们已经简单应用了sarama的两个类型Client和ClusterAdmin,其中有一个案例是获取集群的ControllerId,但是在后面的测试过程过程中,发现一个问题,返回的Cont…

锂电池SOC估计 | PyTorch实现基于Basisformer模型的锂电池SOC估计

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 PyTorch实现基于Basisformer模型的锂电池SOC估计 锂电池SOC估计,全新【Basisformer】时间序列预测 1.采用自适应监督自监督对比学习方法学习时序特征; 2.通过双向交叉注意力机制计算历史序列和…

Windows系统搭建Elasticsearch引擎结合内网穿透实现远程连接查询数据

文章目录 系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装 Cpolar4. 创建Elasticsearch公网访问地址5. 远程访问Elasticsearch6. 设置固定二级子域名 Elasticsearch是一个基于Lucene库的分布式搜索和分析引擎,它提供了一个分布式、多…

国漫年番成趋势?但只有这5部最值得看

自从《斗罗大陆》动画爆火之后,越来越多国漫都开始以年番形式播出,每周都能追自己喜欢的动画也是观众们所期待的。但其实年番对制作公司的要求很高,如果技术跟不上难免出现质量下滑的问题。今天就带大家盘点一下目前在播的最值得看的5部国漫年…

【LeetCode周赛】第 386 场周赛

目录 3046. 分割数组 简单3047. 求交集区域内的最大正方形面积 中等3048. 标记所有下标的最早秒数 I 中等 3046. 分割数组 简单 3046. 分割数组 分析: 查看数组内有没有重复超过2次的数即可。 代码: class Solution { public:bool isPossibleToSplit…

【GPTs分享】GPTs分享之Write For Me

Write For Me 是一个专门定制的GPT版本,旨在为用户提供高质量的文本内容创作服务。它适用于各种写作需求,从商业计划、学术文章到创意故事等。下面是从简介、主要功能、使用案例、优点和局限性几个方面对Write For Me 的详细介绍。 简介 Write For Me …

WPF 开发调试比较:Visual Studio 原生和Snoop调试控制台

文章目录 前言运行环境简单的WPF代码实现一个简单的ListBoxVisual Studio自带代码调试热重置功能测试实时可视化树查找窗口元素显示属性 Snoop调试使用Snoop简单使用调试控制台元素追踪结构树Visual/可视化结构树Logical/本地代码可视化树AutoMation/自动识别结构树 WPF元素控制…

统计学基础不强?参加六西格玛培训班提升学习效果

六西格玛培训是一种在管理学上非常重要的方法论和系统体系,它指导企业进行管理,并代表一种逻辑的、统计的和科学的思维方式。在许多企业中,如GE和霍尼韦尔,六西格玛培训已经成为企业发展战略的重要组成部分,并融入到企…

震惊!事业型男主竟徒手扳断月老搭的三条钢筋!

“月老,看看我啊” “月老我都27了,也帮帮我” 弹幕上满屏飘过“向月老求姻缘”的调侃,而动画里的男主李长寿却视而不见,一心埋头干事业。 自动画《师兄啊师兄》(以下简称“师兄”)第一季开播霸榜优酷多个…

NotePad2轻便够用的文本编辑器

下载方式: 360软件管家里就可以安装,非常的方便。 打开后,界面如下: 可以拖拽打开文本,和notepad的功能差不多,可以平行替代。

Linux之vim的使用详细解析

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录 一.vim简介 二.vim的基本概念 三.vim的基本操作 3.1准备 …