Scrapy 框架基础

news2025/1/10 18:15:43
  • 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.coloradmin.cn/o/1607076.html

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

相关文章

105.从前序遍历与中序遍历序列构造二叉树

力扣链接:105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode) 问题主体: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构…

Operating System Introduction

What is an Operating System? A program that acts as an intermediary between a user of a computer and the computer hardware 操作系统即用户与计算机硬件中的类似中介的程序 Operating system goals: Execute user programs and make solving user problems easier Mak…

代码随想录算法训练营DAY28|C++回溯算法Part.4|93.复原IP地址、78.子集、90.子集II

文章目录 93.复原IP地址思路确定非法的范围树形结构 伪代码 78.子集思路伪代码实现CPP代码 90.子集II思路CPP代码用used去重的办法用set去重的版本不使用used数组、set的版本 93.复原IP地址 力扣题目链接 文章讲解:93.复原IP地址 视频讲解:回溯算法如何分…

Hadoop数据压缩

Hadoop数据压缩 Hadoop 数据压缩是一种用于减少存储空间和网络传输成本的技术,通常应用于大数据处理场景。随着数据量的不断增长,对存储和网络带宽的需求也在增加,因此采用数据压缩技术可以有效地减少数据的存储和传输成本,提高数…

ERROR in [eslint] reorder to top import/first

情景再现:在react开发的时候,导入组件、函数时报错:Import in body of module; reorder to top import/first … 原因:在import语句前有变量声明 解决: 变量的声明,要放在import之后 // 错误示例 import {…

Transformer 代码详解(Pytorch版)

前言 基于上一篇经典网络架构学习-Transformer的学习,今天我们来使用pytorch 搭建自己的transformer模型,加深对transformer的理解,不仅在NLP领域绕不开transformer,而且在CV领域也是很火热,很多模型都用到了注意力机…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之三 简单人脸眼睛检测添加睫毛效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之三 简单人脸眼睛检测添加睫毛效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之三 简单人脸眼睛检测添加睫毛效果 一、简单介绍 二、简单人脸眼睛检测添加…

手机照片误删怎么恢复?别慌,教你轻松恢复!

如今数字化的时代,人们已经离不开手机,手机里珍藏的照片也成为了人与人之间的羁绊。然而有时候我们会因为手机故障或者操作失误,将手机照片误删。那么手机照片误删怎么恢复呢?三招教你找回误删的手机照片,有效实用且方…

激活函数:GELU(Gaussian Error Linear Units)

激活函数:GELU(Gaussian Error Linear Units) 前言相关介绍GELU(Gaussian Error Linear Units)代码示例 参考 前言 由于本人水平有限,难免出现错漏,敬请批评改正。更多精彩内容,可点…

LUA脚本判断是否为空

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Lua是一个小巧的脚…

linux 的Jdk1.8详细安装部署教程

一、环境准备 1.下载安装包 下载地址,这是1.8的你也可以选择安装别的版本的 https://www.oracle.com/java/technologies/downloads/#java8-windows 选择想要的系统和对应的位数,点击下载即可 2.上传安装包 选择自己要安装的路径,&#x…

分步搭建HF区块链网络

一.搭建网络规划 采用容器环境,搭建1个排序节点(Orderer)、2个对等节点(Peer),另外用 一个fabric-cli容器。实训中的绝大部分命令是通过该容器执行的。 容器名称设置 二. 配置HF网络证书 首先docker ps 检查镜像,确保镜像为空 1.生成crypto…

TDesign:腾讯的企业级前端框架,对标elementUI和ant-design

elementUI和ant-design在前端开发者中有了很高知名度了,组件和资源十分丰富了。本文介绍腾讯的一款B端框架:TDesign TDesign 是腾讯公司内部推出的企业级设计体系,旨在为腾讯旗下的各种产品提供一致、高效、优质的设计支持。这个设计体系是由…

今天给大家推荐36套404页面模板

404页面是网站必备的一个页面,它承载着用户体验与SEO优化的重任。当用户访问不存在的页面时,服务器会返回404错误代码,并显示404页面。一个好的404页面可以帮助用户快速找到所需信息,并提升网站的用户体验。 以下是一些演示下载资…

【每日一题】2007. 从双倍数组中还原原数组-2024.4.18

题目: 2007. 从双倍数组中还原原数组 一个整数数组 original 可以转变成一个 双倍 数组 changed ,转变方式为将 original 中每个元素 值乘以 2 加入数组中,然后将所有元素 随机打乱 。 给你一个数组 changed ,如果 change 是 双…

【ES】springboot集成ES

1. 去Spring官方文档确认版本兼容性 这一版的文档里没有给出springboot的版本对应,但我在一个博主的文章里看到的es8.0以前的官方文档中就有给出来,所以还需要再去寻找spring framework和springboot的对应关系??? 还…

Java项目 苍穹外卖 黑马程序员

目录 day1一、项目效果展示二、项目开发整体介绍三、项目介绍3.1 定位3.2 功能架构3.3 产品原型3.4 技术选型 四、开发环境搭建4.1 前端环境4.2 后端环境 五、导入接口文档六、Swagger6.1 介绍6.2 使用方式6.3 常用注解 day2一、新增员工二、员工分页查询三、启用禁用员工账号四…

深度解析:基于隐马尔科夫模型的语音转文字技术

引言 语音转文字(Speech-to-Text, STT)技术作为人机交互的重要一环,在智能助手、自动字幕生成、语音命令识别等领域发挥着越来越重要的作用。隐马尔科夫模型(Hidden Markov Model, HMM)作为一种统计模型,因其在处理时间序列数据方面的优势,被广泛应用于语音识别系统中。…

蓝牙耳机推荐高性价比2024,运用六大实战技巧,精准捕获超值机型

​无论是通勤路上、健身房里,还是在家中放松时,蓝牙耳机都是我们享受音乐、提升生活品质的好帮手。随着蓝牙耳机技术的快速发展,各种款式层出不穷,选择起来确实不易。作为一名耳机发烧友,我认为是时候向大家推荐几款质…

Springboot+Vue项目-基于Java+MySQL的房屋租赁系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…