当前位置: 首页 > 编程笔记 >

Flask中集成Scrapy

能修谨
2023-03-14
本文向大家介绍Flask中集成Scrapy,包括了Flask中集成Scrapy的使用技巧和注意事项,需要的朋友参考一下

如果只是在Flask中调用Scrapy爬虫,可能会遇到如下错误:

ValueError: signal only works in main thread
# 或者
twisted.internet.error.ReactorNotRestartable

解决的办法有几个。

1 使用python子进程(subproccess)

首先,确保目录结构类似如下:

> tree -L 1                                                                                                                                                              

├── dirbot
├── README.rst
├── scrapy.cfg
├── server.py
└── setup.py

然后在,新进程中启动爬虫:

# 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)

新进程中启动爬虫:

2 使用Twisted-Klein + Scrapy

代码如下:

# 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)

3 使用ScrapyRT

安装ScrapyRT,然后启动:

> scrapyrt 

文章来源:https://stackoverflow.com/questions/36384286/how-to-integrate-flask-scrapy

 类似资料:
  • 问题内容: 无法使jQuery自动完成小部件与Flask框架一起使用。(http://jqueryui.com/autocomplete/#remote这里是一个示例) 在manage.py中,我得到了以下内容: 我的index.html文件: 似乎firefox中的开发工具不会返回任何错误。终端返回以下内容: 小部件不起作用。由于我对jQuery知之甚少,所以我不知道是什么原因导致了问题。有人可

  • 问题内容: 我正在尝试对Flask / Python中的SQLAlchemy结果集进行json化。 Flask邮件列表建议使用以下方法http://librelist.com/browser//flask/2011/2/16/jsonify-sqlalchemy-pagination-collection-result/#04a0754b63387f87e59dda564bde426e: 但是我得

  • 在前面一章 简单的 REST 服务 中,我们的数据都是保存在文件中的,我们可以发现,这样很是繁琐,每个请求中都需要进行读取文件,写出文件的操作,虽然显然我们可以对文件操作进行一个封装,但是,毕竟是文件存储,数据稍微多一点查询等操作必然时间变长。 面对这样的一个问题,这里引入了对数据库的依赖,在我们的 本书概述 中,我介绍了数据库的版本信息,本章使用的是 MongoDB,具体的版本还有数据库地址信息

  • 本文向大家介绍Python的Flask框架中集成CKeditor富文本编辑器的教程,包括了Python的Flask框架中集成CKeditor富文本编辑器的教程的使用技巧和注意事项,需要的朋友参考一下 CKeditor是目前最优秀的可见即可得网页编辑器之一,它采用JavaScript编写。具备功能强大、配置容易、跨浏览器、支持多种编程语言、开源等特点。它非常流行,互联网上很容易找到相关技术文档,国内

  • 我正在尝试将Brave MySql检测集成到Spring Boot2.x服务中,以自动地让它的拦截器通过涉及MySql查询的范围来丰富我的跟踪。 当前的Gradle-依赖关系如下 你有什么建议给我如何正确地连接东西吗?

  • null 如何在transform()步骤中添加Jaxb2Marshaller?