Pertanyaan Menjalankan laba-laba Scrapy dalam tugas Seledri


Saya memiliki situs Django di mana gesekan terjadi ketika pengguna memintanya, dan kode saya memulai skrip mandiri Gunting laba-laba dalam proses baru. Tentu saja, ini tidak bekerja dengan peningkatan pengguna.

Sesuatu seperti ini:

class StandAloneSpider(Spider):
    #a regular spider

settings.overrides['LOG_ENABLED'] = True
#more settings can be changed...

crawler = CrawlerProcess( settings )
crawler.install()
crawler.configure()

spider = StandAloneSpider()

crawler.crawl( spider )
crawler.start()

Saya telah memutuskan untuk menggunakan Seledri dan menggunakan pekerja untuk mengantri permintaan perayapan.

Namun, saya mengalami masalah dengan reaktor Tornado tidak dapat me-restart. Laba-laba pertama dan kedua berjalan dengan sukses, tetapi laba-laba selanjutnya akan melempar kesalahan ReactorNotRestartable.

Siapa pun dapat berbagi kiat apa pun dengan menjalankan Laba-laba dalam kerangka Seledri?


32
2017-07-17 18:36


asal


Jawaban:


Oke di sini adalah bagaimana saya mendapat Scrapy bekerja dengan proyek Django saya yang menggunakan Seledri untuk mengantre apa yang harus dirayapi. Solusi sebenarnya datang terutama dari kode joehillen yang ada di sini http://snippets.scrapy.org/snippets/13/

Pertama-tama tasks.py mengajukan

from celery import task

@task()
def crawl_domain(domain_pk):
    from crawl import domain_crawl
    return domain_crawl(domain_pk)

Maka itu crawl.py mengajukan

from multiprocessing import Process
from scrapy.crawler import CrawlerProcess
from scrapy.conf import settings
from spider import DomainSpider
from models import Domain

class DomainCrawlerScript():

    def __init__(self):
        self.crawler = CrawlerProcess(settings)
        self.crawler.install()
        self.crawler.configure()

    def _crawl(self, domain_pk):
        domain = Domain.objects.get(
            pk = domain_pk,
        )
        urls = []
        for page in domain.pages.all():
            urls.append(page.url())
        self.crawler.crawl(DomainSpider(urls))
        self.crawler.start()
        self.crawler.stop()

    def crawl(self, domain_pk):
        p = Process(target=self._crawl, args=[domain_pk])
        p.start()
        p.join()

crawler = DomainCrawlerScript()

def domain_crawl(domain_pk):
    crawler.crawl(domain_pk)

Triknya di sini adalah "dari Proses impor multiprosesing" ini mendapat sekitar "ReactorNotRestartable" masalah dalam kerangka Twisted. Jadi pada dasarnya tugas seledri panggilan "domain_crawl" fungsi yang menggunakan kembali objek "DomainCrawlerScript" berulang untuk antarmuka dengan laba-laba Scrapy Anda. (Saya sadar bahwa contoh saya sedikit berlebihan tetapi saya melakukan ini karena suatu alasan dalam pengaturan saya dengan beberapa versi python [webserver Django saya sebenarnya menggunakan python2.4 dan server pekerja saya menggunakan python2.7])

Dalam contoh saya di sini "DomainSpider" hanyalah Scrapy Spider yang dimodifikasi yang mengambil daftar url kemudian menetapkannya sebagai "start_urls".

Semoga ini membantu!


35
2017-07-25 19:34



aku menyiapkan CELERYD_MAX_TASKS_PER_CHILD ke 1 di file pengaturan dan yang mengurus masalah. Daemon pekerja memulai proses baru setelah setiap spider dijalankan dan yang mengurus reaktor.


8
2017-08-12 23:43