2013-03-19 31 views
10

私はウェブサイト全体をクロールできません.Scrapyは表面をちょうど這うので、私はより深くクロールしたいです。最後の5-6時間のためにグーグルグーグルと助けなし。下のコード:Scrapy - ウェブサイト全体をクロールする

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from scrapy.item import Item 
from scrapy.spider import BaseSpider 
from scrapy import log 

class ExampleSpider(CrawlSpider): 
    name = "example.com" 
    allowed_domains = ["example.com"] 
    start_urls = ["http://www.example.com/"] 
    rules = [Rule(SgmlLinkExtractor(allow=()), 
        follow=True), 
      Rule(SgmlLinkExtractor(allow=()), callback='parse_item') 
    ] 
    def parse_item(self,response): 
     self.log('A response from %s just arrived!' % response.url) 

助けてください!!!!

おかげで、 Abhiram

+1

私のipは禁止されています。それは間違いなく動作します! :) – alecxe

+0

@アレクサンダー - 私はより多くの:) :)をデバッグするための励みになる音IP禁止メイトで申し訳ありません! –

+0

実際にexample.comをクロールしようとしていますか?あなたはそれが本当のウェブサイトではないことを知っています。 –

答えて

6

は、最初のルールは、リンクを満たすには適用されますルールになることを意味し、短絡をルール、(コールバック付き)、2番目のルールは呼び出されません。

はこれにあなたのルールを変更し

rules = [Rule(SgmlLinkExtractor(), callback='parse_item', follow=True)] 
+0

@All - それは働いている...スティーブンは正しかったと助けてくれてありがとう!しかし、私はサイト全体をクロールすることができません、ちょうど80の奇妙なページをクロールすることができました..何かを修正する必要がありますか?ここに私の作業バージョンがあります:(ルール(SgmlLinkExtractor(allow =( 'pages /'))、Follow = True、コールバック= 'parse_item')) –

+0

こんにちは!これについて助力してもらえますか?http://stackoverflow.com/questions/31630771/scrapy-linkextractor-duplicating – yukclam9

+0

@スチーブンアルメロスハイスティーブンこれで助けてもらえますか?http://stackoverflow.com/questions/37717122/grabbed -data-from-a-given-url-and-a-file-using-scrapyルールの変更を試しましたが、それは私のためには機能しませんでした。 – nand

2

start_urlsを解析すると、より深いURLはタグhrefで解析することができます。そして、より深い要求は関数parse()で得られます。 Here is a simple example。最も重要なソースコードを以下に示します:

from scrapy.spiders import Spider 
from tutsplus.items import TutsplusItem 
from scrapy.http import Request 
import re 

class MySpider(Spider): 
    name   = "tutsplus" 
    allowed_domains = ["code.tutsplus.com"] 
    start_urls  = ["http://code.tutsplus.com/"] 

    def parse(self, response): 
     links = response.xpath('//a/@href').extract() 

     # We stored already crawled links in this list 
     crawledLinks = [] 

     # Pattern to check proper link 
     # I only want to get tutorial posts 
     linkPattern = re.compile("^\/tutorials\?page=\d+") 

     for link in links: 
     # If it is a proper link and is not checked yet, yield it to the Spider 
      if linkPattern.match(link) and not link in crawledLinks: 
       link = "http://code.tutsplus.com" + link 
       crawledLinks.append(link) 
       yield Request(link, self.parse) 

     titles = response.xpath('//a[contains(@class, "posts__post-title")]/h1/text()').extract() 
     for title in titles: 
      item = TutsplusItem() 
      item["title"] = title 
      yield item 
関連する問題