2013-03-19 12 views
10

Nie mogę zaindeksować całej strony, Scrapy tylko indeksuje się na powierzchni, chcę się czołgać głębiej. Byłem w Google przez ostatnie 5-6 godzin i bez pomocy. Mój kod poniżej:Scrapy - Indeksowanie całej witryny

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) 

Proszę o pomoc!

Dzięki, Abhiram

+1

Właśnie wypróbowałem twój kod przeciw stackoverflow - mój ip został zbanowany. To na pewno działa! :) – alecxe

+0

@Alexander - Brzmi zachęcająco dla mnie do debugowania więcej :) :) ... Przepraszamy na IP ban mate! –

+0

Naprawdę próbujesz zaindeksować example.com? Wiesz, że to nie jest prawdziwa strona internetowa. –

Odpowiedz

6

Zasady zwarcie, co oznacza, że ​​pierwsza reguła A spełnia link będzie reguła, która zostanie zastosowana, drugi Rule (z zwrotnego) nie zostanie wywołana.

Zmień swoje zasady to:

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

@All - Got it working ... Steven miał rację i dzięki za pomoc! Ale nie mogę zaindeksować całej witryny, ale udało mi się zaindeksować około 80 nieparzystych stron. Coś, co należy poprawić? Oto moja wersja robocza: (Reguła (SgmlLinkExtractor (allow = ('pages /')), follow = True, callback = 'parse_item'),) –

+0

cześć! Czy mógłbyś udzielić pomocy w tej sprawie? http: //stackoverflow.com/questions/31630771/scrapy-linkextractor-duplicating – yukclam9

+0

@Steven Almeroth Hi Steven Czy możesz pomóc w tym http://stackoverflow.com/questions/37717122/grabbed -data-from-a-given-url-and-put-it-into-a-file-using-scrapy Próbowałem zmian reguł, ale to nie działało dla mnie. – nand

2

Podczas analizowania start_urls żądane adresy URL mogą być przetwarzane przez tag href. Następnie można uzyskać głębsze żądanie w funkcji parse(). Here is a simple example. Najważniejszy kod źródłowy jest pokazany poniżej:

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