Scrapy:URL 错误,程序添加了不必要的字符(URL-代码)
Scrapy: URL error, Program adds unnecessary characters(URL-codes)
我正在使用 Scrapyto 爬取一个德语论坛: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
URL除了这部分没问题/%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' ),
)
有人能解释为什么它一直发生吗?(以及解决方案)
编辑:
更新代码
如果 html 代码中有空格和制表符,则可能会发生这种情况。
您可以使用 LinkExtractor
的 process_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
如果您进行一些手动调试和研究,您会发现 URL 末尾的值是元字符。 %0A
是换行符,%09
是水平制表符:http://www.w3schools.com/tags/ref_urlencode.asp
然后,如果您使用手动调试语句来丰富 urlfunc
函数(并将日志级别提高到 INFO
以更好地查看结果),那么您将看到 URL s 不以这些字符结尾,因为字符串只是在将其称为网站时被转换。
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()
在这种情况下,您不会收到任何告诉您找不到站点的调试消息。
我正在使用 Scrapyto 爬取一个德语论坛: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
URL除了这部分没问题/%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' ),
)
有人能解释为什么它一直发生吗?(以及解决方案)
编辑: 更新代码
如果 html 代码中有空格和制表符,则可能会发生这种情况。
您可以使用 LinkExtractor
的 process_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
如果您进行一些手动调试和研究,您会发现 URL 末尾的值是元字符。 %0A
是换行符,%09
是水平制表符:http://www.w3schools.com/tags/ref_urlencode.asp
然后,如果您使用手动调试语句来丰富 urlfunc
函数(并将日志级别提高到 INFO
以更好地查看结果),那么您将看到 URL s 不以这些字符结尾,因为字符串只是在将其称为网站时被转换。
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()
在这种情况下,您不会收到任何告诉您找不到站点的调试消息。