2012-10-21 33 views
24

Tôi đã viết một trình thu thập làm việc sử dụng scrapy,
bây giờ tôi muốn kiểm soát nó thông qua một webapp Django, mà là để nói:Làm thế nào để cài đặt và khởi động một con nhện Scrapy lập trình (url và cài đặt)

  • Set 1 hoặc nhiều start_urls
  • Set 1 hoặc nhiều allowed_domains
  • Set settings giá trị
  • Bắt đầu nhện
  • Dừng/tạm dừng/tiếp tục một con nhện
  • truy xuất một số chỉ số trong khi chạy
  • lấy lại một số chỉ số sau khi hoàn tất.

Lúc đầu, tôi nghĩ rằng scrapyd đã được thực hiện cho điều này, nhưng sau khi đọc tài liệu, có vẻ như đó là một daemon có thể quản lý 'nhện đóng gói', còn gọi là 'trứng vụn'; và rằng tất cả các cài đặt (start_urls, allowed_domains, settings) vẫn phải được mã hóa cứng trong chính 'quả trứng gầy'; vì vậy nó không giống như một giải pháp cho câu hỏi của tôi, trừ khi tôi bỏ lỡ một cái gì đó.

Tôi cũng đã xem câu hỏi này: How to give URL to scrapy for crawling?; Nhưng câu trả lời hay nhất để cung cấp nhiều url là đủ điều kiện bởi tác giả himeslf như một 'hack xấu xí', liên quan đến một số quy trình con trăn và xử lý shell phức tạp, vì vậy tôi không nghĩ giải pháp được tìm thấy ở đây. Ngoài ra, nó có thể hoạt động cho start_urls, nhưng dường như không cho phép allowed_domains hoặc settings.

Sau đó, tôi đã xem xét scrapy webservices: Có vẻ như đó là giải pháp tốt để truy lục số liệu thống kê. Tuy nhiên, nó vẫn đòi hỏi một con nhện chạy, và không có đầu mối để thay đổi settings

Có một số câu hỏi về chủ đề này, không ai trong số họ có vẻ khả quan:

Tôi biết rằng phế liệu được sử dụng trong môi trường sản xuất; và một công cụ như scrapyd cho thấy rằng có một số cách để xử lý những yêu cầu này (tôi không thể tưởng tượng rằng những quả trứng phế liệu scrapyd đang xử lý được tạo ra bằng tay!)

Cảm ơn rất nhiều sự giúp đỡ của bạn.

+0

Scrapy được tạo ra với 'lệnh deploy'; có lẽ bạn có thể kiểm tra [Django Dynamic Scraper] (https://github.com/holgerd77/django-dynamic-scraper) để biết các gợi ý về cách tích hợp kiểm soát nhện Scrapy ở Django. –

+0

Bạn đã xem [công cụ gọn gàng] (http://doc.scrapy.org/en/latest/topics/commands.html) hoặc [dự án slybot] (https://github.com/scrapy/slybot) cho cảm hứng? – jah

+0

Câu trả lời của tôi http://stackoverflow.com/questions/9814827/creating-a-generic-scrapy-spider/13054768#13054768 có thể giúp – djinn

Trả lời

0

Tôi nghĩ rằng bạn cần phải xem xét điều này

http://django-dynamic-scraper.readthedocs.org/en/latest/

này làm tương tự như những gì bạn muốn. Nó cũng sử dụng cần tây của sheduling nhiệm vụ. Bạn có thể xem mã để xem anh ấy đang làm gì.Tôi nghĩ rằng nó sẽ được dễ dàng nếu bạn sửa đổi mã của mình để làm những gì bạn muốn

Nó cũng có tài liệu tốt về cách thiết lập giao diện với django

9

Lúc đầu, tôi nghĩ scrapyd đã được thực hiện cho điều này, nhưng sau khi đọc tài liệu, có vẻ như đó là một daemon có thể quản lý 'nhện được đóng gói', còn gọi là 'trứng vụn'; và rằng tất cả các thiết lập (start_urls, allowed_domains, settings) vẫn phải được mã hóa cứng trong chính 'quả trứng vụn'; vì vậy nó không giống như một giải pháp cho câu hỏi của tôi, trừ khi tôi bỏ lỡ một cái gì đó.

Tôi không đồng ý với tuyên bố trên, start_urls không cần phải được mã hóa cứng họ có thể được tự động truyền cho các lớp, bạn sẽ có thể vượt qua nó như một cuộc tranh cãi như thế này

http://localhost:6800/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1 

Hoặc bạn có thể truy xuất URL từ cơ sở dữ liệu hoặc tệp. Tôi lấy nó từ một cơ sở dữ liệu như thế này

class WikipediaSpider(BaseSpider): 
    name = 'wikipedia' 
    allowed_domains = ['wikipedia.com'] 
    start_urls = [] 

    def __init__(self, name=None, url=None, **kwargs): 
     item = MovieItem() 
     item['spider'] = self.name 
     # You can pass a specific url to retrieve 
     if url: 
      if name is not None: 
       self.name = name 
      elif not getattr(self, 'name', None): 
       raise ValueError("%s must have a name" % type(self).__name__) 
      self.__dict__.update(kwargs) 
      self.start_urls = [url] 
     else: 
      # If there is no specific URL get it from Database 
      wikiliks = # < -- CODE TO RETRIEVE THE LINKS FROM DB --> 
      if wikiliks == None: 
       print "**************************************" 
       print "No Links to Query" 
       print "**************************************" 
       return None 

      for link in wikiliks: 
       # SOME PROCESSING ON THE LINK GOES HERE 
       self.start_urls.append(urllib.unquote_plus(link[0])) 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     # Remaining parse code goes here 
2

Điều này thực sự rất đơn giản!

from mypackage.spiders import MySpider 
from scrapy.crawler import CrawlerProcess 

results = [] 

class MyPipeline(object): 
    """ A custom pipeline that stores scrape results in 'results'""" 
    def process_item(self, item, spider): 
     results.append(dict(item)) 

process = CrawlerProcess({ 
    # An example of a custom setting 
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 
    'ITEM_PIPELINES': {'__main__.MyPipeline': 1}, # Hooking in our custom pipline above 
}) 

start_urls=[ 
    'http://example.com/page1', 
    'http://example.com/page2', 
] 
process.crawl(MySpider, start_urls=start_urls) 
process.start() # the script will block here until the crawling is finished 

# Do something with the results 
print results 
+0

Có thể chỉ định allow_domain trong thời gian chạy không? –

6

Đối với thay đổi cài đặt lập trình và chạy scraper từ bên trong ứng dụng, đây là những gì tôi nhận: trứng

from scrapy.crawler import CrawlerProcess 
from myproject.spiders import MySpider 
from scrapy.utils.project import get_project_settings 

os.environ['SCRAPY_SETTINGS_MODULE'] = 'myproject.my_settings_module' 
scrapy_settings = get_project_settings() 
scrapy_settings.set('CUSTOM_PARAM', custom_vaule) 
scrapy_settings.set('ITEM_PIPELINES', {}) # don't write jsons or anything like that 
scrapy_settings.set('DOWNLOADER_MIDDLEWARES', { 
    'myproject.middlewares.SomeMiddleware': 100, 
}) 
process = CrawlerProcess(scrapy_settings) 
process.crawl(MySpider, start_urls=start_urls) 
process.start() 
Các vấn đề liên quan