V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
xoxo419
V2EX  ›  问与答

使用 scrapy 对多个站点爬虫采集,每个站点都创建一个 scrapy 的项目,如果有部分代码或函数多个项目都是通用的时候。应该如何处理呢?

  •  
  •   xoxo419 · 23 天前 · 1285 次点击

    使用 scrapy 对多个站点,每个站点都创建一个 scrapy 的项目,如果有部分代码或函数多个项目都是通用的时候。应该如何处理呢?

    场景:每个 scrapy 对应着一个站点,站点是相同类型的。采集的是汽车类型的站点。那每个项目保存数据库的语句都是查不多的。那这些处理的数据和入库的代码基本是相同的。 目前是在采集入库会先对数据做一些处理后入库。

    方案 A: 做成第三方库。然后分别在每个项目中去引用。

    方案 B:在某一个项目做写一次后,通过脚本把代码复制到其他的项目中。

    还有什么更方便的处理方案吗

    9 条回复    2024-10-28 09:42:48 +08:00
    EndlessMemory
        1
    EndlessMemory  
       23 天前   ❤️ 1
    封装出来后调用啊
    xoxo419
        2
    xoxo419  
    OP
       23 天前
    @EndlessMemory #1

    封装的代码是写到哪个位置呢

    project_scrapy_A 这是 scrapy 项目的根目录

    project_scrapy_B

    project_common 这个是封装出来的代码 然后 A 和 B 来引用 这样吗
    xoxo419
        3
    xoxo419  
    OP
       23 天前
    clysto
        4
    clysto  
       23 天前
    @xoxo419 修改 PYTHONPATH 变量就可以访问到 common
    xoxo419
        5
    xoxo419  
    OP
       23 天前
    @clysto #4 但这样每部署一台服务器是不是就都需要修改下 PYTHONPATH 变量呢。
    现在用的一种方式基本可以实现但还是有一点不太好,就是每次要修改 setting.py 的路径
    本地开发的项目结构

    scrapy 项目 A

    |--project_scrapy_A

    |--|--project_scrapy_A

    |--|--|--setting.py

    scrapy 项目 B

    |--project_scrapy_B
    ....

    scrapy 项目中用到的公共代码函数和类等等

    |--Project_common

    |--init.py

    |--helper.py

    项目 A 使用公共项目的方式。

    project_scrapy_A/project_scrapy_A/setting.py

    import sys

    import os

    sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../..')))



    project_scrapy_A/project_scrapy_A/spider/demo.py

    from common.helpers import storage_response

    部署用的是 gerapy
    直接压缩 project_scrapy_a 上传是不行的。 需要把 Project_common 复制到 project_scrapy_a/目录下然后修改 setting.py 的路径 。这个步骤用命令去完成。 目前大致感觉就先只能这样处理了
    xyfan
        6
    xyfan  
       23 天前
    两种方案差不多吧,做成第三方库你也不会上传到 pip 等地方,还是要复制到新项目中使用
    walkeronway
        7
    walkeronway  
       23 天前
    单独拉个仓库放公共代码,推到 gitlab ,然后作为模块单独安装导入(pip install git+xxxx.git ,放到 requirements.txt 里面)?或者作为 git submodule 用?
    walkeronway
        8
    walkeronway  
       23 天前
    哦就是你的方案 A (没看全 orz )
    方案 B 不用考虑吧,更新一次公共代码不得所有站点的代码仓库都要改一轮....
    clysto
        9
    clysto  
       23 天前
    @xoxo419 PYTHONPATH="/path/to/common" python project_a_main.py 就可以,不需要写死在 setting.py 里,用环境变量好一点
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5386 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 07:21 · PVG 15:21 · LAX 23:21 · JFK 02:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.