记忆碎片之python爬虫scrapy框架settings.py参数

本文详细介绍了Scrapy爬虫的配置参数,包括并发请求、下载延迟、Cookies管理、User-Agent随机化、中间件及管道设置等关键内容,旨在帮助读者理解和优化爬虫性能。
# -*- coding: utf-8 -*-

# Scrapy settings for morekeywords project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
#     https://docs.scrapy.org/en/latest/topics/settings.html
#     https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#     https://docs.scrapy.org/en/latest/topics/spider-middleware.html
import os
import sys

sys.path.append(os.path.dirname(os.path.abspath(".")))  # 获取到路径  这个正确
# print(os.path.dirname(os.path.abspath(".")))    D:\django\dataAnalysis\morekeywords
# print(os.path.dirname(os.path.abspath(__file__)))     D:\django\dataAnalysis\morekeywords\morekeywords    这个错误No module named 'dataAnalysis'
# sys.path.append(r"D:\django\dataAnalysis\dataAnalysis")      # 获取到路径
os.environ["DJANGO_SETTINGS_MODULE"] = "dataAnalysis.settings"
import django

django.setup()  # 初始化Django 和Django交互的第一步,需要爬虫部署之后才能启动
# 配置完成之后当前无法启动爬虫ModuleNotFoundError: No module named 'dataAnalysis'
# ---------------------------------------------------------------------

BOT_NAME = 'morekeywords'

SPIDER_MODULES = ['morekeywords.spiders']
NEWSPIDER_MODULE = 'morekeywords.spiders'

# Crawl responsibly by identifying yourself (and your website) on the user-agent
# USER_AGENT = 'morekeywords (+http://www.yourdomain.com)'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

# Configure maximum concurrent requests performed by Scrapy (default: 16)
CONCURRENT_REQUESTS = 32  # 设置并发数量 Scrapy下载程序执行的并发(即同时)请求的最大数量。

# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs

# 下载器在从同一网站下载连续页面之前应等待的时间(以秒为单位)。
# 这可以用于限制爬行速度,以避免连续向服务器发起请求。支持小数
DOWNLOAD_DELAY = 3  # 设置延迟下载间隔,单位:秒

# The download delay setting will honor only one of:
# CONCURRENT_REQUESTS_PER_DOMAIN = 16
# CONCURRENT_REQUESTS_PER_IP = 16

# Disable cookies (enabled by default)
# 部分网站会通过用户的Cookie信息对用户进行识别与分析,
# 所以要防止目标网站使用Cookie识别我们的会话信息。
COOKIES_ENABLED = False  # 禁用cookies
FEED_EXPORT_ENCODING = "utf-8"  # 官网说这可以指定编码
# Disable Telnet Console (enabled by default)
# TELNETCONSOLE_ENABLED = False
# Telnet用于查看当前爬虫的信息,操作爬虫等...
# 使用telnet ip port ,然后通过命令操作
# TELNETCONSOLE_ENABLED = True
# TELNETCONSOLE_HOST = '127.0.0.1'
# TELNETCONSOLE_PORT = [6023,]

# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {
    'Connection': 'keep-alive',
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Origin': 'https://www.amazon.com',
    'Sec-Fetch-Site': 'same-site',
    'Sec-Fetch-Mode': 'cors',
    'Referer': 'https://www.amazon.com/ref=nav_logo?language=en_US',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
}
RANDOM_UA_TYPE = "chrome"  # 使用谷歌的浏览器ua头
# Enable or disable spider middlewares
# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
# SPIDER_MIDDLEWARES = {
#    'morekeywords.middlewares.MorekeywordsSpiderMiddleware': 543,
# }

# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
    # 'morekeywords.middlewares.MorekeywordsDownloaderMiddleware': 543,
    'morekeywords.middlewares.RandomUserAgentMiddlware': 542,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,  # 需要将原始的设置为none
}

# 自定义扩展,基于信号进行调用
# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html
# EXTENSIONS = {
#    'scrapy.extensions.telnet.TelnetConsole': None,
# }

# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
    # 'morekeywords.pipelines.MorekeywordsPipeline': 300,
    'morekeywords.pipelines.MysqlPipeline': 301,
}

