如何在Zyte Scrapy Cloud的Scrapy爬虫中访问CSV文件?
解决Zyte服务器部署后CSV文件找不到的问题
问题背景
本地环境中可正常读取CSV文件,但将Scrapy项目部署到Zyte服务器后,触发文件未找到错误。相关项目结构、爬虫代码及setup.py如下:
项目结构
account_history/ ├── account_history/ │ ├── spiders/ │ ├── __init__.py │ └── ... ├── data/ │ └── results.csv ├── scrapy.cfg ├── requirements.txt ├── scrapinghub.yml └── setup.py
爬虫读取文件代码片段
import scrapy import re import pandas as pd from urllib.parse import urljoin import os from scrapy_playwright.page import PageMethod class AddressesSpider(scrapy.Spider): name = "addresses" allowed_domains = ["www.domain.com"] def start_requests(self): current_dir = os.path.dirname(os.path.abspath(__file__)) chunk_size = 1000 csv_file = os.path.join(current_dir, '..', '..', 'data', 'results.csv')
原setup.py代码
# Automatically created by: shub deploy from setuptools import setup, find_packages setup( name = 'project', version = '1.0', packages = find_packages(), entry_points = {'scrapy': ['settings = account_history.settings']}, )
问题原因
部署到Zyte服务器时,setuptools的find_packages()默认仅打包account_history包内的代码文件,根目录下的data目录未被纳入部署包,导致服务器环境中不存在该文件,进而触发找不到文件的错误。
解决方案
方案1:将data目录移入包内并配置打包规则
- 调整项目结构:把
data目录移到account_history包内,结构变为:
account_history/ ├── account_history/ │ ├── spiders/ │ ├── data/ │ │ └── results.csv │ ├── __init__.py │ └── ... ├── scrapy.cfg ├── requirements.txt ├── scrapinghub.yml └── setup.py
- 修改爬虫文件路径:
csv_file = os.path.join(current_dir, '..', 'data', 'results.csv')
- 修改setup.py:添加
package_data配置确保CSV文件被打包:
from setuptools import setup, find_packages setup( name = 'project', version = '1.0', packages = find_packages(), entry_points = {'scrapy': ['settings = account_history.settings']}, package_data={ 'account_history': ['data/*.csv'] } )
方案2:保留原结构,通过data_files配置打包
若不想移动data目录,可修改setup.py添加data_files参数,将文件打包到服务器指定位置:
from setuptools import setup, find_packages setup( name = 'project', version = '1.0', packages = find_packages(), entry_points = {'scrapy': ['settings = account_history.settings']}, data_files=[('', ['data/results.csv'])] )
同时修改爬虫中的文件路径,从项目根目录读取:
# 获取项目根目录 project_root = os.path.dirname(os.path.abspath(os.path.join(__file__, '../../..'))) csv_file = os.path.join(project_root, 'data', 'results.csv')
方案3:使用Zyte文件存储功能
若CSV文件较大或需动态更新,可将文件上传至Zyte Data Storage,在爬虫中通过存储路径直接读取文件。
内容的提问来源于stack exchange,提问作者Yasir Iqbal
相关产品推荐
相关产品推荐

