You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于GitHub Actions在GitHub上测试Scrapy Spider Contracts

解决方案建议

方案一:使用Python内置HTTP服务器(最推荐)

直接用Python自带的http.server模块启动轻量服务器,完全不需要额外Docker镜像,和Python环境完美兼容,资源消耗极低,适配GitHub Actions场景。

操作步骤

  1. 将测试用HTML文件放在项目内指定目录,比如tests/test_html/
  2. 在GitHub Actions工作流中,先后台启动HTTP服务器,再执行Scrapy Contract测试
  3. 工作流配置示例:
name: Test Scrapy Contracts
on: [pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11' # 替换为你项目使用的Python版本
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install scrapy
          # 安装项目其他依赖
      - name: Start local HTTP server
        run: |
          python -m http.server 8000 --directory tests/test_html &
          # 短暂等待服务器启动完成
          sleep 2
      - name: Run Scrapy Spider Contracts
        run: |
          scrapy check <你的爬虫名称>

说明

  • python -m http.server 8000 --directory tests/test_html:指定测试HTML文件所在目录,在8000端口启动服务
  • 后台运行(&)配合sleep 2确保服务器就绪
  • 需将Scrapy爬虫中的请求地址改为http://127.0.0.1:8000/website.html

方案二:修改爬虫直接读取本地文件(适合无HTTP依赖的测试)

如果你的Spider Contracts不需要真实HTTP请求,可以调整爬虫代码,直接读取本地HTML文件生成Response对象,完全无需服务器:

爬虫代码示例

from scrapy.http import HtmlResponse

class MySpider(scrapy.Spider):
    name = 'myspider'

    def start_requests(self):
        # 本地测试模式下读取文件,生产环境走真实请求
        if self.settings.get('LOCAL_TEST'):
            with open('tests/test_html/website.html', 'r', encoding='utf-8') as f:
                html_content = f.read()
            response = HtmlResponse(
                url='http://example.com/website.html', # 仅用于Contract校验的占位URL
                body=html_content.encode('utf-8'),
                encoding='utf-8'
            )
            yield scrapy.Request(
                url='http://example.com/website.html',
                callback=self.parse,
                meta={'dont_filter': True}
            )
        else:
            # 生产环境真实请求逻辑
            yield scrapy.Request(url='https://real-website.com', callback=self.parse)

GitHub Actions配置

- name: Run Scrapy Spider Contracts
  run: |
    scrapy check <你的爬虫名称>
  env:
    LOCAL_TEST: true

这个方案零资源消耗,但需要调整爬虫代码,适合对HTTP协议细节无要求的测试场景。

方案三:同一工作流中同时使用Python和Docker(适配Apache依赖场景)

如果必须依赖Apache的特定行为(比如.htaccess规则、特定MIME类型),可以在同一个工作流中同时运行Python环境和Apache容器,通过Docker网络实现互通:

工作流配置示例

name: Test Scrapy Contracts
on: [pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Start Apache container
        run: |
          docker run -d \
            -p 8080:80 \
            -v ${{ github.workspace }}/tests/test_html:/usr/local/apache2/htdocs/ \
            httpd:2.4
          # 等待容器启动就绪
          sleep 3
      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install scrapy
      - name: Run Scrapy Spider Contracts
        run: |
          scrapy check <你的爬虫名称>
        env:
          TEST_URL: http://127.0.0.1:8080/website.html

说明

  • 通过docker run将本地测试HTML目录挂载到Apache的htdocs目录,映射8080端口
  • Python环境可通过127.0.0.1:8080访问Apache服务,解决你之前的环境二选一问题

总结推荐

优先选择方案一,轻量、无额外依赖、与Python环境无缝集成,完美解决资源消耗和环境冲突问题;若测试无需HTTP协议细节,方案二是零资源消耗的最优解。

内容的提问来源于stack exchange,提问作者sebap123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 09:02:33