Books

1、软件工程

Head First Design Patterns、大话设计模式、编程珠玑(第2版)、代码大全、人月神话、设计原本、Structure and Interpretation of Computer Programs、构建之法:现代软件工程.pdf、反模式:危机中软件、架构和项目的重构、敏捷开发(测试驱动开发、极限编程、Agile Software Development - Principles, Patterns and Practices、Refactoring - Improving the Design of Existing Code)、软件测试(版本控制之道 使用Git、版本控制之道 使用Subversion  第2版、版本控制之道使用cvs、单元测试之道Java版:使用JUnit、项目自动化之道、Junit_Recipes中文版、JUnit.in.Action中文版、xUnit Test Patterns - Refactoring Test Code)

2、数据分析

An Introduction to Statistical Learning、Introduction to Machine Learning (2nd Edition)、Mining of Massive Datasets、The Elements of Statistical Learning - Data Mining, Inference, and Prediction (2nd Edition)

3、面试

100题系列by_July、程序员面试宝典、剑指offer 名企面试官精讲典型编程题、十五个经典算法研究与总结、目录+索引

4、算法

Algorithm Design - Parallel and Sequential

5、编程语言

C++(Effective C++、Boost程序库完全开发指南)、Java(高质量Java编程实践v4、深入理解Java虚拟机:JVM高级特性与最佳实践(最新第二版)、Java 并发编程实战、Java Concurrency in Practice、Java编程思想 (第4版)、Java面试宝典、Thinking In Java 4th、Effective Java)、Scala(快学Scala、A Scala Tutorial for Java Programmers、Atomic Scala Sample_2nd Edition、Exploring Lift、lambda、Programming in Scala、Scala By Example)、Erlang(Erlang OTP并发编程实战-中文版、Erlang程序设计(第2版))

6、Docker

Docker技术入门与实战

7、Hadoop

Hadoop技术内幕 - 深入解析YARN架构设计与实现原理、Hadoop权威指南(中文版)(带书签)、Hadoop实战(第2版)

8、Spark

Spark大数据处理:技术、应用与性能优化(全)、Spark快速数据处理、OReilly.Learning.Spark.Lightning-Fast.Big.Data.Analysis

9、CMake

CMakeBook_SearchInside、mastering cmake

10、ElasticSearch

The LogStash Book - Turnbull, James

11、Git

Pro Git、Git from the bottom up

12、Linux

步入Linux、linux程序设计_英文第4版、Linux内核源代码情景分析、Linux与Unix Shell编程指南

13、LLVM

Getting Started with LLVM Core Libraries

14、Maven

Maven权威指南、Maven by Example、Maven - The Complete Reference、Maven实战

15、ML

DL(Deep Learning Yoshua Bengio)

16、Shell

Learning the Bash Shell (中文第二版)、Linux Command Line and Shell Scripting Bible (2nd Edition)、Linux Command Line and Shell Scripting Bible、Shell脚本学习指南、Shell脚本专家指南、莱昂氏UNIX源代码分析(三部曲)、实践大师:Unix Shell编程篇、实践大师:UNIXawk和sed编程篇、LINUX与UNIXShell编程指南、shell编程和unix命令、UNIX环境高级编程、UNIX教程网络篇、UNIX系统安全工具

17、MongoDB

MongoDB权威指南、MongoDB实战

18、TCP/IP Illustrated

TCP-IP详解卷1、TCP/IP Illustrated_Volume 1_The Protocols_2nd Edition、TCP/IP Illustrated_Volume 1_The Protocols_By W. Richard Stevens、TCP/IP Illustrated_Volume 2_The Implementation_By W. Richard Stevens、TCP/IP Illustrated_Volume 3_By W. Richard Stevens

19、The Architecture of Open Source Applications

The Architecture Of Open Source Applications

20、Web

跟我学Nginx+Lua开发、跟我学spring3(1-7)、跟我学spring3(8-13)、跟我学SpringMVC、spring杂谈[原创]

21、XML

XML教程、Visual Quickstart Guide XML (Second Edition)、XML高级编程、

