2015-09-26 43 views
0

IM使用Scrapyto抓取德国论坛:http://www.musikerboard.de/forumScrapy:URL错误,程序增加了不必要的字符(URL代码)

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

问题:在爬行它使我对ultiple threadlinks错误:

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

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

然后,如果你丰富您urlfunc功能与手动调试语句(和增加日志级别以INFO看到效果更好),那么你将看到的网址不要以这些字符结尾,因为只有在将其称为网站时才会转换字符串。

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

这resulst在下面的输出:

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() 

在这种情况下,你没有得到任何调试信息,这告诉你,这个网站没有被发现。

+0

它与此合作,谢谢。 – user3811872

+0

而且我了解到'process_value'应用于'url encoding'之前。 –

1

如果空格和标签是在HTML代码中可能发生这种情况。

你可以通过使用LinkExtractorprocess_value清洁URL和做类似:

... 
Rule(LinkExtractor(allow=(r'threads/\w+',)), callback='parse_thread', process_value=clean_url) 
... 

def clean_url(value): 
    value = value.replace(u'%0A', '') 
    value = value.replace(u'%09', '') 
    return value 
+0

我更新了代码现在的过程值,但不知何故它不应该像它应该。 (其中还有Charakter的URL)。我甚至更新了拒绝正则表达式的规则,但它不会工作。也许这与网站有关? – user3811872