# 访问URL去重
# DUPEFILTER_CLASS = 'morekeywords.duplication.RepeatUrl'

# Enable and configure the AutoThrottle extension (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/autothrottle.html
# AUTOTHROTTLE_ENABLED = True   # 开始自动限速
# The initial download delay
# AUTOTHROTTLE_START_DELAY = 5      # 初始下载延迟
# The maximum download delay to be set in case of high latencies
# AUTOTHROTTLE_MAX_DELAY = 60       # 最大下载延迟
# The average number of requests Scrapy should be sending in parallel to
# each remote server
# AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0     # 平均每秒并发数
# Enable showing throttling stats for every response received:
# AUTOTHROTTLE_DEBUG = False


"""
启用缓存
    目的用于将已经发送的请求或相应缓存下来,以便以后使用

    from scrapy.downloadermiddlewares.httpcache import HttpCacheMiddleware
    from scrapy.extensions.httpcache import DummyPolicy
    from scrapy.extensions.httpcache import FilesystemCacheStorage
"""

# Enable and configure HTTP caching (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
# HTTPCACHE_ENABLED = True      # 是否启用缓存策略
# HTTPCACHE_EXPIRATION_SECS = 0    # 缓存超时时间
# HTTPCACHE_DIR = 'httpcache'       # 缓存保存路径
# HTTPCACHE_IGNORE_HTTP_CODES = []      # 缓存忽略的Http状态码
# HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'      # 缓存存储的插件

