Scrapy 框架基础

  • Scrapy框架基础
  • Scrapy框架进阶

Scrapy 框架基础

【一】框架介绍

【1】简介

  • Scrapy是一个用于网络爬取的快速高级框架,使用Python编写
  • 他不仅可以用于数据挖掘,还可以用于检测和自动化测试等任务

【2】框架

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

1

  • 引擎(ENGINE)
    • 核心组件
    • 负责调度和监控Scrapy的所有组件
  • 调度器(SCHEDULER)
    • 负责接收所有待爬取的请求,并决定这些请求的调度顺序和时间
    • 调度器会维持一个去重集合,避免对同一网页进行重复的爬取
  • 下载器(DOWNLOADER)
    • 下载器负责下载网络上的HTML页面,并将其转换为Scrapy可以处理的响应对象。
    • Scrapy的下载器建立在Twisted这个高效的异步模型上,因此可以高效的处理大量并发请求
  • 爬虫(SPIDERS)
    • 负责处理下载响应后的数据
    • 通过定义一系列的解析规则,从响应中提取出所需要的数据。
    • 同时,爬虫也会生成新的请求,并将其发送给调度器,以便进一步爬取相关联的页面
  • 项目管道(ITEM PIPELINES)
    • 负责处理爬虫提取出的数据
    • 对数据进行清洗、验证、去重等操作,并将数据存储到数据库或文件中
  • 爬虫中间件(MIDDLEWARE)
    • 允许开发者在爬虫的请求发起之前响应返回之后对数据进行定制化修改
    • 如:添加请求头、设置代理、处理cookie等
    • Scrapy提供了两种中间件:下载器中间件和爬虫中间件

【3】安装

  • Linux平台直接安装即可
pip install scrapy
  • windows安装

    • 直接安装,如果失败
    • 这是因为一些其他模块没有提前安装
    • 所以这里进行分步安装
  • windows安装步骤:

    • 安装依赖项:Archived: Python Extension Packages for Windows - Christoph Gohlke (uci.edu)

      • 安装wheel:Python分布工具,可以构建和安装wheel文件

        • pip install wheel
          
      • 安装lxml:解析XML和HTML的Python库

        • pip install lxml
          
      • 安装twisted:用于网络编程的的事件驱动框架

        • # 先直接安装试试,不行再指定版本
          pip install Twisted
          
        • pip install Twisted-版本号-python版本-python版本-系统.whl
          
    • 安装scrapy

      • pip install scrapy
        
    • 验证安装

      • scrapy version
        

【二】基本使用

【1】命令介绍

  • 官网:https://docs.scrapy.org/en/latest/topics/commands.html

  • 查看全部可用命令的帮助信息,或指定命令的详细信息

# 全部命令
scrapy -h
# 指定命令详细信息
scrapy 命令 -h
  • 全局命令不需要切换至项目文件夹
  • 项目命令需要切换至项目文件夹

(1)全局命令

  • startproject:创建一个新的Scrapy项目

  • genspider:创建一个新的爬虫程序

  • settings:显示一个Scrapy项目的配置信息

  • runspider:运行一个独立的Python文件作为爬虫,不需要创建项目

  • shell:进入Scrapy的交互式调试环境,可以检查选择器规则是否正确

  • fetch:单独请求一个界面,并获取响应结果

  • view:下载指定页面并在浏览器中打开,用于检查通过哪些请求获取数据

  • version:查看当前安装的Scrapy版本号

(2)项目命令

  • crawl:运行一个Scrapy 爬虫,必须在项目目录下并确保配置文件中的爬虫协议(ROBOTSTXT_OBEY)设置为False
  • check:检查项目中是否存在语法错误
  • list:列出项目中包含的所有爬虫名称
  • parse:使用回调函数解析给定的URL,用于验证回调函数是否正确
  • bench:用于对Scrapy进行压力测试

【2】创建并启动项目

(1)创建项目

  • 到指定文件下(即项目创建的位置)
cd 创建的位置
  • 创建项目
scrapy startproject 项目名
  • 进入创建的新项目
cd 项目名
  • 创建spider项目
