整合Django Rest Framework和Scrapy

4
Scrapy和Django框架都是Python的独立最佳框架,可用于构建爬虫和Web应用程序,并且代码量较少。但是,每当您想创建一个爬虫时,您总是需要生成新的代码文件并编写相同的代码(尽管有所变化)。我正在尝试集成两者。但是卡在了一个地方,我需要发送状态200_OK以表示爬虫成功运行,并且同时爬虫继续运行,直到完成后将数据保存到数据库。
虽然我知道scrapyd已经提供了API,但我想使它更加通用。让您无需编写多个文件即可创建爬虫。我认为Crawlrunner会有所帮助,因此也尝试了这个https://docs.scrapy.org/en/latest/topics/practices.html,还尝试了这个Easiest way to run scrapy crawler so it doesn't block the script,但它给我报错了,错误信息为builtins.ValueError: signal only works in main thread
尽管我从Rest Framework中获得了响应,但是由于此错误,爬虫无法运行,这是否意味着我需要切换到主线程?我正在使用简单的代码进行操作。
spider = GeneralSpider(pk)
runner = CrawlerRunner()
d = runner.crawl(GeneralSpider, pk)
d.addBoth(lambda _: reactor.stop())
reactor.run()
1个回答

2
我在Django视图中运行了Scrapy爬虫,并分享了我的代码。
settings_file_path = "scraping.settings"  # Scrapy Project Setting
os.environ.setdefault('SCRAPY_SETTINGS_MODULE', settings_file_path)
settings = get_project_settings()
runner = CrawlerRunner(settings)

path = "/path/to/sample.py"
path = url.replace('.py', '')
path = url.replace('/', '.')
file_path = ".SampleSpider".format(path)

SampleSpider = locate(file_path)

d = runner.crawl(SampleSpider)
d.addBoth(lambda _: reactor.stop())
reactor.run()

我希望您能受益。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接