爬虫入门五(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__.pybaidu.py      # 百度爬虫 cnblogs.py    #cnblogs爬虫items.py # 有很多模型类---》以后存储的数据,都做成模型类的对象,等同于django的models.pymiddlewares.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.com3 运行爬虫运行cnblgos爬虫---》对首页进行爬取scrapy crawl 爬虫名字scrapy crawl cnblogsscrapy crawl cnblogs --nolog  不打印日志4 快速运行,不用命令项目根路径新建 run.py,写入如下代码,以后右键运行run.py 即可from scrapy.cmdline import executeexecute(['scrapy', 'crawl', 'cnblogs', '--nolog'])5 解析数据---》提供了解析库--》css和xpath1 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.364.默认请求头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 = 1002.降低日志级别# 在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为INFO或者ERROR即可。LOG_LEVEL = 'INFO'3.禁止Cookie# 如果不是真的需要cookie,则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率,提升爬取效率。COOKIES_ENABLED = False4.禁止重试# 对失败的HTTP进行重新请求(重试)会减慢爬取速度,因此可以禁止重试。RETRY_ENABLED = False5.减少下载超时# 如果对一个非常慢的链接进行爬取,减少下载超时可以能让卡住的链接快速被放弃,从而提升效率。DOWNLOAD_TIMEOUT = 10 	# 超时时间为10s

五、持久化方案

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

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

相关文章

Kotlin:协程基础

点击查看:协程基础 中文文档 点击查看:协程基础 英文文档 第一个协程程序 import kotlinx.coroutines.*fun main(){GlobalScope.launch {delay(1000L)//delay 是一个特殊的 挂起函数 ,它不会造成线程阻塞,但是会 挂起 协程&…

机器学习:SVM算法(Python)

一、核函数 kernel_func.py import numpy as npdef linear():"""线性核函数:return:"""def _linear(x_i, x_j):return np.dot(x_i, x_j)return _lineardef poly(degree3, coef01.0):"""多项式核函数:param degree: 阶次:param …

纯国产轻量化数字孪生:智慧城市、智慧工厂、智慧校园、智慧社区。。。

AMRT 3D数字孪生引擎介绍 AMRT3D引擎是一款融合了眸瑞科技的AMRT格式与轻量化处理技术为基础,以降本增效为目标,支持多端发布的一站式纯国产自研的CS架构项目开发引擎。 引擎包括场景搭建、UI拼搭、零代码交互事件、光影特效组件、GIS/BIM组件、实时数据…

五、数组——Java基础篇

六、数组 1、数组元素的遍历 1.1数组的遍历:将数组内的元素展现出来 1、普通for遍历:根据下表获取数组内的元素 2、增强for遍历: for(数据元素类型 变量名:数组名){ 变量名:数组内的每一个值…

【vue+leaflet】vue使用leaflet.pm保存绘制后的图层的点位信息、图层回显、平面图切换、地图事件函数、图层事件函数说明(二)

看效果展示: 【vueleaflet】第二节效果展示视频 1.平面图切换,多个平面图切换展示 <div class"select"><span>平面图&#xff1a;</span><el-select v-model"pic" placeholder"全部" clearable filterable change"ini…

机器学习.线性回归

斯塔1和2是权重项&#xff0c;斯塔0是偏置项&#xff0c;在训练过程中为了使得训练结果更加精确而做的微调&#xff0c;不是一个大范围的因素&#xff0c;核心影响因素是权重项 为了完成矩阵的运算&#xff0c;在斯塔0后面乘x0&#xff0c;使得满足矩阵的转换&#xff0c;所以在…

编码后的字符串lua

-- 长字符串 local long_string "你好你好你好你好你好你好你好你好" local encoded_string "" for i 1, #long_string do local char_code string.byte (long_string, i) encoded_string encoded_string .. char_code .. "," end encoded_…

redis数据结构源码分析——压缩列表ziplist(I)

前面讲了跳表的源码分析&#xff0c;本篇我们来聊一聊另外一个重点结构——压缩列表 文章目录 存储结构字节数组结构节点结构 压缩编码zipEntryzlEntry ZIP_DECODE_PREVLENZIP_DECODE_LENGTH API解析ziplistNew(创建压缩列表)ziplistInsert(插入)ziplistDelete(删除)ziplistFi…

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

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

2024年漳州本地有正规等保测评机构吗?在哪里?

我们大家都知道&#xff0c;企业办理等保一定要找有资质的等保测评机构。因此不少漳州企业在问&#xff0c;2024年漳州本地有正规等保测评机构吗&#xff1f;在哪里&#xff1f;这里我们小编通过查找来为大家解答一下&#xff0c;仅供参考&#xff01; 目前福建漳州本地没有正规…

HTTP---------状态码

当服务端返回 HTTP 响应时&#xff0c;会带有一个状态码&#xff0c;用于表示特定的请求结果。比如 HTTP/1.1 200 OK&#xff0c;里面的 HTTP/1.1 表示协议版本&#xff0c;200 则是状态码&#xff0c;OK 则是对状态码的描述。 由协议版本、状态码、描述信息组成的行被称为起始…

北京硒鼓耗材回收价位,硒鼓回收价格,回收

联系我的时候请说是在百猫网看到的&#xff01; 硒鼓回收价格&#xff1a;最专业的硒鼓回收 顺达耗材回收 俗话说&#xff0c;顾客是最好的&#xff0c;良好的品牌效应是推动发展的关键之一。 北京顺达耗材回收有限公司为中小企业创造良好的二手消费市场&#xff0c;不断贯彻…

皓学IT:MySQL02

一、了解表 1.1.概述 表是处理数据和建立关系型数据库及应用程序的基本单元&#xff0c;是构成数据库的基本元素之一&#xff0c;是数据库中数据组织并储存的单元&#xff0c;所有的数据都能以表格的形式组织&#xff0c;目的是可读性强。 1.2.表结构简述 一个表中包括行和列…

Uncertainty-Aware Mean Teacher(UA-MT)

Uncertainty-Aware Mean Teacher 0 FQA:1 UA-MT1.1 Introduction:1.2 semi-supervised segmentation1.3 Uncertainty-Aware Mean Teacher Framework 参考&#xff1a; 0 FQA: Q1: 不确定感知是什么意思&#xff1f;不确定信息是啥&#xff1f;Q2&#xff1a;这篇文章的精妙的点…

Java面试——锁

​ 公平锁&#xff1a; 是指多个线程按照申请锁的顺序来获取锁&#xff0c;有点先来后到的意思。在并发环境中&#xff0c;每个线程在获取锁时会先查看此锁维护的队列&#xff0c;如果为空&#xff0c;或者当前线程是等待队列的第一个&#xff0c;就占有锁&#xff0c;否则就会…

idea 2018.3永久简单激活。激活码

1.打开hosts文件将 0.0.0.0 account.jetbrains.com 添加到文件末尾 C:\Windows\System32\drivers\etc\hosts 2.注册码&#xff1a; MNQ043JMTU-eyJsaWNlbnNlSWQiOiJNTlEwNDNKTVRVIiwibGljZW5zZWVOYW1lIjoiR1VPIEJJTiIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaW…

数据结构知识点总结-线性表(1)-线性表的定义、基本操作、顺序表表示

线性表 定义 线性表是具有相同数据类型的N&#xff08;N>0&#xff09;个元素的有限序列&#xff0c;其中N为表长&#xff0c;当N0时线性表是一张空表。 线性表的逻辑特征&#xff1a;每个非空的线性表都有一个表头元素和表尾元素&#xff0c;中间的每个元素有且仅有一个直…

有趣的CSS - 弹跳的圆

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是用css写一个好玩的不停弹跳变形的圆。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页…

亿道丨三防平板电脑厂家丨三防平板PDA丨三防工业平板:数字时代

在当今数字化时代&#xff0c;我们身边的世界变得越来越依赖于智能设备和无线连接。其中&#xff0c;三防平板PDA&#xff08;Personal Digital Assistant&#xff09;作为一种功能强大且耐用的数字工具&#xff0c;正在引领我们进入数字世界的全新征程。 三防平板PDA结合了平板…

LeetCode 0235.二叉搜索树的最近公共祖先:用搜索树性质(不遍历全部节点)

【LetMeFly】235.二叉搜索树的最近公共祖先&#xff1a;用搜索树性质&#xff08;不遍历全部节点&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/ 给定一个二叉搜索树, 找到该树中两个指定节点的最近公…