scrapy genspider 自定义爬虫程序文件名 目标网址
  • 执行以上命令将得到如下目录文件

image-20240402225933503

(2)启动项目

  • 首先将爬虫协议(ROBOTSTXT_OBEY)改为False
    • 一般在URL后面添加/robots.txt就可以查看当前网址的爬虫协议
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
  • 定义日志等级
    • 低到高:DEBUGINFOWARNINGERRORCRITICAL
    • 默认是INFO,可以提高到ERROR,便于观察
# 日志等级
LOG_LEVEL = "ERROR"
  • 启动方式一:通过命令启动
    • 先在进入项目目录
    • 然后再启动
# 按照配置文件输出日志
scray crawl 自定义爬虫程序文件名
# 不输出日志文件
scray crawl 自定义爬虫程序文件名 --nolog
  • 启动方式二:通过PY文件启动
    • 在项目根目录下创建任意名称的py文件
    • 填写以下内容运行即可
from scrapy.cmdline import execute

# 按照配置文件输出日志
execute(['scrapy', 'crawl', '自定义爬虫文件名'])
# 不输入日志
execute(['scrapy', 'crawl', '自定义爬虫程序文件名', "--nolog"])

【三】获取数据

【1】CSS解析器

  • 官网:CSS 选择器参考手册 (w3school.com.cn)

  • CSS 选择器

选择器例子例子描述
.class.intro选择 class=“intro” 的所有元素。
.class1.class2.name1.name2选择 class 属性中同时有 name1 和 name2 的所有元素。
.class1 .class2.name1 .name2选择作为类名 name1 元素后代的所有类名 name2 元素。
#id#firstname选择 id=“firstname” 的元素。
**选择所有元素。
elementp选择所有

元素。

element.classp.intro选择 class=“intro” 的所有

元素。

element,elementdiv, p选择所有
元素和所有

元素。

element elementdiv p选择
元素内的所有

元素。

element>elementdiv > p选择父元素是
的所有

元素。

element+elementdiv + p选择紧跟
元素的首个

元素。

element1~element2p ~ ul选择前面有

元素的每个

  • 元素。

[attribute][target]选择带有 target 属性的所有元素。
[attribute=value][target=_blank]选择带有 target=“_blank” 属性的所有元素。
[attribute~=value][title~=flower]选择 title 属性包含单词 “flower” 的所有元素。
[attribute|=value][lang|=en]选择 lang 属性值以 “en” 开头的所有元素。
[attribute^=value]a[href^=“https”]选择其 src 属性值以 “https” 开头的每个 元素。
[attribute$=value]a[href$=“.pdf”]选择其 src 属性以 “.pdf” 结尾的所有 元素。
[attribute*=value]a[href*=“w3school”]选择其 href 属性值中包含 “abc” 子串的每个 元素。
:activea:active选择活动链接。
::afterp::after在每个

的内容之后插入内容。

::beforep::before在每个

的内容之前插入内容。

:checkedinput:checked选择每个被选中的 元素。
:defaultinput:default选择默认的 元素。
:disabledinput:disabled选择每个被禁用的 元素。
:emptyp:empty选择没有子元素的每个

元素(包括文本节点)。

:enabledinput:enabled选择每个启用的 元素。
:first-childp:first-child选择属于父元素的第一个子元素的每个

元素。

::first-letterp::first-letter选择每个

元素的首字母。

::first-linep::first-line选择每个

元素的首行。

:first-of-typep:first-of-type选择属于其父元素的首个

元素的每个

元素。

:focusinput:focus选择获得焦点的 input 元素。
:fullscreen:fullscreen选择处于全屏模式的元素。
:hovera:hover选择鼠标指针位于其上的链接。
:in-rangeinput:in-range选择其值在指定范围内的 input 元素。
:indeterminateinput:indeterminate选择处于不确定状态的 input 元素。
:invalidinput:invalid选择具有无效值的所有 input 元素。
:lang(language)p:lang(it)选择 lang 属性等于 “it”(意大利)的每个

元素。

:last-childp:last-child选择属于其父元素最后一个子元素每个

元素。

:last-of-typep:last-of-type选择属于其父元素的最后

