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

文章目录

  • 一、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

五、持久化方案

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+vue的音乐网站(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

【其他】简易代码项目记录

1. KeypointDetection 1.1. CharPointDetection 识别字符中的俩个关键点。 1.2. Facial-keypoints-detection 用于检测人脸的68个关键点示例。 1.3. Hourglass-facekeypoints 使用基于论文Hourglass 的模型实现人体关键点检测。 1.4. Realtime-Action-Recognition containing:…

15.4K Star,超强在线编辑器

Hi,骚年,我是大 G,公众号「GitHub指北」会推荐 GitHub 上有趣有用的项目,一分钟 get 一个优秀的开源项目,挖掘开源的价值,欢迎关注。 今天推荐一款非常棒的开源实时协作编辑器,可用于多人同时编…

复旦大学EMBA联合澎湃科技:共议科技迭代 创新破局

1月18日,由复旦大学管理学院、澎湃新闻、厦门市科学技术局联合主办,复旦大学EMBA项目、澎湃科技承办的“君子知道”复旦大学EMBA前沿论坛在厦门成功举办。此次论坛主题为“科技迭代 创新破局”,上海、厦门两地的政策研究专家、科学家、科创企…

JavaScript流程控制

文章目录 1. 顺序结构2. 分支结构2.1 if 语句2.2 if else 双分支语句2.3 if else if 多分支语句三元表达式 2.4 switch 语句switch 语句和 if else if语句区别 3. 循环结构3.1 for 循环断点调试 3.2 双重 for 循环3.3 while 循环3.4 do while 循环3.5 contiue break 关键字 4. …

3.WEB渗透测试-前置基础知识-快速搭建渗透环境(上)

上一个内容:2.WEB渗透测试-前置基础知识-web基础知识和操作系统-CSDN博客 1.安装虚拟机系统 linux Kali官网下载地址: https://www.kali.org/get-kali/#kali-bare-metal Centos官网下载地址: https://www.centos.org/download/ Deepin官网下…

Flask基础学习4

19-【实战】问答平台项目结构搭建_剪_哔哩哔哩_bilibili 参考如上大佬的视频教程&#xff0c;本博客仅当学习笔记&#xff0c;侵权请联系删除 问答发布的web前端页面实现 register.html {% extends base.html %}{% block head %}<link rel"stylesheet" href&q…

软件应用场景,物流货运配货单打印模板软件单据打印查询管理系统软件教程

软件应用场景&#xff0c;物流货运配货单打印模板软件单据打印查询管理系统软件教程 一、前言 以下软件以 佳易王物流快运单打印查询管理系统软件V17.1 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、打印模式可以分为 直打模式和套打模式 直打模…

在IDEA中创建vue hello-world项目

工作中最近在接触vue前端项目&#xff0c;记录一下从0搭建一个vue hello world项目的步骤 1、本地电脑安装配置node、npm D:\Project\vue\hello-world>node -v v14.21.3 D:\Project\vue\hello-world>npm -v 6.14.18 D:\Project\vue\hello-world> 2、设置npm国内淘…

2024最新前端面试题

一、css 浏览器渲染机制 定位margin 定位transform flex布局 二、js 数组是属于Object类型的&#xff0c;也就是引用类型&#xff0c;所以不能使用 typeof 来判断其具体类型。下面这些方法是判断数组的几种方法&#xff1a; 1、instanceof运算符 主要是判断某个实例&#xff08…

Movelt使用笔记-Movelt Setup Assistant

目录 Setup Assistant配置1 Start 加载urdf模型3 Virtual joints 虚拟关节5 Robot Poses 机器人位姿7 Passive Joints 被动关节8 Controllers 控制器9 Simulation 仿真10 3D Perception 3D感知11 Author Information 作者信息12 Configuration Files 配置文件启动MoveIt!Setup…

贪心算法学习

贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。贪心算法在有最优子结构的问题中尤为有效。然而&#xff0c;要注意的是贪心…

推荐莹莹API管理系统PHP源码

莹莹API管理系统PHP源码附带两套模板,PHP版本要求为5.6至8.0之间&#xff0c;已测试通过的版本为7.4。 需要安装PHPSG11加密扩展。 已测试&#xff1a;宝塔/主机亲测成功搭建&#xff01; 演示地 址 &#xff1a; runruncode.com/php/19698.html 安装说明&#xff08;适用于宝…

全网唯一基于共享内存的C++ RPC框架

首先声明&#xff1a;我不是标题党&#xff0c;我是在找遍全网&#xff0c;没有找到一个基于共享内存实现、开源且跨平台的C RPC框架之后&#xff0c;才着手开发的这个框架。 项目地址&#xff1a;https://github.com/winsoft666/veigar 1. Veigar Veigar一词来源于英雄联盟里…

数据库应用:Windows 部署 MySQL 8.0.36

目录 一、实验 1.环境 2.Windows 部署 MySQL 8.0.36 3.Windows配置环境变量 4.Navicat链接MySQL 二、问题 1.安装MySQL 报错 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机软件版本IP备注WindowsMySQL8.0.36localhost 2.Windows 部署 MySQL 8.0.…

【项目部署上线】宝塔部署前端Docker部署后端

【项目部署上线】宝塔部署前端&Docker部署后端 文章目录 【项目部署上线】宝塔部署前端&Docker部署后端1.安装依赖1.1 安装mysql1.2 安装Canal1.3 安装redis1.4 安装rabbitmq1.5 安装nacos 2. 部署前端3. 部署后端 1.安装依赖 1.1 安装mysql docker run -d -p 3306:3…

成功解决No module named ‘skimage‘(ModuleNotFoundError)

成功解决No module named ‘skimage’(ModuleNotFoundError) &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您…

模型 OIIC(目标、障碍、洞察、挑战)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_总纲目录。沟通方案工具。 1 OIIC(目标、障碍、洞察、挑战)模型的应用 1.1 OIIC 驱动的汽车配件渠道优化 一家知名的汽车配件制造商&#xff0c;旗下品牌拥有众多产品&#xff0c;其销售渠道广泛&#xff0c;不仅在…

Python算法题集_实现 Trie [前缀树]

Python算法题集_实现 Trie [前缀树] 题208&#xff1a;实现 Trie (前缀树)1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【定义数据类默认字典】2) 改进版一【初始化字典无额外类】3) 改进版二【字典保存结尾信息无额外类】 4. 最优算法5. 相关…

VirtualBox+Vagrant安装linux

一、VirtualBox安装 VirtualBox官网&#xff1a;Oracle VM VirtualBox 这里采用VirtualBox--7.0.0 版本 二、Vagrant安装 Vagrant官网&#xff1a;Vagrant by HashiCorp Vagrant镜像仓库&#xff1a;Discover Vagrant Boxes - Vagrant Cloud 这里采用Vagrant--2.4.1版本 在…