Python学习第二十七天

news2025/4/4 0:41:43

yield关键字

        yield关键字扮演着核心角色,主要用于处理异步数据流和请求调度。

主要作用

  1. 生成器函数:将方法转换为生成器,可以逐步产生结果而不需要一次性返回所有数据

  2. 异步处理:支持Scrapy的异步架构,提高爬取效率

  3. 请求调度:用于发起新的请求或传递处理后的数据

使用场景

使用场景代码示例说明
发起新请求yield scrapy.Request(url, callback=self.parse_detail)用于生成新的请求,Scrapy 会自动调度并下载,完成后调用指定的回调函数。
返回提取的数据yield {"title": response.css("h1::text").get()}返回字典或 Item 对象,数据会进入 Item Pipeline 进行处理和存储。
处理分页yield response.follow(next_page, callback=self.parse)跟踪下一页链接,常用于分页爬取。
多个结果逐条返回python<br>for product in products:<br> yield {"name": product.css(...)}<br>在循环中逐个 yield 结果,避免内存占用过高,适合大量数据的情况。
结合请求和数据python<br>yield scrapy.Request(url1, callback=...)<br>yield {"data": ...}<br>同一个解析方法可以混合 yield 请求和数据,Scrapy 会分别处理。
委托生成器yield from self.parse_other(response)(Python 3.3+)将生成操作委托给另一个生成器函数,通常用于模块化代码。

为什么不使用return

  1. 内存效率:yield逐个返回结果,避免一次性加载所有数据到内存

  2. 异步支持:Scrapy的异步架构依赖生成器实现高效调度

  3. 灵活性:可以在一个方法中yield多个不同类型的对象(请求或数据)

  4. 管道处理:yield的Item会自动进入Item Pipeline进行处理

注意事项

  • yield的对象必须是RequestItemdictNone之一

  • 使用yield from可以委托给另一个生成器(在Python 3.3+)

  • 确保每个yield的对象都被正确处理,避免数据丢失

链接提取器

        官网概念:链接提取器是从响应中提取链接的对象。

导入

from scrapy.linkextractors import LinkExtractor

使用

import scrapy
import os
from ..items import TestprojectItem
from scrapy.linkextractors import LinkExtractor


# 项目测试
class TestSpider(scrapy.Spider):

    def __init__(self):
        self.linkExtractor = LinkExtractor()

    name = "test"
    # 或者直接卸载头部的strt_url中 一样的 为什么知道这个方法  查看父类的spider 集成了 所以使用子类会自动覆盖父类相同方法
    # 路劲注意 file:///是本地文件开头 如果是绝对路径自己直接写即可 如果是相对路径使用下面的即可
    def start_requests(self):
        # 获取当前目录的绝对路径
        current_dir = os.path.dirname(os.path.abspath(__file__))
        file_path = os.path.join(current_dir, 'test.html')
        # 替换反斜杠为正斜杠,并添加 file:/// 前缀
        file_url = 'file:///' + file_path.replace('\\', '/')

        yield scrapy.Request(url=file_url, callback=self.parse)

    def parse(self, response):
        # 链接提取器
        for link in self.linkExtractor.extract_links(response):
            print("testLink:",link)
            print("testLink 获取属性:",link.__getattribute__("url"))
        return item

Feed 导出

        官网概念:在实现scraper时,最经常需要的功能之一是能够正确地存储被抓取的数据,这通常意味着用被抓取的数据(通常称为“导出提要”)生成一个“导出文件”,供其他系统使用。

支持多种导出格式:

  • JSON (json)

  • JSON Lines (jsonlines)

  • CSV (csv)

  • XML (xml)

  • Pickle (pickle)

  • Marshal (marshal)

导入

 settings中设置

        

# 每2条记录保存一个文件分批导出测试
FEED_EXPORT_BATCH_ITEM_COUNT = 2

# 全局导出的编码格式
FEED_EXPORT_ENCODING = 'utf-8'
# 同时导出JSON和CSV
FEEDS = {
    'output/test_links_batch_%(batch_id)d.json': {
        'format': 'json',
        'encoding': 'utf8',
        'indent': 4,
        'fields': ['title', 'url'],   # 指定导出的字段
        'overwrite': True  # 覆盖已存在的文件
    },
    'output/test_links_batch_%(batch_id)d.csv': {
        'format': 'csv', # 格式
        'encoding': 'utf8', # 编码
        'fields': ['title', 'url'],  # 指定字段顺序
        'overwrite': True # 覆盖已存在的文件
    }
}

使用