<think>我们正在解决一个Scrapy框架中的导入错误问题:ModuleNotFoundError: No module named '爬虫scrapy框架1.spiders' 根据引用内容,我们可以总结出几种常见的解决方案: 1. 检查项目结构,确保导入路径正确。 2. 尝试使用相对导入或绝对导入的调整。 3. 检查爬虫名称和项目名称是否冲突(如果相同可能会出现问题)。 4. 在代码中动态添加路径(使用sys.path.append)以包含项目根目录。 5. 注意运行环境(命令行运行和IDE运行可能不同)。 具体到用户的问题,错误信息是:No module named '爬虫scrapy框架1.spiders' 这个错误通常发生在尝试导入模块时,Python解释器找不到指定的模块。 在Scrapy项目中,标准的项目结构如下: project_name/ scrapy.cfg project_name/ __init__.py items.py middlewares.py pipelines.py settings.py spiders/ __init__.py spider1.py ... 用户错误中提到的模块是'爬虫scrapy框架1.spiders',这看起来像是项目名称(爬虫scrapy框架1)下的spiders模块。 可能的原因和解决方案: 1. 导入语句错误:在爬虫文件中,我们通常从项目名称的包中导入items等模块。例如,如果项目名为“myproject”,则导入语句应为: from myproject.items import MyItem 但是,如果项目名称中包含空格、中文字符或者数字开头,可能会导致问题(尽管Python允许Unicode标识符,但在导入时可能会遇到麻烦)。因此,建议项目名称使用英文和下划线,避免空格和特殊字符。 2. 项目结构不正确:确保项目目录结构正确,并且每个目录下都有__init__.py文件(即使是空文件)以使其成为包。 3. 运行路径问题:确保在项目根目录(有scrapy.cfg的目录)运行命令,或者设置PYTHONPATH。 4. 动态添加路径:在爬虫文件的开头,可以添加以下代码来将项目根目录添加到Python路径中(如引用[2]所述): import sys sys.path.append('项目根目录的绝对路径') 5. 使用相对导入:在spiders目录下的爬虫文件中,可以使用相对导入来导入项目中的其他模块。例如,如果要从同一项目下的items.py导入,可以: from ..items import MyItem 但是,注意相对导入在作为主模块运行时可能会出现问题(比如直接运行爬虫文件而不是通过scrapy命令)。因此,通常建议通过scrapy命令运行,或者使用绝对导入(即从项目包开始)。 6. 项目名称和爬虫名称冲突:如果项目名称和爬虫名称相同,可能会导致混淆。尝试修改其中一个。 根据引用[3]中的例子,他们原先使用绝对导入`from items import FirstspiderItem`,然后改为相对导入`from ..items import FirstspiderItem`解决了问题。 因此,针对用户的具体错误,我们可以这样解决: 假设用户的项目结构为: 爬虫scrapy框架1/ scrapy.cfg 爬虫scrapy框架1/ __init__.py items.py middlewares.py pipelines.py settings.py spiders/ __init__.py myspider.py (在这个文件中,用户可能尝试导入项目模块) 在myspider.py中,导入项目下的items应该使用: from 爬虫scrapy框架1.items import MyItem # 绝对导入 但是,由于项目名称包含中文字符和空格(注意:在Python中,包名是目录名,但导入时不能有空格,所以目录名应该是没有空格的?实际上,目录名可以有空格,但在导入时,空格会被视为非法字符,因为导入语句中不能有空格。所以,强烈建议项目目录名使用英文和下划线,不要用中文和空格!) 因此,根本的解决方法是:重新创建项目,使用英文和下划线命名项目目录(例如:spider_project1)。这样在导入时就不会有特殊字符的问题。 如果用户不想重命名项目,那么可以尝试以下方法: 方法1:使用相对导入(在spiders目录下的爬虫文件中) from ..items import MyItem 方法2:动态添加路径(在爬虫文件的开头): import sys from os.path import dirname, abspath # 获取当前文件所在目录的父目录(即项目目录)的绝对路径 project_path = dirname(dirname(abspath(__file__))) sys.path.append(project_path) # 然后尝试导入 from 爬虫scrapy框架1.items import MyItem 但是,由于项目目录名中有空格,在导入时,空格会被转义吗?实际上,目录名中的空格在导入时应该用下划线代替?不,导入的模块名就是目录名,而目录名如果有空格,那么导入时也必须用空格?这是不可能的,因为Python标识符不能有空格。所以,实际上,在创建项目时,Scrapy会生成一个目录,这个目录名就是我们创建项目时输入的名字。如果我们输入的名字包含空格,那么目录名就会包含空格,但是我们在导入时,应该使用这个目录名(包含空格)吗?实际上,Python不允许在标识符中使用空格,所以导入会失败。 因此,强烈建议:项目目录名不要使用空格和中文,使用英文和下划线。 如果用户已经创建了这样的项目,那么最好的办法是重命名项目目录(将空格去掉,或者用下划线代替,同时避免中文)。例如,将“爬虫scrapy框架1”重命名为“spider_project1”。 具体步骤: 1. 关闭所有与项目相关的文件。 2. 将项目根目录(包含scrapy.cfg的目录)重命名为一个没有空格和中文的目录名(例如:spider_project1)。 3. 进入项目目录,修改内部的包目录(即原来的“爬虫scrapy框架1”目录)重命名为同样的名字(例如:spider_project1)。 4. 修改scrapy.cfg文件,将[settings]部分中的项目名称改为新的包名: [settings] default = spider_project1.settings 5. 修改所有导入语句,使用新的包名。 如果用户不想重命名,那么可以尝试使用相对导入(方法1)或动态路径(方法2),但存在风险。 根据引用[2]中的经验,在item前面加'..'(即相对导入)解决了问题。所以,我们也可以尝试在爬虫文件中使用相对导入。 总结解决方案: 方案一(推荐):重命名项目,使用英文和下划线,避免空格和中文。 方案二:在爬虫文件中使用相对导入,例如: from ..items import MyItem 方案三:在爬虫文件中动态添加项目根目录到Python路径,然后使用绝对导入(但要注意项目目录名中的空格和中文可能会导致问题)。 由于用户的项目名中包含空格和中文,这本身就违反了Python的包命名规范(虽然文件系统允许,但Python标识符不允许有空格,且中文字符虽然允许,但可能带来兼容性问题),所以推荐方案一。 如果用户暂时不想重命名,我们可以尝试方案二。 具体操作步骤(方案二): 1. 打开爬虫文件(位于spiders目录下的.py文件)。 2. 修改导入语句,将原来的绝对导入改为相对导入。例如,如果原来是: from 爬虫scrapy框架1.items import MyItem 改为: from ..items import MyItem 但是,注意:如果项目名称中包含空格,即使使用相对导入,内部包名还是包含空格,这仍然可能导致问题。所以,相对导入只能解决路径问题,不能解决包名包含空格的问题。 因此,我们再次强调:重命名项目目录(包括内部包目录)为合法标识符(仅包含字母、数字和下划线,且不以数字开头)是根本的解决方法。 如果用户坚持使用原项目名,那么我们可以尝试在导入时使用转义?不,Python不支持。 所以,最终建议:重命名项目。 重命名步骤示例: 1. 将项目根目录(包含scrapy.cfg的目录)从“爬虫scrapy框架1”重命名为“spider_project1”。 2. 进入项目根目录,将内部包目录(也叫“爬虫scrapy框架1”)重命名为“spider_project1”。 3. 修改scrapy.cfg文件: [settings] default = spider_project1.settings 4. 修改爬虫文件中的导入语句,例如: from spider_project1.items import MyItem 5. 同时,修改settings.py、middlewares.py等文件中可能存在的导入问题(如果它们之间有相互导入,也要相应修改)。 这样应该可以解决问题。 如果用户遇到其他问题,可以参考引用中的其他方法。 由于问题描述中没有给出具体的项目结构和代码,以上解决方案基于一般情况。</think>### Scrapy框架中解决`ModuleNotFoundError: No module named '爬虫scrapy框架1.spiders'`错误 #### 问题分析 该错误通常由以下原因导致: 1. **项目结构或导入路径错误**:Scrapy未正确识别项目目录结构。 2. **中文字符/空格问题**:项目名包含中文或空格导致Python导入失败(Python包名需遵循标识符规范)。 3. **运行环境问题**:命令行执行路径与IDE配置不一致。 --- #### 解决方案 ##### ✅ 方法1:重命名项目(推荐) **根本原因**:Python包名不支持中文或空格。`爬虫scrapy框架1`含中文字符,需重命名: ```bash # 进入项目根目录(含scrapy.cfg的目录) mv 爬虫scrapy框架1 spider_project # 重命名为英文 cd spider_project mv 爬虫scrapy框架1 spider_project # 重命名内部包目录 ``` 修改`scrapy.cfg`: ```ini [settings] default = spider_project.settings # 同步修改包名 ``` 更新导入语句(如`spiders/myspider.py`): ```python from spider_project.items import MyItem # 使用新包名 ``` ##### ✅ 方法2:动态添加项目路径 在爬虫文件顶部添加路径(临时方案): ```python import sys from pathlib import Path # 获取项目根目录 project_path = str(Path(__file__).parent.parent.parent) # 根据实际层级调整 sys.path.append(project_path) # 再尝试导入 from 爬虫scrapy框架1.items import MyItem # 需确保包名无空格 ``` ##### ✅ 方法3:使用相对导入 修改爬虫文件中的导入语句(适用于`spiders/`目录下的文件): ```python # 原绝对导入(易出错) # from 爬虫scrapy框架1.items import MyItem # 改为相对导入 from ..items import MyItem # ..表示上级目录 ``` ##### ✅ 方法4:检查爬虫启动位置 确保在**项目根目录**(含`scrapy.cfg`的目录)执行命令: ```bash # 正确位置 cd /path/to/project_root scrapy crawl myspider # 错误位置(如在spiders/目录内运行会报错) cd /path/to/project_root/爬虫scrapy框架1/spiders scrapy crawl myspider # 将触发ModuleNotFoundError ``` --- #### 预防措施 1. **项目命名规范**:使用英文、下划线命名(如`my_scrapy_project`)。 2. **统一运行环境**:在PyCharm中设置工作目录为项目根目录: `Run → Edit Configurations → Working Directory → 选择含scrapy.cfg的目录`。 3. **验证导入路径**:在Python Shell中测试导入: ```python import sys sys.path.append("/项目绝对路径") from 爬虫scrapy框架1.spiders import myspider # 测试是否成功 ``` --- #### 相关技术说明 - Scrapy通过项目结构自动注册模块,包名需符合Python标识符规则(仅字母、数字、下划线)[^1]。 - 相对导入(`from .. import module`)依赖包结构,需确保文件在正确层级[^2]。 - Windows路径需用原始字符串避免转义问题:`sys.path.append(r"C:\path")`[^2]。 > 若仍报错,请提供完整的项目结构树和错误堆栈,以便进一步诊断。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值