首页 > 解决方案 > CrawlerRunner() 没有通过scrapy的管道文件

问题描述

我正在尝试从 Django Views.py 文件中调用 scrapy 蜘蛛。蜘蛛确实被调用,但它的输出显示在命令提示符中,并且没有保存在 Django 模型中以将其呈现到页面上。我单独检查了正在运行的蜘蛛以验证scrapy和 Django 已连接并且它可以正常工作,但是当使用 CrawlerRunner() 脚本自动化时它不会。因此 Django views.py 文件中的 CrawlerRunner() 实现中缺少一些组件。下面是调用蜘蛛的 Django Views.py 文件:

@csrf_exempt
@require_http_methods(['POST', 'GET'])
def scrape(request):
import sys
from newscrawler.spiders import news_spider
from newscrawler.pipelines import NewscrawlerPipeline
from scrapy import signals
from twisted.internet import reactor
from scrapy.crawler import Crawler,CrawlerRunner
from scrapy.settings import Settings
from scrapy.utils.project import get_project_settings
from scrapy.utils.log import configure_logging
from crochet import setup

setup()
configure_logging()

runner= CrawlerRunner(get_project_settings())
d=runner.crawl(news_spider.NewsSpider)

return redirect("../getnews/")

我的蜘蛛完成了抓取新闻网站的工作,并保存了热门新闻的 Url、Image 和 Title。但是输出的是,它不是将这三个字段保存在 models.py 文件中,而是在 cmd 中打印。任何人都可以帮忙吗?

来自scrapy的项目文件

import scrapy
from scrapy_djangoitem import DjangoItem

import sys

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'News_Aggregator.settings'

from news.models import Headline

class NewscrawlerItem(DjangoItem):
    # define the fields for your item here like:
    django_model = Headline

管道文件

class NewscrawlerPipeline(object):
    def process_item(self, item, spider):
        print("10000000000000000")
        item.save()
        return item

标签: pythondjangoscrapy

解决方案


我发现CrawlerRunner无法访问我的scrapy项目的设置文件,该文件可以启用scrapy的pipelines.py,从而将数据保存在Django MOdels文件中。调用spider的django的views.py文件的修改代码是:

import os
import sys
from newscrawler.spiders import news_spider
from newscrawler.pipelines import NewscrawlerPipeline
from scrapy import signals
from twisted.internet import reactor
from scrapy.crawler import Crawler,CrawlerRunner
from scrapy.settings import Settings
from scrapy.utils.project import get_project_settings
from newscrawler import settings as my_settings 
from scrapy.utils.log import configure_logging
from crochet import setup

@csrf_exempt
@require_http_methods(['POST', 'GET'])
def scrape(request):
    Headline.objects.all().delete()
    crawler_settings = Settings()

    setup()
    configure_logging()
    crawler_settings.setmodule(my_settings)
    runner= CrawlerRunner(settings=crawler_settings)
    d=runner.crawl(news_spider.NewsSpider)
    time.sleep(8)
    return redirect("../getnews/")

希望这可以帮助任何想要从 django views.py 文件中调用 scrapy spider 并将抓取的数据保存在 Django Models 中的人。谢谢


推荐阅读