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接口
用 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)
关键点:
- 用
CrawlerProcess在Flask中启动Scrapy - 自定义Pipeline收集数据并通过队列传递
- 用线程隔离爬虫运行,避免阻塞Flask
- 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

