python twisted和flask_python – 如何集成Flask和Scrapy?

在蜘蛛面前添加HTTP服务器并不容易.有几种选择.

1. Python子流程

如果你真的只限于Flask,如果你不能使用其他任何东西,只有将Scrapy与Flask集成的方法是为每个蜘蛛爬行启动外部进程,如其他答案所建议的那样(注意你的子进程需要在适当的Scrapy项目中生成)目录).

所有示例的目录结构应如下所示,我使用的是dirbot test project

> tree -L 1

├── dirbot

├── README.rst

├── scrapy.cfg

├── server.py

└── setup.py

以下是在新流程中启动Scrapy的代码示例:

# server.py

import subprocess

from flask import Flask

app = Flask(__name__)

@app.route('/')

def hello_world():

"""

Run spider in another process and store items in file. Simply issue command:

> scrapy crawl dmoz -o "output.json"

wait for this command to finish, and read output.json to client.

"""

spider_name = "dmoz"

subprocess.check_output(['scrapy', 'crawl', spider_name, "-o", "output.json"])

with open("output.json") as items_file:

return items_file.read()

if __name__ == '__main__':

app.run(debug=True)

将上面保存为server.py并访问localhost:5000,您应该可以看到已删除的项目.

2. Twisted-Klein Scrapy

其他更好的方法是使用一些现有项目,将Twisted与Werkzeug集成,并显示类似于Flask的API,例如: Twisted-Klein. Twisted-Klein允许您在与Web服务器相同的过程中异步运行您的蜘蛛.它更好,因为它不会阻止每个请求,它允许您简单地从HTTP路由请求处理程序返回Scrapy / Twisted延迟.

以下代码片段将Twisted-Klein与Scrapy集成,请注意您需要创建自己的CrawlerRunner基类,以便抓取工具收集项目并将其返回给调用者.这个选项有点高级,你在与Python服务器相同的过程中运行Scrapy蜘蛛,项目不存储在文件中但存储在内存中(因此没有像前面的例子那样的磁盘写入/读取).最重要的是它是异步的,它都在一个Twisted反应堆中运行.

# server.py

import json

from klein import route, run

from scrapy import signals

from scrapy.crawler import CrawlerRunner

from dirbot.spiders.dmoz import DmozSpider

class MyCrawlerRunner(CrawlerRunner):

"""

Crawler object that collects items and returns output after finishing crawl.

"""

def crawl(self, crawler_or_spidercls, *args, **kwargs):

# keep all items scraped

self.items = []

# create crawler (Same as in base CrawlerProcess)

crawler = self.create_crawler(crawler_or_spidercls)

# handle each item scraped

crawler.signals.connect(self.item_scraped, signals.item_scraped)

# create Twisted.Deferred launching crawl

dfd = self._crawl(crawler, *args, **kwargs)

# add callback - when crawl is done cal return_items

dfd.addCallback(self.return_items)

return dfd

def item_scraped(self, item, response, spider):

self.items.append(item)

def return_items(self, result):

return self.items

def return_spider_output(output):

"""

:param output: items scraped by CrawlerRunner

:return: json with list of items

"""

# this just turns items into dictionaries

# you may want to use Scrapy JSON serializer here

return json.dumps([dict(item) for item in output])

@route("/")

def schedule(request):

runner = MyCrawlerRunner()

spider = DmozSpider()

deferred = runner.crawl(spider)

deferred.addCallback(return_spider_output)

return deferred

run("localhost", 8080)

将上面保存在文件server.py中并在Scrapy项目目录中找到它,

现在打开localhost:8080,它将启动dmoz spider并将作为json的项目返回浏览器.

3. ScrapyRT

当您尝试在蜘蛛面前添加HTTP应用程序时,会出现一些问题.例如,您有时需要处理蜘蛛日志(在某些情况下您可能需要它们),您需要以某种方式处理蜘蛛异常等.有些项目允许您以更简单的方式向蜘蛛添加HTTP API,例如ScrapyRT.这是一个将HTTP服务器添加到Scrapy蜘蛛并为您处理所有问题的应用程序(例如处理日志记录,处理蜘蛛错误等).

所以在安装ScrapyRT后你只需要这样做:

> scrapyrt

免责声明:我是ScrapyRt的作者之一.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值