2012-12-28 4 views
9

Scrapy를 사용하여 사이트를 반복하는 방법은 무엇입니까? http://www.saylor.org/site/syllabus.php?cid=NUMBER과 일치하는 모든 사이트의 본문을 추출하고 싶습니다. NUMBER는 1 ~ 400 정도입니다.Python Scrapy로 사이트 반복하기

는 I이 거미 작성했습니다 :

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 

을하지만 그것은 작동하지 않습니다. start_url에서 링크를 찾고 있다는 것을 이해합니다. 실제로는 원하는 것이 아닙니다. 사이트를 반복하고 싶습니다. 이해가 되니?

도움 주셔서 감사합니다.

+1

가 사전에 원하는 URL 목록을 구성 할 수 있습니까? 전의. 'urls = [ "example.com?cid={}".format(x) x 범위의 (1, 401)]'? 면책 조항 : 저는 Scrapy를 사용한 적이 없습니다. – Kevin

답변

11

이 시도 :

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

감사합니다. 이제 출력을 각 웹 사이트의 파일로 분리하는 방법은 무엇입니까? parse_syllabi로 쓰는 변수 이름을 가진 파일을 열면 모든 사이트의 출력이 마지막 파일로 이동하고 다른 파일은 비어있게됩니다. 뒤에서 무슨 일이 일어나고 있는지 잘 모릅니다. –

+0

뒤에서 일어나는 일은 [Twisted] (http://twistedmatrix.com/)라고하는 마법입니다. 도움이된다면이 대답을 받아들이고 새로운 질문을하는 것이 가장 좋을 것입니다. –

+0

도움이되었습니다. 나는 새로운 질문을 시작했다 : 왜 치료가 루프를 건너 뛰는가? 도와 주셔서 감사합니다. –

관련 문제