Scrapy 爬行蜘蛛 returns 损坏的网址

Scrapy crawl spider returns broken urls

我正在尝试创建一个简单的爬行蜘蛛,但 response.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 后面的字符串?搞砸了,我不知道哪里出了问题。

LinkExtractor 有一个名为 canonicalize 的选项,默认为 True。

像这样将其设置为 False:

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

这将阻止 LinkExtractor 对 canonicalize_url 的 def 中描述的 url 进行更改。