# feed 导出测试
for link in response.css('a'):
  # yield 挨个处理任务
  yield {
    'url': link.attrib.get('href', '').strip(),
    'title': link.css('::text').get('').strip()
}

常用方法

        需要时查询即可,不用都练习、上面的能解决很多问题、分批次用的比较多吧。

基础配置参数

参数名类型默认值描述示例
FEED_URI字符串None导出文件的URI路径'file:///tmp/export.json'
FEED_FORMAT字符串None导出格式(json, jsonlines, csv, xml等)'json'
FEED_STORAGES字典内置存储自定义存储后端{'s3': 'myproject.storage.S3Storage'}
FEED_STORAGE_PARAMS字典{}存储后端的参数{'access_key': 'xxx', 'secret_key': 'xxx'}
FEED_EXPORTERS字典内置导出器自定义导出器{'myformat': 'myproject.exporters.MyExporter'}
FEED_EXPORT_FIELDS列表None指定导出的字段及顺序['title', 'price', 'url']
FEED_EXPORT_ENCODING字符串'utf-8'导出文件的编码'gbk'
FEED_EXPORT_INDENT整数0JSON导出的缩进(0表示紧凑格式)4

高级配置参数

参数名类型默认值描述示例
FEED_STORE_EMPTY布尔False是否存储空结果True
FEED_APPEND布尔False是否追加到现有文件True
FEED_OVERWRITE布尔True是否覆盖现有文件False
FEED_EXPORT_BATCH_ITEM_COUNT整数None分批导出时的每批数量1000
FEED_EXPORTER_PARAMS字典{}导出器的额外参数{'ensure_ascii': False}

存储后端特定参数

本地文件系统
参数名描述示例
file:// 前缀本地文件路径'file:///path/to/export.json'
FTP
参数名描述示例
ftp:// 前缀FTP服务器路径'ftp://user:pass@ftp.example.com/path/to/export.json'
FEED_STORAGE_FTP_ACTIVE使用主动模式True
S3
参数名描述示例
s3:// 前缀S3路径's3://bucket/path/to/export.json'
AWS_ACCESS_KEY_IDAWS访问密钥
AWS_SECRET_ACCESS_KEYAWS秘密密钥
FEED_STORAGE_S3_ACL设置ACL权限'private'

命令行参数

参数描述示例
-o FILE快捷导出文件-o items.json
-O FILE覆盖导出文件-O items.json
-t FORMAT指定导出格式-t csv

请求与响应

        官网概念:通常, Request 对象在spider中生成并在系统中传递,直到它们到达下载程序,下载程序执行请求并返回 Response 返回发出请求的spider的对象。在Scrapy中,scrapy.http.Requestscrapy.Request实际上是同一个类,但它们的导入方式不同。(功能完全相同且使用scrapy.request更常见,以下不用练习做个记录使用查询即可)

使用

from scrapy.http import Request

# 简单GET请求
request = Request(url='http://example.com')

# 带回调的请求
request = Request(
    url='http://example.com/products',
    callback=self.parse_products,
    meta={'page': 1},
    headers={'Referer': 'http://example.com'}
)

构造参数详解

参数类型默认值描述
urlstr必填请求的URL
callbackcallableNone响应处理函数
methodstr'GET'HTTP方法
headersdictNone请求头
bodybytes/strNone请求体
cookiesdict/listNoneCookies
metadictNone请求元数据
encodingstr'utf-8'编码
priorityint0优先级(0-1000)
dont_filterboolFalse是否跳过去重
errbackcallableNone错误处理函数
flagslistNone请求标志
cb_kwargsdictNone回调函数的额外参数

常用方法和属性

核心属性

属性类型描述示例
urlstr请求的URL'http://example.com'
methodstrHTTP方法(GET/POST等)'GET''POST'
headersdict请求头信息{'User-Agent': 'Mozilla'}
bodybytes请求体内容b'name=value'
metadict请求的元数据{'proxy': 'http://proxy:3128'}
cookiesdict/list请求的Cookies{'sessionid': '123abc'}
encodingstr请求的编码'utf-8'
priorityint请求优先级(0-1000)500
dont_filterbool是否不过滤重复请求True
callbackcallable响应回调函数self.parse_detail
errbackcallable错误回调函数self.error_handler
cb_kwargsdict回调函数的额外参数{'page': 2}

常用方法

方法描述示例
replace([url, method, headers, body, cookies, meta, encoding, callback, errback, cb_kwargs, dont_filter])创建并返回新Request对象(替换指定属性)new_request = request.replace(url=new_url)
copy()创建Request的浅拷贝req_copy = request.copy()
__str__()返回请求的字符串表示print(request)

