2012-05-12 34 views
9

Tôi muốn có thể chạy Scrapy web crawling framework từ bên trong Django. Bản thân chính nó chỉ cung cấp công cụ dòng lệnh scrapy để thực thi các lệnh của nó, tức là công cụ này không được cố tình viết để được gọi từ chương trình bên ngoài.Lệnh quản lý tùy chỉnh Django chạy Phế liệu: Cách đưa các tùy chọn của Scrapy?

Người dùng Mikhail Korobov đã đưa ra một nice solution, cụ thể là gọi Scrapy từ lệnh quản lý tùy chỉnh Django. Để thuận tiện, tôi lặp lại giải pháp của mình tại đây:

# -*- coding: utf-8 -*- 
# myapp/management/commands/scrapy.py 

from __future__ import absolute_import 
from django.core.management.base import BaseCommand 

class Command(BaseCommand): 

    def run_from_argv(self, argv): 
     self._argv = argv 
     return super(Command, self).run_from_argv(argv) 

    def handle(self, *args, **options): 
     from scrapy.cmdline import execute 
     execute(self._argv[1:]) 

Thay vì gọi điện, ví dụ: scrapy crawl domain.com Tôi hiện có thể làm python manage.py scrapy crawl domain.com từ bên trong dự án Django. Tuy nhiên, các tùy chọn của lệnh Scrapy không được phân tích cú pháp. Nếu tôi làm python manage.py scrapy crawl domain.com -o scraped_data.json -t json, tôi chỉ nhận được câu trả lời sau đây:

Usage: manage.py scrapy [options] 

manage.py: error: no such option: -o 

Vì vậy, câu hỏi của tôi là, làm thế nào để mở rộng lệnh quản lý tùy chỉnh để áp dụng tùy chọn dòng lệnh Scrapy không?

Thật không may, Django's documentation of this part không phải là rất rộng lớn. Tôi cũng đã đọc tài liệu về số optparse module của Python nhưng sau đó nó không rõ ràng hơn với tôi. Bất cứ ai có thể giúp tôi trong sự tôn trọng này? Cảm ơn rất nhiều trước!

+0

nhưng chúng ta không nên ở trong thư mục trên cùng để thu thập dữ liệu ?? Làm thế nào là thực hiện? @pemistahl – Nabin

Trả lời

5

OK, tôi đã tìm thấy giải pháp cho vấn đề của mình. Đó là một chút xấu xí nhưng nó hoạt động. Do lệnh manage.py của dự án Django không chấp nhận các tùy chọn dòng lệnh của Scrapy, tôi chia chuỗi tùy chọn thành hai đối số được chấp nhận bởi manage.py. Sau khi phân tích thành công, tôi tham gia lại hai đối số và chuyển chúng vào Scrapy.

Đó là, thay vì viết

python manage.py scrapy crawl domain.com -o scraped_data.json -t json 

tôi đặt dấu cách trong giữa các tùy chọn như

python manage.py scrapy crawl domain.com - o scraped_data.json - t json 

chức năng xử lý của tôi này trông như thế này:

def handle(self, *args, **options): 
    arguments = self._argv[1:] 
    for arg in arguments: 
     if arg in ('-', '--'): 
      i = arguments.index(arg) 
      new_arg = ''.join((arguments[i], arguments[i+1])) 
      del arguments[i:i+2] 
      arguments.insert(i, new_arg) 

    from scrapy.cmdline import execute 
    execute(arguments) 

Trong khi đó, Mikhail Korobov có cung cấp giải pháp tối ưu. Xem ở đây:

# -*- coding: utf-8 -*- 
# myapp/management/commands/scrapy.py 

from __future__ import absolute_import 
from django.core.management.base import BaseCommand 

class Command(BaseCommand): 

    def run_from_argv(self, argv): 
     self._argv = argv 
     self.execute() 

    def handle(self, *args, **options): 
     from scrapy.cmdline import execute 
     execute(self._argv[1:]) 
3

Tôi nghĩ rằng bạn đang thực sự tìm kiếm Hướng dẫn 10 của POSIX argument syntax conventions:

Đối số - nên được chấp nhận như một dấu phân cách cho thấy sự kết thúc tùy chọn. Bất kỳ đối số nào sau đây sẽ được coi là toán hạng, ngay cả khi chúng bắt đầu bằng ký tự '-' . Đối số - không nên được sử dụng làm tùy chọn hoặc làm toán hạng.

Mô-đun Python hoạt động theo cách này, ngay cả dưới cửa sổ.

tôi đặt scrapy thiết lập dự án mô-đun trong danh sách đối số, vì vậy tôi có thể tạo ra các dự án scrapy riêng biệt trong các ứng dụng độc lập:

# <app>/management/commands/scrapy.py 
from __future__ import absolute_import 
import os 

from django.core.management.base import BaseCommand 

class Command(BaseCommand): 
    def handle(self, *args, **options): 
     os.environ['SCRAPY_SETTINGS_MODULE'] = args[0] 
     from scrapy.cmdline import execute 
     # scrapy ignores args[0], requires a mutable seq 
     execute(list(args)) 

Được triệu gọi như sau:

python manage.py scrapy myapp.scrapyproj.settings crawl domain.com -- -o scraped_data.json -t json 

Thử nghiệm với scrapy 0.12 và django 1.3.1

Các vấn đề liên quan