内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
<think>我们分析用户的问题:在Scrapy管道和设置代码中,books文件夹未显示。用户提供了两个Pipeline类和一个设置项。 用户的问题可能是:在运行Scrapy爬虫后,期望将图片下载到`./books/`文件夹,但该文件夹没有生成或没有文件。 观察用户提供的代码: 1. `DdangPipeline`:负责将item写入到'book.json'文件。在open_spider时打开文件,process_item中写入item字符串,close_spider时关闭文件。 2. `DdangdownloadPipeline`:负责下载图片。在process_item中,从item中获取'src'和'name',拼接URL和文件名,然后使用urllib.request.urlretrieve下载图片到'./books/'目录下。 3. 在settings.py中,设置了两个管道,且`DdangdownloadPipeline`的优先级为301(在`DdangPipeline`之后执行)。 可能的问题原因: 1. 文件夹不存在:代码中直接使用`filename='./books/'+item.get('name')+'.jpg'`,如果`./books/`目录不存在,则下载会失败,但不会抛出异常(urllib.request.urlretrieve在目标目录不存在时会抛出FileNotFoundError)。 2. item中缺少必要的字段:在`DdangdownloadPipeline`中使用了`item.get('src')`和`item.get('name')`,如果这两个字段在item中不存在,那么获取到的就是None,拼接出的URL和文件名就会有问题。 3. 管道执行顺序:由于两个管道都返回了item,所以顺序没有问题,`DdangdownloadPipeline`会在`DdangPipeline`之后处理item。 4. 异常处理:如果下载过程中出现异常(如网络问题、URL不完整等),可能导致下载失败。 解决方案: 1. 确保`books`目录存在:在下载之前,先检查目录是否存在,如果不存在则创建。可以使用os.makedirs来创建目录。 2. 检查item中是否包含'src'和'name'字段:可以在下载之前添加判断,如果缺少字段则跳过或记录错误。 3. 添加异常处理:在下载时使用try-except来捕获异常,避免因为一个下载失败导致整个管道出错。 4. 日志记录:在关键步骤添加日志,便于调试。 修改`DdangdownloadPipeline`的代码,添加目录创建和异常处理: 首先,在管道中导入必要的模块: import os import urllib.request import logging 然后,修改`DdangdownloadPipeline`: 方法一:在`open_spider`方法中创建目录(这样只需要创建一次): def open_spider(self, spider): # 检查books目录是否存在,不存在则创建 if not os.path.exists('./books'): os.makedirs('./books') 方法二:在`process_item`中每次检查(效率稍低,但更安全): def process_item(self, item, spider): # 确保目录存在 if not os.path.exists('./books'): os.makedirs('./books') ... 后续下载代码 另外,建议在下载时检查字段是否存在: if not item.get('src') or not item.get('name'): logging.error("Item missing 'src' or 'name' field") return item 完整的修改后的`DdangdownloadPipeline`: ```python import os import urllib.request import logging class DdangdownloadPipeline: def open_spider(self, spider): # 创建books目录(如果不存在) if not os.path.exists('./books'): os.makedirs('./books') def process_item(self, item, spider): # 检查item中是否包含必要的字段 if 'src' not in item or 'name' not in item: logging.warning("Item missing 'src' or 'name' field, skipping download.") return item url = 'http:' + item['src'] # 文件名中可能包含特殊字符或路径分隔符,需要清理(这里简单处理,实际可能需要更严格的清洗) # 注意:文件名不能包含Windows/Linux的非法字符,这里用替换路径分隔符为例 filename = './books/' + item['name'].replace('/', '_') + '.jpg' try: urllib.request.urlretrieve(url, filename) logging.info(f"Downloaded {url} to {filename}") except Exception as e: logging.error(f"Download failed for {url}: {str(e)}") return item ``` 注意:在Windows系统中,文件名不能包含\/:*?"<>|等字符,所以最好对文件名进行清理。这里简单地将'/'替换为下划线,实际可能需要更全面的清理。 另外,在settings.py中确保启用了该管道,并且优先级设置正确(已经设置)。 如果问题仍然存在,可以检查: - 爬虫中是否确实产生了'src'和'name'字段。 - 图片URL是否完整(加上'http:'前缀后是否有效)。 - 是否有网络问题或网站反爬。 根据引用[3]和[4]中提到,有时候管道中的open_spider和close_spider方法可能不会被调用,但这里我们使用的是Scrapy内置的管道机制,只要在settings中正确配置了管道,并且爬虫正常启动和关闭,这些方法应该会被调用。不过,为了确保,我们可以使用Scrapy的信号机制(如引用[4]所示)来连接spider_opened和spider_closed事件,但这里我们只需要在管道中重写open_spider方法,并且用于创建目录,所以即使没有调用,我们在process_item中也会检查目录。 因此,我们选择在open_spider中创建目录,同时在process_item开始时也检查一次目录(双保险)。或者,如果担心open_spider没有被调用,可以只在process_item中检查目录。 这里我们选择在open_spider中创建,因为管道一旦启用,open_spider在爬虫启动时会被调用(除非爬虫启动过程被中断)。同时,在process_item中检查目录是否存在,如果不存在则创建,这样更健壮。 修改后的代码(在open_spider和process_item中都检查)可能重复,所以我们可以只在open_spider中创建,而在process_item中不检查。但是,如果多个爬虫共用同一个管道,且某些爬虫没有调用open_spider(虽然不太可能),那么目录可能不存在。所以,为了健壮性,我们在process_item中确保目录存在。 最终代码(在process_item中确保目录存在): ```python import os import urllib.request import logging class DdangdownloadPipeline: def process_item(self, item, spider): # 确保目录存在 if not os.path.exists('./books'): os.makedirs('./books') # 检查item中是否包含必要的字段 if 'src' not in item or 'name' not in item: logging.warning("Item missing 'src' or 'name' field, skipping download.") return item url = 'http:' + item['src'] # 清理文件名中的非法字符(这里只处理路径分隔符,实际可能需要更多处理) name = item['name'] # 替换可能引起路径问题的字符 for char in ['/', '\\', ':', '*', '?', '"', '<', '>', '|']: name = name.replace(char, '_') filename = os.path.join('./books', name + '.jpg') try: urllib.request.urlretrieve(url, filename) logging.info(f"Downloaded {url} to {filename}") except Exception as e: logging.error(f"Download failed for {url}: {str(e)}") return item ``` 注意:我们添加了文件名清理,避免因为文件名中的特殊字符导致文件创建失败。 此外,在settings.py中,确保ITEM_PIPELINES设置正确,并且该管道已被启用。 如果用户按照上述修改后,应该可以解决books文件夹未显示的问题。 最后,提醒用户:如果爬虫运行后仍然没有生成文件夹或文件,请检查日志输出,看是否有警告或错误信息(如字段缺失、下载失败等)。 </think> 针对Scrapy管道中`books`文件夹未显示的问题,结合您提供的代码和引用资料,以下是解决方案和详细分析: ### 问题原因分析 1. **目录未创建**:`DdangdownloadPipeline`直接尝试写入`./books/`目录,但未检查或创建该目录(引用[5]的`__init__`方法展示了正确做法)。 2. **信号方法未注册**:`open_spider/close_spider`方法未被Scrapy自动调用(引用[3][4]提到需通过信号注册)。 3. **路径处理风险**:文件名包含特殊字符可能导致写入失败(如`item.get('name')`含`/`等符号)。 ### 修复后的完整代码 ```python # pipelines.py import os import urllib.request from scrapy import signals import logging class DdangPipeline: def open_spider(self, spider): self.fp = open('book.json', 'w', encoding='utf-8') def process_item(self, item, spider): self.fp.write(str(item)) return item def close_spider(self, spider): self.fp.close() class DdangdownloadPipeline: @classmethod def from_crawler(cls, crawler): pipeline = cls() # 注册信号确保方法被调用(关键修复) crawler.signals.connect(pipeline.spider_opened, signal=signals.spider_opened) crawler.signals.connect(pipeline.spider_closed, signal=signals.spider_closed) return pipeline def spider_opened(self, spider): # 创建books目录(关键修复) os.makedirs('./books', exist_ok=True) logging.info("创建下载目录: ./books") def spider_closed(self, spider): logging.info("爬虫关闭,释放资源") def process_item(self, item, spider): url = 'http:' + item.get('src') # 文件名安全处理(防止特殊字符) name = item.get('name').replace('/', '_').replace('\\', '_') filename = f'./books/{name}.jpg' try: urllib.request.urlretrieve(url, filename) logging.info(f"下载成功: {filename}") except Exception as e: logging.error(f"下载失败 {url}: {str(e)}") return item ``` ### settings.py 关键设置 ```python ITEM_PIPELINES = { "ddang.pipelines.DdangPipeline": 300, "ddang.pipelines.DdangdownloadPipeline": 301, } ``` ### 修复要点说明 1. **目录自动创建**: - 在`spider_opened`中使用`os.makedirs('./books', exist_ok=True)`确保目录存在 - `exist_ok=True`参数避免目录已存在时报错(引用[5]的`__init__`类似逻辑) 2. **信号注册**(引用[4]): - 通过`from_crawler`注册`spider_opened/spider_closed`信号 - 解决原代码中关闭方法不执行的问题(引用[3]) 3. **文件名安全处理**: - 使用`.replace('/', '_')`移除路径分隔符 - 防止`item.get('name')`含`/`导致创建子目录而非文件 4. **错误日志**: - 添加下载异常的详细日志记录 - 使用`logging`模块替代`print`(引用[3]) ### 验证步骤 1. 运行爬虫后检查是否生成`books`目录 2. 查看日志确认信号方法调用: ``` [scrapy.core.engine] INFO: Spider opened [root] INFO: 创建下载目录: ./books # 出现此日志说明修复成功 ``` 3. 检查`books`文件夹内是否包含下载的图片文件 > **提示**:若需资源自动释放(如数据库连接),应在`spider_closed`实现(引用[2]),本例已预留接口[^1][^2][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值