特殊属性/方法

属性/方法描述示例
flags请求的标志列表request.flags.append('cached')
fingerprint请求的唯一指纹(用于去重)print(request.fingerprint)
_set_url(url)设置URL(内部方法)-
_set_body(body)设置请求体(内部方法)-

元数据(meta)常用键

meta键描述示例
dont_redirect禁止重定向meta={'dont_redirect': True}
handle_httpstatus_list处理非常规状态码meta={'handle_httpstatus_list': [404, 500]}
dont_retry禁止重试meta={'dont_retry': True}
download_timeout下载超时(秒)meta={'download_timeout': 60}
proxy使用代理meta={'proxy': 'http://proxy:3128'}
depth请求深度meta={'depth': 3}
item传递Item对象meta={'item': item}

代码路径:pythonPractice: python学习内容练习-代码

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

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

相关文章

pytorch中dataloader自定义数据集

前言 在深度学习中我们需要使用自己的数据集做训练&#xff0c;因此需要将自定义的数据和标签加载到pytorch里面的dataloader里&#xff0c;也就是自实现一个dataloader。 数据集处理 以花卉识别项目为例&#xff0c;我们分别做出图片的训练集和测试集&#xff0c;训练集的标…

SQL Server:触发器

在 SQL Server Management Studio (SSMS) 中查看数据库触发器的方法如下&#xff1a; 方法一&#xff1a;通过对象资源管理器 连接到 SQL Server 打开 SSMS&#xff0c;连接到目标数据库所在的服务器。 定位到数据库 在左侧的 对象资源管理器 中&#xff0c;展开目标数据库&a…

标题:利用 Rork 打造定制旅游计划应用程序:一步到位的指南

引言&#xff1a; 在数字化时代&#xff0c;旅游计划应用程序已经成为旅行者不可或缺的工具。但开发一个定制的旅游应用可能需要耗费大量时间与精力。好消息是&#xff0c;Rork 提供了一种快捷且智能的解决方案&#xff0c;让你能轻松实现创意。以下是使用 Rork 创建一个定制旅…

WebSocket原理详解(二)

WebSocket原理详解(一)-CSDN博客 目录 1.WebSocket协议的帧数据详解 1.1.帧结构 1.2.生成数据帧 2.WebSocket协议控制帧结构详解 2.1.关闭帧 2.2.ping帧 2.3.pong帧 3.WebSocket心跳机制 1.WebSocket协议的帧数据详解 1.1.帧结构 WebSocket客户端与服务器通信的最小单…

计算声音信号波形的谐波

计算声音信号波形的谐波 1、效果 2、定义 在振动分析中,谐波通常指的是信号中频率是基频整数倍的成分。基频是振动的主要频率,而谐波可能由机械系统中的非线性因素引起。 3、流程 1. 信号生成:生成或加载振动信号数据(模拟或实际数据)。 2. 预处理:预处理数据,如去噪…

RepoReporter 仿照`TortoiseSVN`项目监视器,能够同时支持SVN和Git仓库

RepoReporter 项目地址 RepoReporter 一个仓库监视器&#xff0c;仿照TortoiseSVN项目监视器&#xff0c;能够同时支持SVN和Git仓库。 工作和学习会用到很多的仓库&#xff0c;每天都要花费大量的时间在频繁切换文件夹来查看日志上。 Git 的 GUI 工具琳琅满目&#xff0c;Git…

UI设计系统:如何构建一套高效的设计规范?

UI设计系统&#xff1a;如何构建一套高效的设计规范&#xff1f; 1. 色彩系统的建立与应用 色彩系统是设计系统的基础之一&#xff0c;它不仅影响界面的整体美感&#xff0c;还对用户体验有着深远的影响。首先&#xff0c;设计师需要定义主色调、辅助色和强调色&#xff0c;并…

【计算机网络】记录一次校园网无法上网的解决方法

问题现象 环境&#xff1a;实训室教室内时间&#xff1a;近期突然出现 &#xff08;推测是学校在施工&#xff0c;部分设备可能出现问题&#xff09;症状&#xff1a; 连接校园网 SWXY-WIFI 后&#xff1a; 连接速度极慢偶发无 IP 分配&#xff08;DHCP 失败&#xff09;即使分…

第二十一章:Python-Plotly库实现数据动态可视化

Plotly是一个强大的Python可视化库&#xff0c;支持创建高质量的静态、动态和交互式图表。它特别擅长于绘制三维图形&#xff0c;能够直观地展示复杂的数据关系。本文将介绍如何使用Plotly库实现函数的二维和三维可视化&#xff0c;并提供一些优美的三维函数示例。资源绑定附上…

