Scrapy:URL错误,程序添加不必要的字符(URL代码)

时间:2015-09-26 16:33:11

标签: url web-scraping scrapy http-status-code-404

我正在使用Scrapy来抓取德语论坛:http://www.musikerboard.de/forum

它遵循所有子论坛并从线程中提取信息。

问题:在抓取过程中,它会给我一个多线程链接错误:

2015-09-26 14:01:59 [scrapy] DEBUG: Ignoring response <404 http://www.musiker-board.de/threads/spotify-premium-paket.621224/%0A%09%09>: HTTP status code is not handled or not allowed

除了此部分/%0A%09%09

之外,网址很好

它出现404错误。

我不知道为什么程序会不断将代码添加到URL的末尾

继承我的代码:

def urlfunc(value):
    value = value.replace("%0A", "")
    value = value.replace("%09", "")
    return value

class spidermider(CrawlSpider):
name = 'memberspider'
allowed_domains = ["musiker-board.de"]
start_urls = ['http://www.musiker-board.de/forum/'
              # 'http://www.musiker-board.de/'
              ]  # urls from which the spider will start crawling
rules = (
    Rule(LinkExtractor(allow=(r'forum/\w*',))),
    Rule(LinkExtractor(allow=(r'threads/\w+',),deny=(r'threads/\w+/[\W\d]+'),process_value=urlfunc), callback='parse_thread' ),
)

是否有人解释为什么会一直发生?(及其解决方案)

编辑: 更新的代码

2 个答案:

答案 0 :(得分:2)

如果您进行一些手动调试和研究,您会发现URL末尾的值是元字符。 %0A是换行符,%09是一个水平制表符:http://www.w3schools.com/tags/ref_urlencode.asp

然后,如果您使用手动调试语句丰富urlfunc函数(并将日志级别增加到INFO以更好地查看结果),那么您将看到URL不以这些字符结尾作为一个字符串,只要在将其称为网站时进行转换。

def urlfunc(value):
    print 'orgiginal: ', value
    value = value.replace('%0A', '').replace('%09', '')
    print 'replaced: ', value
    return value

这导致以下输出:

orgiginal:  http://www.musiker-board.de/posts/7609325/

replaced:  http://www.musiker-board.de/posts/7609325/

orgiginal:  http://www.musiker-board.de/members/martin-hofmann.17/
replaced:  http://www.musiker-board.de/members/martin-hofmann.17/

第一个结果和第二个结果之间的行在输出中,因为它们具有元字符。

因此,解决方案是strip值:

def urlfunc(value):
    return value.strip()

在这种情况下,您不会收到任何调试消息,告知您找不到该站点。

答案 1 :(得分:1)

如果html代码中包含空格和制表符,则可能会发生这种情况。

您可以使用URL的{​​{1}}来清除process_value并执行以下操作:

LinkExtractor