2013-03-19 20 views
10

Non riesco a eseguire la scansione di tutto il sito Web, Scrapy si limita a strisciare in superficie, voglio strisciare più a fondo. Stato googling per le ultime 5-6 ore e nessun aiuto. Il mio codice qui sotto:Scrapy - Scansiona tutto il sito web

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) 

Si prega di aiutare !!!!

Grazie, Abhiram

+1

Ho appena provato il tuo codice contro StackOverflow - il mio IP è stato bannato. Funziona sicuramente! :) – alecxe

+0

@Alexander - Sembra incoraggiante per me eseguire il debug di più :) :) ... Mi dispiace per l'IP ban mate! –

+0

Stai davvero cercando di eseguire la scansione di example.com? Sai che non è un vero sito web. –

risposta

6

Regole di corto circuito, il che significa che la prima regola un collegamento soddisfa saranno la regola che viene applicata, la tua seconda regola (con callback) non sarà chiamato.

cambiare le regole a questo:

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

@All - Ho funzionato ... Steven aveva ragione e grazie per l'aiuto! Ma non sono in grado di eseguire la scansione di tutto il sito, sono appena riuscito a scansionare circa 80 pagine strane. Qualcosa che deve essere corretto? Ecco la mia versione funzionante: (Rule (SgmlLinkExtractor (allow = ('pages /')), follow = True, callback = 'parse_item'),) –

+0

ciao! ti dispiacerebbe dare un aiuto su questo? http: //stackoverflow.com/questions/31630771/scrapy-linkextractor-duplicating – yukclam9

+0

@Steven Almeroth Ciao Steven Puoi aiutare in questo http://stackoverflow.com/questions/37717122/grabbed -data-da-un-dato-url-e-put-it-in-un-file-using-scrapy Ho provato con le modifiche nella regola ma non ha funzionato per me. – nand

2

Durante l'analisi del start_urls, gli URL più profondi possono essere analizzati dal tag href. Quindi, è possibile ottenere una richiesta più profonda nella funzione parse(). Here is a simple example. Il codice sorgente più importante è mostrato di seguito:

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