我想用龙卷风创造一个Scarpy。用户可以输入要搜索的URL并在UI中获取结果

时间:2018-06-18 20:00:50

标签: python python-3.x scrapy tornado scrapy-spider

我是Python新手。我前几天才学会了scrapy。

我想创建一个带有龙卷风或其他Python设置的Scarpy。 USER可以输入要爬网的URL并在UI中获取结果。

我尝试了scrapyrt,用户在UI中获取结果作为JSON。但我无法使用JSON。

我也试过archnado。 https://github.com/TeamHG-Memex/arachnado

但这是现在不支持的旧版本。当我尝试抛出大量错误时。

还尝试了这个https://groups.google.com/forum/#!topic/python-tornado/vi7idvzOgU8

Bitbucket项目。这是一个错误。有人可以通过提供详细的实施步骤来帮助解决这个问题。

1 个答案:

答案 0 :(得分:0)

鉴于您刚刚学习了Python + Scrapy,最好对您了解更多有关Python的信息,因为将Scrapy嵌入Web服务器中会利用一些Python魔术。另一方面,这种问题有时会弹出,应该以某种形式解决。

您要记住的是Scrapy是使用Twisted框架构建的,因此您必须确保所使用的任何Web框架都具有Twisted集成。幸运的是,Tornado integrates well with Twisted

import tornado.platform.twisted
tornado.platform.twisted.install()

import scrapy
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging as scrapy_log_conf
from tornado import ioloop, web
from tornado.log import enable_pretty_logging as enable_tornado_log

class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    start_urls = []

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').extract_first(),
                'author': quote.xpath('span/small/text()').extract_first(),
            }

        next_page = response.css('li.next a::attr("href")').extract_first()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

class RESTfulInterface(web.RequestHandler):
    def post(self):
        # get url to crawl from user
        crawl_urls = self.get_arguments('crawl_url')
        if len(crawl_urls) == 0:
            self.send_error(400)
            raise web.Finish

        crawl_runner = CrawlerRunner()
        #deferred = crawl_runner.crawl(QuotesSpider, start_urls=['http://quotes.toscrape.com/tag/humor/'])
        deferred = crawl_runner.crawl(QuotesSpider, start_urls=crawl_urls)
        deferred.addBoth(self.crawl_complete)

    def crawl_complete(self, result):
        """
        Do something meaningful after the crawl is complete, like sending an
        email to all the admins.
        """
        print('CRAWL_COMPLETE')

def main():
    enable_tornado_log()
    scrapy_log_conf({'LOG_FORMAT': '%(levelname)s: %(message)s'})
    app = web.Application([
        (r'/crawl/?', RESTfulInterface),
    ])
    app.listen(port='8888')
    ioloop.IOLoop.current().start()

main()

此代码段将从http://quotes.toscrape.com抓取页面。当您发布到/crawl端点时,将启动爬网。

`curl -X POST -F 'crawl_url=http://quotes.toscrape.com/tag/humor/' -F 'crawl_url=hello' http://localhost:8888/crawl`