Pertanyaan Menyelesaikan pengaturan proyek saat skrip berada di luar direktori root


Saya telah membuat laba-laba Scrapy yang berhasil dijalankan dari skrip yang ada di direktori root proyek. Karena saya harus menjalankan beberapa laba-laba dari proyek yang berbeda dari skrip yang sama (ini akan menjadi aplikasi Django memanggil skrip atas permintaan pengguna), saya memindahkan skrip dari akar salah satu proyek ke direktori induk. Untuk beberapa alasan, skrip tidak lagi bisa mendapatkan pengaturan kustom proyek untuk mem-pipe hasil yang tergores ke dalam tabel database. Berikut adalah kode dari dokumen yang kasar yang saya gunakan untuk menjalankan spider dari skrip:

def spiderCrawl():
   settings = get_project_settings()
   settings.set('USER_AGENT','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)')
   process = CrawlerProcess(settings)
   process.crawl(MySpider3)
   process.start()

Apakah ada modul tambahan yang perlu diimpor untuk mendapatkan pengaturan proyek dari luar proyek? Atau apakah perlu ada beberapa tambahan yang dibuat untuk kode ini? Di bawah ini saya juga memiliki kode untuk skrip menjalankan laba-laba, terima kasih.

from ticket_city_scraper.ticket_city_scraper import *
from ticket_city_scraper.ticket_city_scraper.spiders import tc_spider
from vividseats_scraper.vividseats_scraper import *
from vividseats_scraper.vividseats_scraper.spiders import vs_spider 

tc_spider.spiderCrawl()
vs_spider.spiderCrawl()

7
2017-07-27 20:36


asal


Jawaban:


Seharusnya berhasil, bisakah Anda membagikan file log yang kasar

Edit:  pendekatan Anda tidak akan berfungsi karena ... saat Anda mengeksekusi skrip .. Anda akan mencari pengaturan default Anda

  1. jika Anda telah mengatur variabel lingkungan ENVVAR
  2. jika Anda memiliki file scrapy.cfg di direktori yang Anda presentasikan dari tempat Anda mengeksekusi skrip Anda dan jika file tersebut menunjukkan valid settings.py direktori, itu akan memuat pengaturan tersebut ...
  3. lain itu akan berjalan dengan pengaturan vanilla yang disediakan oleh goresan (kasus Anda)

Solusi 1 buat file cfg di dalam direktori (di luar folder) dan berikan path ke file settings.py yang valid

Solusi 2 membuat paket direktori induk Anda, sehingga jalur absolut tidak akan diperlukan dan Anda dapat menggunakan jalur relatif

yaitu python -m cron.project1

Solusi 3

Anda juga dapat mencoba sesuatu seperti

Biarlah di mana itu, di dalam direktori proyek .. tempat ini berfungsi ...

Buat file sh ...

  • Baris 1: Cd ke lokasi proyek pertama (direktori root)
  • Baris 2: Python script1.py
  • Lini 3. Cd ke lokasi proyek kedua
  • Baris 4: skrip python2.py

Sekarang Anda dapat mengeksekusi spiders melalui file sh ini ketika diminta oleh Django


3
2017-07-27 20:56



ini bisa terjadi karena Anda tidak lagi "di dalam" proyek yang sulit, jadi tidak tahu cara mengaturnya get_project_settings().

Anda juga dapat menentukan pengaturan sebagai kamus sebagai contoh di sini:

http://doc.scrapy.org/en/latest/topics/practices.html#run-scrapy-from-a-script


1
2017-07-28 00:24



Saya telah menggunakan kode ini untuk memecahkan masalah:

from scrapy.settings import Settings

settings = Settings()

settings_module_path = os.environ.get('SCRAPY_ENV', 'project.settings.dev')   
settings.setmodule(settings_module_path, priority='project')

print(settings.get('BASE_URL'))

1
2018-04-19 11:14



Terima kasih untuk beberapa jawaban yang sudah disediakan di sini, saya menyadari bahwa tidak benar-benar mengimpor file settings.py. Ini cara saya memperbaikinya.

TLDR: Pastikan Anda mengatur variabel 'SCRAPY_SETTINGS_MODULE' ke file settings.py Anda yang sebenarnya. Saya melakukan ini di __init __ () fungsi Scraper.

Pertimbangkan proyek dengan struktur berikut.

my_project/
    main.py                 # Where we are running scrapy from
    scraper/
        run_scraper.py               #Call from main goes here
        scrapy.cfg                   # deploy configuration file
        scraper/                     # project's Python module, you'll import your code from here
            __init__.py
            items.py                 # project items definition file
            pipelines.py             # project pipelines file
            settings.py              # project settings file
            spiders/                 # a directory where you'll later put your spiders
                __init__.py
                quotes_spider.py     # Contains the QuotesSpider class

Pada dasarnya, perintahnya scrapy startproject scraper dieksekusi dalam folder my_project, saya telah menambahkan run_scraper.pyfile ke folder scraper luar, a main.py file ke folder root saya, dan quotes_spider.py ke folder spider.

File utama saya:

from scraper.run_scraper import Scraper
scraper = Scraper()
scraper.run_spiders()

Saya run_scraper.py mengajukan:

from scraper.scraper.spiders.quotes_spider import QuotesSpider
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
import os


class Scraper:
    def __init__(self):
        settings_file_path = 'scraper.scraper.settings' # The path seen from root, ie. from main.py
        os.environ.setdefault('SCRAPY_SETTINGS_MODULE', settings_file_path)
        self.process = CrawlerProcess(get_project_settings())
        self.spiders = QuotesSpider # The spider you want to crawl

    def run_spiders(self):
        self.process.crawl(self.spider)
        self.process.start()  # the script will block here until the crawling is finished

Juga, perhatikan bahwa pengaturan mungkin memerlukan pemeriksaan, karena jalur harus sesuai dengan folder akar (my_project, bukan scraper). Jadi dalam kasus saya:

SPIDER_MODULES = ['scraper.scraper.spiders']
NEWSPIDER_MODULE = 'scraper.scraper.spiders'

dll ...


1
2017-11-01 14:44