如果只是在Flask中调用Scrapy爬虫,可能会遇到如下错误:
ValueError: signal only works in main thread # 或者 twisted.internet.error.ReactorNotRestartable
解决的办法有几个。
首先,确保目录结构类似如下:
> 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)
新进程中启动爬虫:
代码如下:
# 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)
安装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?