2013-03-19 7 views
10

Ich bin nicht in der Lage, die ganze Website zu crawlen, Scrapy kriecht nur an der Oberfläche, ich möchte tiefer kriechen. Googeln für die letzten 5-6 Stunden und keine Hilfe. Mein Code unten:Scrapy - Crawl ganze Website

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) 

Bitte helfen Sie !!!!

Danke, Abhiram

+1

Ich habe versucht, Ihren Code gegen stackoverflow - meine IP wurde verboten. Es funktioniert definitiv! :) – alecxe

+0

@Alexander - Klingt ermutigend für mich, mehr zu debuggen :) :) ... Sorry auf dem IP-Verbot Kumpel! –

+0

Versuchen Sie wirklich, example.com zu crawlen? Du weißt, das ist keine echte Website. –

Antwort

6

Regeln Kurzschluss, dass die erste Regel die Regel sein bedeutet, die angewendet wird ein Link genügt, Ihre zweite Regel (mit Rückruf) wird nicht aufgerufen werden.

Ihre Regeln zu dieser Änderung:

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

@All - Hat es funktioniert ... Steven hatte Recht und danke für die Hilfe! Aber ich bin nicht in der Lage, die ganze Website zu crawlen, nur in der Lage, rund 80 Seiten zu crawlen. Alles, was korrigiert werden muss? Hier ist meine Arbeitsversion: (Rule (SgmlLinkExtractor (allow = ('pages /')), Folge = True, Callback = 'parse_item'),) –

+0

hi! Würde es Ihnen etwas ausmachen, eine Hilfe zu geben? http: //stackoverflow.com/questions/31630771/scrapy-linkextractor-duplicating – yukclam9

+0

@steven Almeroth Hallo Steven können Sie in diesem http://stackoverflow.com/questions/37717122/grabbed helfen -data-from-a-given-url-and-put-es-in-a-Datei-using-scrapy Ich versuchte mit Änderungen in der Regel, aber es hat nicht für mich funktioniert. – nand

2

Wenn die start_urls Parsen, kann tiefer URLs von dem Tag href analysiert werden. Dann kann eine tiefere Anfrage in der Funktion parse() erbracht werden. Here is a simple example. Der wichtigste Quellcode ist unten gezeigt:

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