python - 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
解决方案
我发现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 中的人。谢谢
推荐阅读
- html - 子元素的位置如何影响元素的 z-index
- python - Pandas read_csv 突然将 int 作为对象读取,我无法更改它
- excel - 当所需的匹配项嵌入到文本中时,从 VLOOKUP 返回结果
- java - javax.ejb.Remote 无法在 Spring Boot 中解决
- google-cloud-platform - Terraform:log export sink 在正常工作一段时间后抛出此错误“permission denied on bucket”
- ios - 将声明与 Swift 完成处理程序混淆
- php - 在 null 上调用成员函数 AddAddress()
- ios - 构建目标 MyNotificationService:找不到框架
- docker - 如何在 Docker 中更新网站?(本地)
- css - 当不透明度小于1时如何停止用户填写表格