2014-01-13 2 views
2

Я установил Правила для получения следующих страниц из start_url, но он не работает, он только сканирует страницу start_urls и ссылки на этой странице (с parseLinks). Он не переходит на следующую страницу, указанную в Правилах.Как я могу перейти на следующую страницу в Scrapy Rules

любая помощь?

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import Selector 
from scrapy import log 
from urlparse import urlparse 
from urlparse import urljoin 
from scrapy.http import Request 

class MySpider(CrawlSpider): 
    name = 'testes2' 
    allowed_domains = ['example.com'] 
    start_urls = [ 
    'http://www.example.com/pesquisa/filtro/?tipo=0&local=0' 
] 

rules = (Rule(SgmlLinkExtractor(restrict_xpaths=('//a[@id="seguinte"]/@href')), follow=True),) 

def parse(self, response): 
    sel = Selector(response) 
    urls = sel.xpath('//div[@id="btReserve"]/../@href').extract() 
    for url in urls: 
     url = urljoin(response.url, url) 
     self.log('URLS: %s' % url) 
     yield Request(url, callback = self.parseLinks) 

def parseLinks(self, response): 
    sel = Selector(response) 
    titulo = sel.xpath('h1/text()').extract() 
    morada = sel.xpath('//div[@class="MORADA"]/text()').extract() 
    email = sel.xpath('//a[@class="sendMail"][1]/text()')[0].extract() 
    url = sel.xpath('//div[@class="contentContacto sendUrl"]/a/text()').extract() 
    telefone = sel.xpath('//div[@class="telefone"]/div[@class="contentContacto"]/text()').extract() 
    fax = sel.xpath('//div[@class="fax"]/div[@class="contentContacto"]/text()').extract() 
    descricao = sel.xpath('//div[@id="tbDescricao"]/p/text()').extract() 
    gps = sel.xpath('//td[@class="sendGps"]/@style').extract() 

    print titulo, email, morada 
+0

Проверьте этот ответ, это позволит решить проблему: http://stackoverflow.com/questions/13227546/scrapy-crawls-first-page-but -does-not-follow-links? answertab = votes # tab-top – Perefexexos

ответ

4

Вы не должны переопределить метод parse из CrawlSpider, в противном случае Rule s не последует.

Смотрите предупреждение на http://doc.scrapy.org/en/latest/topics/spiders.html#crawling-rules

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

+0

Я изменил синтаксический анализ на parsePage и установил обратный вызов Rule на callback = 'parsePage' и знаю, что он не вводит в def parsePage –

+0

Попробуйте использовать 'restrict_xpaths = ('// a [@ id = "seguinte"]')), callback = 'parsePage', follow = True),) ' –

+0

Спасибо, Паул, теперь он работает –

1

Вы используете поток Паук Класс:

class MySpider(CrawlSpider): is not the proper class 
    instead of this use : class MySpider(Spider) 
name = 'testes2' 
allowed_domains = ['example.com'] 
start_urls = [ 
'http://www.example.com/pesquisa/filtro/?tipo=0&local=0' 
] 

In Spider Class you do not need rules. So discard it. 
"Not Usable in Spider Class" rules = (Rule(SgmlLinkExtractor(restrict_xpaths=('//a[@id="seguinte"]/@href')), follow=True),) 
Смежные вопросы