系统思考反馈

最近交付的都是一些持续性的项目&#xff0c;越来越感觉到&#xff0c;系统思考和第五项修炼不只是简单的一门课程&#xff0c;它们能真正融入到我们的日常工作和业务中&#xff0c;帮助我们用更清晰的思维方式解决复杂问题&#xff0c;推动团队协作&#xff0c;激发创新。 特…

【C++】vector常用方法总结

&#x1f4dd;前言&#xff1a; 在C中string常用方法总结中我们讲述了string的常见用法&#xff0c;vector中许多接口与string类似&#xff0c;作者水平有限&#xff0c;所以这篇文章我们主要通过读vector官方文档的方式来学习vector中一些较为常见的重要用法。 &#x1f3ac;个…

2025年数智化电商产业带发展研究报告260+份汇总解读|附PDF下载

原文链接&#xff1a;https://tecdat.cn/?p41286 在数字技术与实体经济深度融合的当下&#xff0c;数智化产业带正成为经济发展的关键引擎。 从云南鲜花产业带的直播热销到深圳3C数码的智能转型&#xff0c;数智化正重塑产业格局。2023年数字经济规模突破53.9万亿元&#xff…

Linux中常用服务器监测命令(性能测试监控服务器实用指令)

1.查看进程 ps -ef|grep 进程名以下指令需要先安装:sysstat,安装指令: yum install sysstat2.查看CPU使用情况(间隔1s打印一个,打印6次) sar -u 1 63.#查看内存使用(间隔1s打印一个,打印6次) sar -r 1 6

基于 GEE 的区域降水数据可视化:从数据处理到等值线绘制

目录 1 引言 2 代码功能概述 3 代码详细解析 3.1 几何对象处理与地图显示 3.2 加载 CHIRPS 降水数据 3.3 筛选不同时间段的降水数据 3.4 绘制降水时间序列图 3.5 计算并可视化短期和长期降水总量 3.6 绘制降水等值线图 4 总结 5 完整代码 6 运行结果 1 引言 在气象…

曲线拟合 | Matlab基于贝叶斯多项式的曲线拟合

效果一览 代码功能 代码功能简述 目标&#xff1a;实现贝叶斯多项式曲线拟合&#xff0c;动态展示随着数据点逐步增加&#xff0c;模型后验分布的更新过程。 核心步骤&#xff1a; 数据生成&#xff1a;在区间[0,1]生成带噪声的正弦曲线作为训练数据。 参数设置&#xff1a…

Qt6调试项目找不到Bluetooth Component蓝牙组件

错误如图所示 Failed to find required Qt component "Bluetooth" 解决方法&#xff1a;搜索打开Qt maintenance tool 工具 打开后&#xff0c;找到这个Qt Connectivity&#xff0c;勾选上就能解决该错误

JAVA- 锁机制介绍 进程锁

进程锁 基于文件的锁基于Socket的锁数据库锁分布式锁基于Redis的分布式锁基于ZooKeeper的分布式锁 实际工作中都是集群部署&#xff0c;通过负载均衡多台服务器工作&#xff0c;所以存在多个进程并发执行情况&#xff0c;而在每台服务器中又存在多个线程并发的情况&#xff0c;…

Java Spring Boot 与前端结合打造图书管理系统:技术剖析与实现

目录 运行展示引言系统整体架构后端技术实现后端代码文件前端代码文件1. 项目启动与配置2. 实体类设计3. 控制器设计4. 异常处理 前端技术实现1. 页面布局与样式2. 交互逻辑 系统功能亮点1. 分页功能2. 搜索与筛选功能3. 图书操作功能 总结 运行展示 引言 本文将详细剖析一个基…

深入剖析JavaScript多态:从原理到高性能实践

摘要 JavaScript多态作为面向对象编程的核心特性&#xff0c;在动态类型系统的支持下展现了独特的实现范式。本文深入解析多态的三大实现路径&#xff1a;参数多态、子类型多态与鸭子类型&#xff0c;详细揭示它们在动态类型系统中的理论基础与实践意义。结合V8引擎的优化机制…

GalTransl开源程序支持GPT-4/Claude/Deepseek/Sakura等大语言模型的Galgame自动化翻译解决方案

一、软件介绍 文末提供程序和源码下载 GalTransl是一套将数个基础功能上的微小创新与对GPT提示工程&#xff08;Prompt Engineering&#xff09;的深度利用相结合的Galgame自动化翻译工具&#xff0c;用于制作内嵌式翻译补丁。支持GPT-4/Claude/Deepseek/Sakura等大语言模型的…