元素的每个

元素。

:linka:link选择所有未访问过的链接。
:not(selector):not§选择非

元素的每个元素。

:nth-child(n)p:nth-child(2)选择属于其父元素的第二个子元素的每个

元素。

:nth-last-child(n)p:nth-last-child(2)同上,从最后一个子元素开始计数。
:nth-of-type(n)p:nth-of-type(2)选择属于其父元素第二个

元素的每个

元素。

:nth-last-of-type(n)p:nth-last-of-type(2)同上,但是从最后一个子元素开始计数。
:only-of-typep:only-of-type选择属于其父元素唯一的

元素的每个

元素。

:only-childp:only-child选择属于其父元素的唯一子元素的每个

元素。

:optionalinput:optional选择不带 “required” 属性的 input 元素。
:out-of-rangeinput:out-of-range选择值超出指定范围的 input 元素。
::placeholderinput::placeholder选择已规定 “placeholder” 属性的 input 元素。
:read-onlyinput:read-only选择已规定 “readonly” 属性的 input 元素。
:read-writeinput:read-write选择未规定 “readonly” 属性的 input 元素。
:requiredinput:required选择已规定 “required” 属性的 input 元素。
:root:root选择文档的根元素。
::selection::selection选择用户已选取的元素部分。
:target#news:target选择当前活动的 #news 元素。
:validinput:valid选择带有有效值的所有 input 元素。
:visiteda:visited选择所有已访问的链接。

【2】Xpath解析器

  • 见爬虫XPath文章
  • 同理支持链式操作

【3】获取数据

  • .extract()
    • 从选择器中提取匹配的所有元素
    • 无论是否有匹配到,返回的都是一个列表(空列表)
    • 列表内的元素都是字符串类型,标签也是字符串了
  • .extract_first()
    • 和.extract()类似
    • 等价于.extract()[0]
    • 但是没有匹配到元素将是None
# 列表
print(type(response.xpath('//div').extract()))
# 字符串
print(type(response.xpath('//div').extract()[-1]))

【四】配置文件

# 整个项目的名称
BOT_NAME = "scrapy_test"

# 爬虫文件存放位置
SPIDER_MODULES = ["scrapy_test.spiders"]
NEWSPIDER_MODULE = "scrapy_test.spiders"

# 日志等级
LOG_LEVEL = "ERROR"

# User-Agent设置
from fake_useragent import UserAgent
USER_AGENT = UserAgent().random

# 爬虫协议
ROBOTSTXT_OBEY = False

# 同时发送的最大并发请求数量,过高可能对目标服务器带来过大压力
CONCURRENT_REQUESTS = 16
# 发送连续请求之间的延迟时间(单位秒),减少目标服务器负载
DOWNLOAD_DELAY = 3
# 针对域名,同时发送最大并发请求数
CONCURRENT_REQUESTS_PER_DOMAIN = 16
# 针对IP,同时发送最大并发请求数
CONCURRENT_REQUESTS_PER_IP = 16

# 是否使用cookie,关闭可以减少cpu使用率
COOKIES_ENABLED = False

# 是否对失败的请求进行重新尝试
RETRY_ENABLED = False
    
# 默认下载超时时间
DOWNLOAD_TIMEOUT = 180    
# 默认请求头
DEFAULT_REQUEST_HEADERS = {
   "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
   "Accept-Language": "en",
}

# 爬虫中间件配置
SPIDER_MIDDLEWARES = {
   "scrapy_test.middlewares.ScrapyTestSpiderMiddleware": 543,
}

