【问题标题】:Integrate Scrapy with Django : How to将 Scrapy 与 Django 集成:如何
【发布时间】:2018-06-01 07:09:34
【问题描述】:

我还是 Django 的新手 我正在关注this关于如何集成scrapy和django的教程。

问题是当我尝试使用我自己的蜘蛛时,它就不起作用了。 我在 django 外面尝试了蜘蛛,它工作得很好,一些帮助会很有帮助。

这是我的 spider.py 文件

import scrapy
from scrapy_splash import SplashRequest

class NewsSpider(scrapy.Spider):
   name = 'detik'
   allowed_domains = ['news.detik.com']
   start_urls = ['https://news.detik.com/indeks/all/?date=02/28/2018']

def parse(self, response):  
    urls = response.xpath("//div/article/a/@href").extract()        
    for url in urls:
        url = response.urljoin(url)
        yield scrapy.Request(url=url, callback=self.parse_detail)

    # follow pagination link
    page_next =   response.xpath("//a[@class = 'last']/@href").extract_first()
    if page_next:
        page_next = response.urljoin(page_next)
        yield scrapy.Request(url=page_next, callback=self.parse)

def parse_detail(self,response):
    x = {}
    x['breadcrumbs'] = response.xpath("//div[@class='breadcrumb']/a/text()").extract(),
    x['tanggal'] = response.xpath("//div[@class='date']/text()").extract_first(),
    x['penulis'] = response.xpath("//div[@class='author']/text()").extract_first(),
    x['judul'] = response.xpath("//h1/text()").extract_first(),
    x['berita'] = response.xpath("normalize-space(//div[@class='detail_text'])").extract_first(),
    x['tag'] = response.xpath("//div[@class='detail_tag']/a/text()").extract(),
    x['url'] = response.request.url,
    return x

这是我的管道文件

class DetikAppPipeline(object):

def process_item(self, item, spider):
    item = detikNewsItem()
    self.items.append(item['breadcrumbs'])
    self.items.append(item['tanggal'])
    self.items.append(item['penulis'])
    self.items.append(item['judul'])
    self.items.append(item['berita'])
    self.items.append(item['tag'])
    self.items.append(item['url'])
    item.save()

这是 django 中的模型文件

class detikNewsItem(models.Model):
    breadcrumbs = models.TextField()
    tanggal = models.TextField()
    penulis = models.TextField()
    judul = models.TextField()
    berita = models.TextField()
    tag = models.TextField()
    url = models.TextField()

    @property
    def to_dict(self):
    data = {
        'url': json.loads(self.url),
        'tanggal': self.tanggal
    }
    return data

    def __str__(self):
        return self.url

【问题讨论】:

  • “它只是行不通”不是很具有描述性。您是否尝试过使用调试消息来找出执行过程中发生意外事件的时间点? (例如,某些代码未到达)

标签: python django scrapy


【解决方案1】:

在 Django 项目中如何编写 Scrapy pileline 示例。

from <YOU_APP_NAME>.models import detikNewsItem

class DetikAppPipeline(object):
    def process_item(self, item, spider):
        d, created = detikNewsItem.objects.get_or_create(breadcrumbs=item['breadcrumbs'], url=item['url'])
        if created:        
            d.tanggal = item['tanggal']
            d.penulis = item['penulis']
            d.judul = item['judul']
            d.berita = item['berita']
            d.tag = item['tag']
            d.save()
        
        return item

顺便说一下,你需要在 Django 环境中运行 Scrapy。有几种方法可以做到这一点:

  1. 使用django-extensions 模块。 需要新建文件:

    &lt;DJANG_PROJECT&gt;/scripts/__init__.py &lt;DJANG_PROJECT&gt;/scripts/run_scrapy.py

里面有代码:

from scrapy.cmdline import execute

execute(['run_scrapy.py', 'crawl', 'detik'])
  1. 另一种方法是使用 Django 管理。需要在项目中用文件创建文件夹:

    &lt;folder_of_app&gt;/management/commands/__init__.py &lt;folder_of_app&gt;/management/commands/scrapy.py scrapy.py 文件应包含代码:

    from scrapy.cmdline import execute
    
    from django.core.management.base import BaseCommand
    
    class Command(BaseCommand):
        help = 'Run scrapy.'
    
        def add_arguments(self, parser):
            parser.add_argument('arguments', nargs='+', type=str)
    
        def handle(self, *args, **options):
            args = []
            args.append('scrapy.py')
            args.extend(options['arguments'])
            execute(args)
    

它允许像这样在 Django 环境中运行 Scrapy:

python manage.py scrapy crawl detik
python manage.py scrapy shell 'https://news.detik.com/indeks/all/?date=02/28/2018'

【讨论】:

  • 感谢您的回答,但我想做的是从 django 中的 .html 运行 scrapy。它仍然可能吗?我得到这个 ScrapyItem 匹配查询不存在。但找不到问题所在
  • 使用您的新代码编辑您的帖子消息。它可以帮助你。
  • 我实际上意识到问题出在管道中。不幸的是,您的代码无法正常工作
猜你喜欢
  • 2015-10-02
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 2017-02-11
  • 2010-11-29
  • 2017-03-12
相关资源
最近更新 更多