2013-03-19 2 views
10

Я не могу сканировать весь сайт, Scrapy просто ползет на поверхность, я хочу глубже проползать. Был поиск в Интернете за последние 5-6 часов и никакой помощи. Мой код ниже:Scrapy - Crawl весь сайт

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

Просто попробовал свой код против stackoverflow - мой ip был заблокирован. Это определенно работает! :) – alecxe

+0

@Alexander - Звучит обнадеживающе для меня, чтобы отлаживать больше :) :) ... Извините, что я нападаю на IP! –

+0

Вы действительно пытаетесь просканировать example.com? Вы знаете, что это не настоящий веб-сайт. –

ответ

6

Правила короткого замыкания, а это означает, что первое правило ссылку удовлетворяет будет правило, которое будет применяться, ваше второе правило (с обратным вызовом) не будет вызываться.

Измените правила к этому:

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

@All - Получил это работу ... Стивен был прав и благодарит за помощь! Но я не могу сканировать весь сайт, просто смог пролезать около 80 нечетных страниц. Все, что нужно исправить? Вот моя рабочая версия: (Правило (SgmlLinkExtractor (allow = ('pages /')), follow = True, callback = 'parse_item'),) –

+0

привет! не могли бы вы помочь в этом? http: //stackoverflow.com/questions/31630771/scrapy-linkextractor-duplicating – yukclam9

+0

@Steven Almeroth Hi Steven Вы можете помочь в этом http://stackoverflow.com/questions/37717122/grabbed -data-from-a-given-url-and-put-it-in-a-file-using-scrapy Я пытался с изменением правила, но это не сработало для меня. – nand

2

При разборе start_urls, глубже URLs может быть проанализировано с помощью тега 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 
Смежные вопросы