2015-03-20 4 views
0

Я пытаюсь создать простой сканер обхода, но response.url, кажется, сломан.Scrapy crawl spider возвращает сломанные URL-адреса

Кода я в настоящее время работаю в:

# -*- coding: utf-8 -*- 
import scrapy 
from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors import LinkExtractor 

from teatrorecur.items import TeatrorecurItem 

class Teatrorecurspider(CrawlSpider): 
    name = "teatrorecurspider" 
    allowed_domains = ["cartelera.com.uy"] 
    start_urls = (
     'http://www.cartelera.com.uy/apeliculafunciones.aspx?,,PELICULAS,OBRA,0,26', 
    ) 

    rules = (
     Rule(LinkExtractor(allow=('CINE&OBRA&-1&29',)), callback='parse_item', follow=False), 
     #Rule(LinkExtractor(restrict_xpaths='//a[@href="CINE%2COBRA%2C-1%2C29"]'), follow=False, callback='parse_item'), 
     #Rule(LinkExtractor(allow=('CINE&OBRA&-1&29$',)), callback='parse_item', follow=False), 
    ) 



    def parse_item(self, response): 
     item = TeatrorecurItem() 
     item['url']=response.url 
     yield item 

образец URL я получаю от этого кода

<200 http://www.cartelera.com.uy/apeliculafunciones.aspx?-1=&12415=&29=&CINE=&OBRA=> 

но соответствующий элемент на странице имеет следующее значение HREF

<a href="http://www.cartelera.com.uy/apeliculafunciones.aspx?12415&&CINE&OBRA&-1&29"> 

как вы можете видеть, строка, следующая за .aspx? испорчен, я не знаю, что не так.

ответ

1

У LinkExtractor есть опция с именем canonicalize, которая по умолчанию имеет значение True.

Установите его Ложные следующим образом:

rules = (
    Rule(LinkExtractor(allow=('CINE&OBRA&-1&29',), canonicalize=False), callback='parse_item', follow=False), 
) 

Это предотвратит LinkExtractor от выполнения изменений в URL, описанной в опр из canonicalize_url.

+0

Спасибо! это отлично работало –