2012-12-28 44 views
9

Làm cách nào để lặp qua các trang web bằng Scrapy? Tôi muốn trích xuất nội dung của tất cả các trang web khớp với http://www.saylor.org/site/syllabus.php?cid=NUMBER, trong đó NUMBER từ 1 đến 400 hoặc hơn.Lặp lại thông qua các trang web bằng Python Scrapy

Tôi đã viết nhện này:

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from syllabi.items import SyllabiItem 

class SyllabiSpider(CrawlSpider): 

    name = 'saylor' 
    allowed_domains = ['saylor.org'] 
    start_urls = ['http://www.saylor.org/site/syllabus.php?cid='] 
    rules = [Rule(SgmlLinkExtractor(allow=['\d+']), 'parse_syllabi')] 

    def parse_syllabi(self, response): 
     x = HtmlXPathSelector(response) 

     syllabi = SyllabiItem() 
     syllabi['url'] = response.url 
     syllabi['body'] = x.select("/html/body/text()").extract() 
     return syllabi 

Nhưng nó không hoạt động. Tôi hiểu nó đang tìm kiếm các liên kết trong start_url đó, đó không thực sự là những gì tôi muốn nó làm. Tôi muốn lặp qua các trang web. Có lý?

Cảm ơn sự giúp đỡ.

+1

Có thể xây dựng danh sách các URL mong muốn trước? ví dụ 'urls = [" example.com?cid={}".format(x) cho x trong phạm vi (1, 401)] '? Disclaimer: Tôi chưa bao giờ sử dụng Scrapy. – Kevin

Trả lời

11

Hãy thử điều này:

from scrapy.spider import BaseSpider 
from scrapy.http import Request 
from syllabi.items import SyllabiItem 

class SyllabiSpider(BaseSpider): 
    name = 'saylor' 
    allowed_domains = ['saylor.org'] 
    max_cid = 400 

    def start_requests(self): 
     for i in range(self.max_cid): 
      yield Request('http://www.saylor.org/site/syllabus.php?cid=%d' % i, 
        callback=self.parse_syllabi) 

    def parse_syllabi(self, response): 
     syllabi = SyllabiItem() 
     syllabi['url'] = response.url 
     syllabi['body'] = response.body 

     return syllabi 
+0

Cảm ơn. Bây giờ làm cách nào để tách đầu ra thành các tệp cho mỗi trang web? Khi tôi mở một tệp có tên biến để viết bằng parse_syllabi, đầu ra cho mỗi trang web sẽ chuyển đến tệp cuối cùng và tên còn lại sẽ trống. Không chắc chắn những gì đang xảy ra đằng sau hậu trường. –

+0

Điều đang diễn ra đằng sau hậu trường là phép thuật được gọi là [Xoắn] (http://twistedmatrix.com/). Nó có lẽ sẽ là tốt nhất cho bạn để chấp nhận câu trả lời này, nếu nó là hữu ích, và sau đó mở một câu hỏi mới. –

+0

Rất hữu ích. Tôi bắt đầu một câu hỏi mới: Tại sao lậu bỏ qua vòng lặp? Cảm ơn đã giúp đỡ. –

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