# 下载中间件配置
DOWNLOADER_MIDDLEWARES = {
   "scrapy_test.middlewares.ScrapyTestDownloaderMiddleware": 543,
# }

# 启用或禁用Scrapy扩展
EXTENSIONS = {
   "scrapy.extensions.telnet.TelnetConsole": None,
}

# 管道持久化配置
ITEM_PIPELINES = {
   "scrapy_test.pipelines.ScrapyTestPipeline": 300,
}
# 启用或禁用自动节流功能    
AUTOTHROTTLE_ENABLED = True
# 初始下载延迟,用于评估目标服务器的响应时间
AUTOTHROTTLE_START_DELAY = 5
# 最大下载延迟,单位秒
AUTOTHROTTLE_MAX_DELAY = 60
# 目标并发数,根据下载延迟进行调整,越接近1,会越严格遵守这个并发数
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# 是否启动节流功能日志
AUTOTHROTTLE_DEBUG = False
# 启用或禁用HTTP请求缓存功能
HTTPCACHE_ENABLED = True
# 缓存过期时间,0是永不过期
HTTPCACHE_EXPIRATION_SECS = 0
# 缓存数据存储的路径
HTTPCACHE_DIR = "httpcache"
# 一个不应被缓存的HTTp状态码列表
HTTPCACHE_IGNORE_HTTP_CODES = []
# 用于存储缓存的数据类
HTTPCACHE_STORAGE = "scrapy.extensions.httpcache.FilesystemCacheStorage"
# 请求指纹算法的实现版本。这用于生成请求的唯一标识符,用于缓存和其他目的。
REQUEST_FINGERPRINTER_IMPLEMENTATION = "2.7"
# 用于Scrapy的Twisted事件循环反应器的类。这可以影响Scrapy的异步性能和兼容性。
TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
# 导出数据时使用的字符编码。这通常用于控制导出文件的编码格式。
FEED_EXPORT_ENCODING = "utf-8"
# 是否启用Telnet控制台。Telnet控制台允许你通过telnet协议与正在运行的Scrapy爬虫进行交互,比如查看状态、暂停/恢复爬虫等。
TELNETCONSOLE_ENABLED = False

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

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

相关文章

YesPMP平台 | 活动有礼,现金奖励点击领取!

YesPMP众包平台在线发福利啦,活动火热开启,现金奖励等你来领,最高可领千元,赶快参与将奖励收入囊中,一起来了解活动细节吧! 一、活动内容: 活动一:【项目征集令】活动,…

二路归并排序的算法设计和复杂度分析(C语言)

目录 实验内容: 实验过程: 1.算法设计 2.程序清单 3.运行结果 4.算法复杂度分析 实验内容: 二路归并排序的算法设计和复杂度分析。 实验过程: 1.算法设计 二路归并排序算法,分为两个阶段,首先对待排…

Anaconda下的tensorflow安装

关于Anaconda的安装以及配置可以浏览我的上一篇博客Anaconda的安装与配置 下面是安装tensorflow的命令,使用下列指令安装前需要配置好CUDA,关于CUDA的配置在上一篇博客中有详细的步骤描述。 关于官方环境配置的要求可以浏览官网:https://t…

每帧纵享丝滑——ToDesk云电脑、网易云游戏、无影云评测分析及ComfyUI部署

目录 一、前言二、云电脑性能测评分析2.1、基本配置分析2.1.1、处理器方面2.1.2、显卡方面2.1.3、内存与存储方面2.1.4、软件功能方面 2.2、综合跑分评测 三、软件应用实测分析3.1、云电竞测评3.2、AIGC科研测评——ComfyUI部署3.2.1、下载与激活工作台3.2.2、加载模型与体验3.…

yolov8目标检测 部署瑞芯微rk3588记录

1. 前置条件 本地电脑系统,ubuntu20.04 训练代码: 训练代码下载的ultralytics官方代码 SHA:6a2fddfb46aea45dd26cb060157d22cf14cd8c64 训练代码仅做数据修改,类别修改,代码结构未做任何修改 需要准备的代码&#…

基于springboot+vue+Mysql的论坛管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

图深度学习(一):介绍与概念

目录 一、介绍 二、图的数据结构 三、图深度学习的基本模型 四、图深度学习的基本操作和概念 五、训练过程 六、主要应用场景 七、总结 一、介绍 图深度学习是将深度学习应用于图形数据结构的领域,它结合了图论的概念和深度学习的技术,用以处理和…

刷新认知,Python中循环结构可以这么简单?

应用场景 我们在写程序的时候,一定会遇到需要重复执行某条或某些指令的场景。例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向移动的指令。 在这个场景中,让机器人向…

大数据建模理论

文章目录 一、数仓概述1、数据仓库概念1.1 概述1.2 数据仓库与数据库的区别1.3 技术选型和架构 2、数仓常见名词2.1 实体2.2 维度2.3 度量2.4 粒度2.5 口径2.6 指标2.7 标签2.8 自然键/持久键/代理键2.9 退化维度2.10 下钻/上卷2.11 数据集市 3、数仓名词之间关系3.1 实体表&am…

这个项目我投了,给 OceanBase 数据库诊断提提速!

1. 前言 昨天晚上公司内部直播分享了一下OceanBase敏捷版诊断工具obdiag,主要的目的是拉齐一下前线和后端开发人员的诊断OceanBase问题的信息,众人拾柴火焰高,大家一起把obdiag做起来。晚上回去想了想,obdiag既然是开源项目&…

SiLM5350系列带米勒钳位的单通道隔离驱动器 助力汽车与工业应用实现稳定与高效的解决方案

带米勒钳位的隔离驱动SiLM5350系列 单通道 30V,10A 带米勒钳位的隔离驱动 具有驱动电流更大、传输延时更低、抗干扰能力更强、封装体积更小等优势, 为提高电源转换效率、安全性和可靠性提供理想之选。 SiLM5350系列产品描述: SiLM5350系列是单通道隔离驱…

[入门]测试原则-ApiHug准备-测试篇-002

🤗 ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 写在前面…

GT资源-CPLL QPLL

一、前言 QPLL与CPLL是两种为GT Channel提供时钟的锁相环,其中CPLL与GT Channel绑定,每一个通道都有一个CPLL,而QPLL是与Quad绑定,每一个Quad有一个QPLL,4个通道共享一个QPLL 二、CPLL 每个GTX/GTH收发器通道包含一…

luigi,一个超级厉害的 Python 库!

什么是 Python Luigi? Python Luigi 是一个用于构建复杂数据处理管道(工作流)的Python模块。Luigi由Spotify开发并维护,旨在简化和管理大规模数据处理任务的执行。 关键特点包括: 1.任务定义: Luigi允许…

TypeError: Cannot read properties of undefined (reading ‘tapAsync‘)

项目启动,一直报tabAsync未定义,整个项目中没有找到引用的地方; 最终重新安装webpack4版本 解决问题; npm install webpack4

【重回王座】ChatGPT发布最新模型gpt-4-turbo-2024-04-09

今天,新版GPT-4 Turbo再次在大型模型排行榜上荣登榜首,成功超越了此前领先的Claude 3 Opus。另外,新模型在处理长达64k的上下文时,性能竟能够与旧版在处理26k上下文时的表现相当。 目前GPT-4 Turbo仅限于ChatGPT Plus的用户&…

苍穹外卖项目总结1-12

苍穹外卖 文章标题地址苍穹外卖Day01——总结1https://lushimeng.blog.csdn.net/article/details/135466359苍穹外卖Day02——总结2https://lushimeng.blog.csdn.net/article/details/135484126苍穹外卖Day03——总结3https://lushimeng.blog.csdn.net/article/details/1363788…

PyTorch与深度学习:探索现代神经网络的魅力

在科技飞速发展的今天,深度学习作为人工智能领域的重要分支,已经在图像识别、自然语言处理、语音识别等多个领域取得了突破性的进展。而PyTorch,作为一款开源的深度学习框架,以其简洁易用、动态计算图等特性,赢得了广大…

修改百度百科的条件

百度百科,作为全球最大的中文百科全书,每天吸引着无数用户前来浏览和编辑。然而,要修改百度百科的内容,并非易事。本文将详细介绍修改百度百科的条件,帮助有志于参与编辑的用户更好地了解并做好准备。 1. 注册百度账号…

2024 计算机毕业设计之SpringBoot+Vue项目合集(源码+L文+PPT)

各位朋友大家好,有幸与屏幕前你们相识,博主现已经搬砖9年,趁着头发还充裕,希望给大家提供一些编程领域的帮助,深知计算机毕业生这个阶段的崩溃与闹心,让我们共同交流进步。 博主给大家列举了项目合集&#…
最新文章