2010-03-07 22 views
12

Tôi cần tạo một trình thu thập dữ liệu web/trình thu thập thông tin người dùng và tôi đang nghĩ đến việc sử dụng Scrapy. Tuy nhiên, tôi không thể mã hóa cứng các miền và cho phép URL regex: es - thay vào đó sẽ được cấu hình trong GUI.Sử dụng một Spider phế liệu cho một số trang web

Làm cách nào để (một cách đơn giản nhất có thể) tạo ra một con nhện hoặc một bộ trình thu thập dữ liệu với Scrapy nơi tên miền và URL được cho phép regex: es được cấu hình động? Ví dụ. Tôi viết cấu hình vào một tập tin, và con nhện đọc nó bằng cách nào đó.

+2

@Christian Daven: Chẳng phải câu trả lời chấp nhận được cho câu hỏi của bạn? – dangra

Trả lời

10

CẢNH BÁO: Câu trả lời này là dành cho Scrapy v0.7, trình quản lý spider api đã thay đổi rất nhiều kể từ đó.

Override lớp SpiderManager mặc định, tải quy tắc tùy chỉnh của bạn từ một cơ sở dữ liệu hoặc ở một nơi khác và instanciate một con nhện tùy chỉnh với các quy tắc của riêng/regexes của bạn và domain_name

trong mybot/settings.py:

SPIDER_MANAGER_CLASS = 'mybot.spidermanager.MySpiderManager' 

trong mybot/spidermanager.py:

from mybot.spider import MyParametrizedSpider 

class MySpiderManager(object): 
    loaded = True 

    def fromdomain(self, name): 
     start_urls, extra_domain_names, regexes = self._get_spider_info(name) 
     return MyParametrizedSpider(name, start_urls, extra_domain_names, regexes) 

    def close_spider(self, spider): 
     # Put here code you want to run before spiders is closed 
     pass 

    def _get_spider_info(self, name): 
     # query your backend (maybe a sqldb) using `name` as primary key, 
     # and return start_urls, extra_domains and regexes 
     ... 
     return (start_urls, extra_domains, regexes) 

và bây giờ lớp nhện tùy chỉnh của bạn, trong mybot/spider.py:

from scrapy.spider import BaseSpider 

class MyParametrizedSpider(BaseSpider): 

    def __init__(self, name, start_urls, extra_domain_names, regexes): 
     self.domain_name = name 
     self.start_urls = start_urls 
     self.extra_domain_names = extra_domain_names 
     self.regexes = regexes 

    def parse(self, response): 
     ... 

Ghi chú:

  • Bạn có thể mở rộng CrawlSpider quá nếu bạn muốn tận dụng lợi thế của hệ thống các Quy định
  • Để chạy sử dụng nhện: ./scrapy-ctl.py crawl <name>, nơi name được chuyển cho SpiderManager.fromdomain và là chìa khóa để truy xuất thêm thông tin về nhện từ hệ thống phụ trợ
  • Khi giải pháp ghi đè SpiderManager mặc định, mã hóa một con nhện cổ điển (mô-đun python trên mỗi SPIDER) không hoạt động, nhưng tôi nghĩ đây không phải là vấn đề cho bạn.Thông tin thêm về quản lý nhện mặc định TwistedPluginSpiderManager
+0

Sự khác biệt với cách tiếp cận của Alex Martelli là nhện được khởi tạo theo yêu cầu, thay vì chuẩn bị trước tất cả chúng chỉ để sử dụng. Cách tiếp cận này có thể giảm tải trên phụ trợ của bạn và dấu chân bộ nhớ của quá trình bot của bạn. – dangra

+0

Và làm cách nào để tôi chỉ định cài đặt cho mỗi spider tùy chỉnh (ITEM_PIPELINES, USER_AGENT, v.v.)? Ngoài ra, bạn đề cập đến './scrapy-ctl.py crawl '. 'Scrapy-ctl.py' là gì? – warvariuc

3

Quảng cáo tự quảng cáo không biết xấu hổ trên domo! bạn sẽ cần phải khởi tạo trình thu thập thông tin như được đưa ra trong các ví dụ, cho dự án của bạn. Ngoài ra, bạn sẽ cần phải làm cho trình thu thập thông tin có thể định cấu hình trong thời gian chạy, chỉ đơn giản là chuyển cấu hình đến trình thu thập thông tin và ghi đè cài đặt trên thời gian chạy, khi cấu hình thay đổi.

4

gì bạn cần là để tự động tạo ra các lớp nhện, subclassing lớp nhện generic yêu thích của bạn như được cung cấp bởi scrapy (CrawlSpider lớp con với rules bạn thêm hoặc XmlFeedSpider, hoặc bất cứ điều gì) và thêm domain_name, start_urls, và có thể extra_domain_names (và/hoặc start_requests(), v.v.), khi bạn nhận hoặc suy ra chúng từ GUI của bạn (hoặc tệp cấu hình hoặc bất kỳ thứ gì).

Python giúp bạn dễ dàng thực hiện việc tạo các đối tượng lớp học động như vậy; một ví dụ rất đơn giản có thể là:

from scrapy import spider 

def makespider(domain_name, start_urls, 
       basecls=spider.BaseSpider): 
    return type(domain_name + 'Spider', 
       (basecls,), 
       {'domain_name': domain_name, 
       'start_urls': start_urls}) 

allspiders = [] 
for domain, urls in listofdomainurlpairs: 
    allspiders.append(makespider(domain, urls)) 

này cung cấp cho bạn một danh sách các lớp học rất nhện trần xương - có thể bạn sẽ muốn thêm parse phương pháp để chúng trước khi bạn nhanh chóng chúng. Mùa để nếm ... ;-).

+0

và mã này sẽ ở đâu? Tôi đã cố gắng thêm các lớp trình thu thập dữ liệu động vào các mô-đun nhện của mình nhưng không được nhặt chúng. –

0

Bây giờ nó là vô cùng dễ dàng để cấu hình scrapy cho các mục đích:

  1. Về các url đầu tiên truy cập, bạn có thể vượt qua nó như là một thuộc tính trên các cuộc gọi nhện với -a và sử dụng chức năng start_requests để thiết lập cách khởi động spider

  2. Bạn không cần phải thiết lập biến số allowed_domains cho trình thu thập thông tin. Nếu bạn không bao gồm biến lớp đó, con nhện sẽ có thể cho phép mọi miền.

Nó nên kết thúc một cái gì đó như:

class MySpider(Spider): 

    name = "myspider" 

    def start_requests(self): 
     yield Request(self.start_url, callback=self.parse) 


    def parse(self, response): 
     ... 

và bạn nên gọi nó với:

scrapy crawl myspider -a start_url="http://example.com" 
Các vấn đề liên quan