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.mzph.cn/news/817392.shtml

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

相关文章

WPS二次开发系列:WPS SDk功能就概览

作者持续关注WPS二次开发专题系列,持续为大家带来更多有价值的WPS开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397) 作者通过深度测试使用了WPS SDK提供的Demo&#xff0…

ThreadX在STM32上的移植:通用启动文件tx_initialize_low_level.s

在嵌入式系统开发中,实时操作系统(RTOS)的选择对于系统性能和稳定性至关重要。ThreadX是一种广泛使用的RTOS,它以其小巧、快速和可靠而闻名。在本文中,我们将探讨如何将ThreadX移植到STM32微控制器上,特别是…

#381. 四边形继承练习

太爽了 甚至还现学了叉积判断线段是否相交和求面积的方法 先给出我的代码&#xff1a; #include <iostream> #include <vector> #include <iomanip> #include <cmath>using namespace std;//下面需要补充多个类的声明及实现代码 const double EPS 1…

创新营销利器:淘宝扭蛋机小程序开发全解析

在数字化浪潮的推动下&#xff0c;淘宝扭蛋机小程序的开发成为了一种全新的购物体验。它巧妙地将传统扭蛋机的乐趣与移动技术的便捷相结合&#xff0c;为用户带来了前所未有的惊喜与互动。 淘宝扭蛋机小程序的开发&#xff0c;不仅是一次技术的革新&#xff0c;更是一次购物方…

【基于HTML5的网页设计及应用】——事件代理.

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

gcn代码处理出现的问题

README 版本不一致 python 2.7 PYTHON 3.7 切换 TensorFlow系统的学习使用 数据集下载

每个人都可以做一个赚钱的社群

如何创建并运营一个赚钱的社群 一、引言 大家好&#xff0c;今天&#xff0c;我想和大家分享一下如何创建并运营一个赚钱的社群。我的分享目的是希望能够持续输出有价值的内容。 二、心态建设 1. 重要性&#xff1a;创业心态与平常心 在开始社群运营之前&#xff0c;我们需…

在线知识库如何从零开始搭建?这篇文章来教你!

引言&#xff1a; 有没有想过把那些零散在脑海中的点点滴滴整理起来&#xff0c;建立一个属于自己的在线知识库&#xff1f;无论是个人学习&#xff0c;团队协作&#xff0c;还是企业管理&#xff0c;一个良好的知识库都能帮我们更高效地存储和分享知识。如果你还在为“怎么建知…

持续上榜!赛宁网安多项能力入选《中国网络安全行业全景图》

4月12日&#xff0c;国内网安咨询机构安全牛正式发布《中国网络安全行业全景图》第十一版。赛宁网安凭借在网络安全领域前沿的技术创新优势、丰富的实践经验积累以及专业的综合安全服务&#xff0c;入选此次全景图安全支撑技术与体系的安全靶场领域、安全管理与运营的BAS领域和…

docker特殊问题处理3——docker-compose安装配置nacos

最近几年随着大数据和人工智能持续大热&#xff0c;容器化安装部署运维已经走进了各个中小公司&#xff0c;也得已让众多开发者能上手实际操作&#xff0c;不过说真心话&#xff0c;“万物皆可容器化”的理念越来越深入人心。 而如何使用docker-compose安装&#xff0c;配置&a…

Windows下安装GPU版Pytorch

升级Driver到最新版本 Windows搜索栏中输入设备管理器找到显示适配器一项&#xff0c;点击展开&#xff0c;你将看到你的NVIDIA显卡列在其中右键点击你的NVIDIA显卡&#xff0c;选择更新驱动软件…。在弹出的对话框中&#xff0c;选择自动搜索更新的驱动软件。之后&#xff0c…

html--烟花3

html <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Canvas烟花粒子</title> <meta name"keywords" content"canvas烟花"/> <meta name"description" content"can…

股票开户佣金最低多少?万一!A股开户多少钱合适?

开户佣金 通常情况下&#xff0c;股票开户佣金只要在达成交易的前提才收手续的费用&#xff0c;即买入和卖出的时候。目前&#xff0c;国规定收取最高佣金的比例为千分之三。 也就是说&#xff0c;最高为成交金额的3%&#xff0c;一般都会小于这个比例。最低交易佣金是5元起&a…

如何为不同内容主题选择最适合的移动滑轨屏方案?

在数字化信息时代背景下&#xff0c;多媒体互动装置作为当前内容展示的常用手段&#xff0c;颇受大众的喜爱&#xff0c;比如应用在展厅、商业推广、活动会议等领域的滑轨屏&#xff0c;便是其中一种新颖的互动展示装置&#xff0c;并且它还能根据不同的内容主题&#xff0c;来…

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024)

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024) 会议简介 2024年国际文化、历史、人文、艺术与社会发展会议&#xff08;CHHASD2024&#xff09;将在中国武汉举行&#xff0c;主题为“文化、历史&#xff0c;人文、艺术和社会发展”。CHHASD2024汇集了来自世界各…

基于springboot的综合成绩管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的综合成绩管理系统2拥有三个角色 管理员&#xff1a;学生管理、班主任管理、班级管理、综合测评管理等 学生&#xff1a;综合测评/德育成绩/课程成绩/体育成绩的登记 班…

STM32H7的DMA双缓冲控制IO输出脉冲

STM32H7的DMA双缓冲控制IO输出脉冲 keil的sct文件配置MPU配置初始化DMA双缓冲初始化TIM12用处触发DMAMUX的请求发生器 keil的sct文件配置 ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision ***…

kylin java.io.IOException: error=13, Permission denied

linux centos7.8 error13, Permission denied_linux open error13-CSDN博客 chmod -R 777 /home/zengwenfeng/kkFileView-4.2.1 2024-04-15 13:15:17.416 WARN 3400 --- [er-offprocmng-1] o.j.l.office.LocalOfficeProcessManager : An I/O error prevents us to determine…

ubuntu 20.04 更新显卡驱动

1. 问题描述 $ watch -n 1 nvidia-smi画面不动 而且运行 pytorch 代码时出现问题&#xff1a; UserWarning: CUDA initialization: The NVIDIA driver on your system is too old (found version 11070). Please update your GPU driver by downloading and installing a new…

活动预告|NineData 创始人CEO叶正盛将参加QCon全球软件开发大会,共话AI大模型技术在数据库DevOps的实践

4月13日下午&#xff0c;NineData创始人&CEO叶正盛即将参加InfoQ中国主办的『QCon全球软件开发大会北京站』的技术大会。在本次技术峰会上&#xff0c;叶正盛将以《AI大模型技术在数据库DevOps的实践》为主题&#xff0c;深入剖析AI大模型技术在数据库DevOps领域的最新进展…