2013-12-15 18 views
6

Tất cả các ví dụ tôi đã tìm thấy của Scrapy nói về cách thu thập dữ liệu một trang, các trang có cùng lược đồ url hoặc tất cả các trang của một trang web. tôi cần để thu thập thông loạt các trang A, B, C, nơi ở Một bạn có liên kết đến B và vân vân .. Ví dụ cấu trúc trang web là:Làm cách nào để sử dụng mẩu tin lưu niệm để thu thập dữ liệu nhiều trang?

A 
----> B 
---------> C 
D 
E 

tôi cần phải thu thập tất cả các trang C , nhưng để có được liên kết đến C tôi cần phải thu thập dữ liệu trước A và B. Bất kỳ gợi ý nào?

+1

Tôi không sử dụng giấy phép, nhưng [tài liệu] (http://doc.scrapy.org/en/latest/intro/tutorial.html) rất rộng và bao gồm đầy đủ thông tin để bạn thực hiện việc này. Có vẻ như bạn cần phải viết [link extractor] (http://doc.scrapy.org/en/latest/topics/link-extractors.html) để nhận các liên kết trang 'B' từ trang' A' và sau đó phân tích cú pháp trang 'B' để tìm url trang' C'. Hãy thử làm điều đó và sau đó đăng một câu hỏi cụ thể với mã nếu bạn có vấn đề. – ChrisP

+4

Xin lỗi, nhưng tài liệu thực sự rất tệ cho người mới bắt đầu. Có rất ít và khá ví dụ vô dụng, và bạn giới thiệu trở lại trang web tài liệu là không giúp đỡ bất cứ ai. – not2qubit

Trả lời

10

thấy scrapy Request structure, để thu thập thông chuỗi như vậy, bạn sẽ phải sử dụng các tham số callback như sau:

class MySpider(BaseSpider): 
    ... 
    # spider starts here 
    def parse(self, response): 
     ... 
     # A, D, E are done in parallel, A -> B -> C are done serially 
     yield Request(url=<A url>, 
         ... 
         callback=parseA) 
     yield Request(url=<D url>, 
         ... 
         callback=parseD) 
     yield Request(url=<E url>, 
         ... 
         callback=parseE) 

    def parseA(self, response): 
     ... 
     yield Request(url=<B url>, 
         ... 
         callback=parseB) 

    def parseB(self, response): 
     ... 
     yield Request(url=<C url>, 
         ... 
         callback=parseC) 

    def parseC(self, response): 
     ... 

    def parseD(self, response): 
     ... 

    def parseE(self, response): 
     ... 
+0

Hiển thị Yêu cầu không được xác định. Tôi cần nhập gì để làm cho mã này hoạt động? Cảm ơn. –

+0

thử 'from scrapy.http import Request ' –

6

Dưới đây là một con nhện dụ tôi đã viết cho một dự án của tôi:

from scrapy.contrib.spiders import CrawlSpider 
from scrapy.selector import HtmlXPathSelector 
from scrapy.http import Request 
from yoMamaSpider.items import JokeItem 
from yoMamaSpider.striputils import stripcats, stripjokes 
import re 

class Jokes4UsSpider(CrawlSpider): 
    name = 'jokes4us' 
    allowed_domains = ['jokes4us.com'] 
    start_urls = ["http://www.jokes4us.com/yomamajokes/"] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     links = hxs.select('//a') 
     for link in links: 
      url = ''.join(link.select('./@href').extract()) 
      relevant_urls = re.compile(
       'http://www\.jokes4us\.com/yomamajokes/yomamas([a-zA-Z]+)') 
      if relevant_urls.match(url): 
       yield Request(url, callback=self.parse_page) 

    def parse_page(self, response): 
     hxs = HtmlXPathSelector(response) 
     categories = stripcats(hxs.select('//title/text()').extract()) 
     joke_area = hxs.select('//p/text()').extract() 
     for joke in joke_area: 
      joke = stripjokes(joke) 
      if len(joke) > 15: 
       yield JokeItem(joke=joke, categories=categories) 

Tôi nghĩ rằng phương pháp phân tích cú pháp là những gì bạn đang theo sau: Nó nhìn vào mọi liên kết trên trang start_urls, sau đó sử dụng một số regex để quyết định xem đó có phải là related_url (tức là url tôi muốn xóa), nếu nó có liên quan - nó cạo trang bằng cách sử dụng Yêu cầu lợi nhuận (url, callback = self.parse_page), gọi phương thức parse_page.

Đây có phải là loại điều bạn đang theo dõi không?

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