2012-03-13 37 views
21

Tôi muốn sử dụng mẩu tin lưu niệm để thu thập thông tin các trang web. Có cách nào để truyền URL bắt đầu từ chính thiết bị đầu cuối không?Làm cách nào để cung cấp URL cho việc thu thập dữ liệu để thu thập dữ liệu?

Nó được đưa ra trong documentation mà một trong hai tên của nhện hoặc URL có thể được đưa ra, nhưng khi tôi đưa url nó ném một lỗi:

// tên của nhện của tôi là một ví dụ, nhưng tôi đang cho url thay vì tên spider của tôi (Nó hoạt động tốt nếu tôi cho tên nhện).

scrapy crawl example.com

LỖI:

File "/usr/local/lib/python2.7/dist-packages/Scrapy-0.14.1-py2.7.egg/scrapy/spidermanager.py", line 43, in create raise KeyError("Spider not found: %s" % spider_name) KeyError: 'Spider not found: example.com'

Làm thế nào tôi có thể làm scrapy sử dụng nhện của tôi trên url đưa ra trong nhà ga ??

+0

Có phải example.com được thêm vào tên miền được phép của nhện của bạn không? –

+0

yes example.com được thêm vào allow_domains. Những gì tôi thực sự muốn là cung cấp cho start_url từ dòng lệnh. tôi làm nó như thế nào? –

Trả lời

43

Tôi không thực sự chắc chắn về tùy chọn dòng lệnh. Tuy nhiên, bạn có thể viết con nhện của bạn như thế này.

class MySpider(BaseSpider): 

    name = 'my_spider'  

    def __init__(self, *args, **kwargs): 
     super(MySpider, self).__init__(*args, **kwargs) 

     self.start_urls = [kwargs.get('start_url')] 

Và bắt đầu nó như: scrapy crawl my_spider -a start_url="http://some_url"

+0

cảm ơn bạn rất nhiều, đây chính xác là những gì tôi đang tìm kiếm. Nó làm việc tốt cho tôi :) –

+0

Cách tiếp cận này chỉ hoạt động cho chính xác một url. Nếu bạn muốn cung cấp nhiều hơn một url, xem [cách tiếp cận của tôi] (http://stackoverflow.com/a/12749782/1125413) trong chuỗi này. – pemistahl

+1

Đối với nhiều URL: 'self.start_urls = kwargs.pop ('start_urls'). Split (',')' được chạy * trước * super(). –

3

Sử dụng lệnh scrapy phân tích cú pháp. Bạn có thể phân tích cú pháp url bằng con nhện của mình. url được truyền từ lệnh.

$ scrapy parse http://www.example.com/ --spider=spider-name 

http://doc.scrapy.org/en/latest/topics/commands.html#parse

+0

Thật không may, phân tích phế liệu dường như không có các tùy chọn để lưu kết quả vào một tệp (theo nhiều định dạng khác nhau) như thu thập dữ liệu thô sơ – dan3

+0

Nếu bạn đang tìm cách gỡ lỗi tại sao một url cụ thể mà nhện của bạn không thực hiện được đây là một tùy chọn dễ dàng. – jeffjv

+0

Không thể lưu/xuất tệp dễ dàng. Nếu không thì điều này sẽ hoàn hảo. – Citricguy

3

Đây là một phần mở rộng để the approach given by Sjaak Trekhaak trong chủ đề này. Cách tiếp cận vì nó cho đến nay chỉ hoạt động nếu bạn cung cấp chính xác một url. Ví dụ, nếu bạn muốn cung cấp nhiều hơn một url như thế này, ví dụ:

-a start_url=http://url1.com,http://url2.com 

sau đó Scrapy (Tôi đang sử dụng phiên bản ổn định hiện tại 0.14.4) sẽ chấm dứt với ngoại lệ sau:

error: running 'scrapy crawl' with more than one spider is no longer supported 

Tuy nhiên, bạn có thể phá vỡ vấn đề này bằng cách chọn một biến khác nhau cho mỗi url bắt đầu, cùng với một đối số chứa số lượng url được truyền. Một cái gì đó như thế này:

-a start_url1=http://url1.com 
-a start_url2=http://url2.com 
-a urls_num=2 

Sau đó bạn có thể làm như sau trong nhện của bạn:

class MySpider(BaseSpider): 

    name = 'my_spider'  

    def __init__(self, *args, **kwargs): 
     super(MySpider, self).__init__(*args, **kwargs) 

     urls_num = int(kwargs.get('urls_num')) 

     start_urls = [] 
     for i in xrange(1, urls_num): 
      start_urls.append(kwargs.get('start_url{0}'.format(i))) 

     self.start_urls = start_urls 

Đây là một hack hơi xấu xí nhưng nó hoạt động. Tất nhiên, thật tẻ nhạt khi viết xuống tất cả các đối số dòng lệnh cho mỗi url một cách rõ ràng. Do đó, bạn cần phải thực hiện lệnh scrapy crawl trong Python subprocess và tạo các đối số dòng lệnh trong một vòng lặp hoặc một thứ gì đó.

Hy vọng điều đó sẽ hữu ích.:)

+0

Nếu tôi gọi là 0,24,4 phế liệu như thế này: 'thu thập dữ liệu cặn bã MySpider -a start_urls = http: //example.com/ -o - -t json' Mọi thứ hoạt động tốt. Ban đầu tôi đặt các tùy chọn giữa -o và - và nhận được giống như bạn Lỗi. –

10

Một cách dễ dàng hơn để cho phép nhiều url-lập luận so với những gì Peter gợi ý là bằng cách cho họ như là một chuỗi với các url cách nhau bởi một dấu phẩy, như thế này:

-a start_urls="http://example1.com,http://example2.com" 

Trong nhện bạn sẽ sau đó chỉ cần chia chuỗi trên '' và nhận được một mảng của các url:

self.start_urls = kwargs.get('start_urls').split(',') 
3

Sjaak Trekhaak có ý tưởng đúng và đây là cách để cho phép bội:

class MySpider(scrapy.Spider): 
    """ 
    This spider will try to crawl whatever is passed in `start_urls` which 
    should be a comma-separated string of fully qualified URIs. 

    Example: start_urls=http://localhost,http://example.com 
    """ 
    def __init__(self, name=None, **kwargs): 
     if 'start_urls' in kwargs: 
      self.start_urls = kwargs.pop('start_urls').split(',') 
     super(Spider, self).__init__(name, **kwargs) 
0

Bạn cũng có thể thử điều này:

>>> scrapy view http://www.sitename.com 

Nó sẽ mở ra một cửa sổ trong trình duyệt của URL được yêu cầu.

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