Python中如何将Scrapy爬虫封装为Flask接口

##我想了想,没想出来,

#比如:

调用 flask-api 接收参数,参数有 name:张三,age:30,sex:男。

爬虫程序 scrapy 需要拼接这些参数去完成 url 请求,返回 json,或者入库

思考下:

1.flask 怎么传递这些参数给 scrapy,scrapy 又怎么被 flask 所运行。 2.项目部署该怎么部署,是部署 flask-api 还是部署 scrapy ? 3.flask 和 scrapy 如何交互 4.有没有什么好的办法,把 scrapy 爬虫变成一个 api 接口,方便调用的那种

各位大佬,尽情的发表意见,小弟在线等

                                            	--来自 python 小白的呐喊


Python中如何将Scrapy爬虫封装为Flask接口

7 回复

用 redis 或者数据库呗


这个需求很常见,把Scrapy爬虫做成Flask API能让爬虫服务化。我直接给你个完整的方案:

# app.py
from flask import Flask, request, jsonify
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
import threading
import queue
import json

app = Flask(__name__)
result_queue = queue.Queue()

class JsonWriterPipeline:
    def __init__(self):
        self.items = []
    
    def process_item(self, item, spider):
        self.items.append(dict(item))
        return item

class MySpider(scrapy.Spider):
    name = 'api_spider'
    
    def __init__(self, url=None, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.start_urls = [url] if url else []
        self.pipeline = JsonWriterPipeline()
    
    def parse(self, response):
        # 这里写你的解析逻辑
        item = {
            'url': response.url,
            'title': response.css('title::text').get(),
            'content': response.text[:200]  # 示例:取前200字符
        }
        self.pipeline.process_item(item, self)
        return item
    
    def closed(self, reason):
        result_queue.put(self.pipeline.items)

def run_spider(url):
    settings = get_project_settings()
    settings.update({
        'ITEM_PIPELINES': {
            '__main__.JsonWriterPipeline': 1,
        },
        'LOG_ENABLED': False,
    })
    
    process = CrawlerProcess(settings)
    process.crawl(MySpider, url=url)
    process.start()

@app.route('/crawl', methods=['POST'])
def crawl():
    data = request.json
    if not data or 'url' not in data:
        return jsonify({'error': 'Missing url parameter'}), 400
    
    # 在新线程中运行爬虫
    spider_thread = threading.Thread(
        target=run_spider, 
        args=(data['url'],)
    )
    spider_thread.start()
    spider_thread.join()
    
    # 获取结果
    try:
        results = result_queue.get(timeout=30)
        return jsonify({'data': results})
    except queue.Empty:
        return jsonify({'error': 'Crawl timeout'}), 500

if __name__ == '__main__':
    app.run(debug=True)

关键点:

  1. CrawlerProcess在Flask中启动Scrapy
  2. 自定义Pipeline收集数据并通过队列传递
  3. 用线程隔离爬虫运行,避免阻塞Flask
  4. API接收JSON格式的URL参数

运行方式:

pip install scrapy flask
python app.py

然后POST请求:

curl -X POST http://127.0.0.1:5000/crawl \
  -H "Content-Type: application/json" \
  -d '{"url": "http://example.com"}'

注意实际使用时需要根据你的爬虫逻辑修改MySpider.parse()方法。如果已有Scrapy项目,可以直接导入现有的Spider类。

简单说就是线程跑爬虫+队列传数据。

Scrapyd 了解下 剩下的就是调接口

关键词: scrapyd python-scrapyd-api

可以参考一下(这个)[https://medium.com/@ali_oguzhan/how-to-use-scrapy-with-django-application-c16fabd0e62e]

flask 把 url 存进一个 json 文件,然后用 scrapy.crawl 的 CrawlRunner 调爬虫,爬虫通过读 json 来读 url,爬出来的数据直接入库,flask 通过查增量来获取爬去的新数据。这样的话,只需要起一个 flask,然后爬虫跑在 flask 的进程中,通过 json 文件传 url

可以看看 scrapyrt

回到顶部