【问题标题】:Scrapy: URL error, Program adds unnecessary characters(URL-codes)Scrapy:URL 错误,程序添加了不必要的字符(URL 代码)
【发布时间】:2015-12-24 07:14:11
【问题描述】:

我正在使用 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

除了/%0A%09%09这一部分之外,URL都很好

它给出了 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' ),
)

有人解释为什么它会一直发生吗?(以及解决方案)

编辑: 更新代码

【问题讨论】:

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


    【解决方案1】:

    如果您进行一些手动调试和研究,您会发现 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()
    

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

    【讨论】:

    • 我了解到process_valueurl encoding 之前应用。
    【解决方案2】:

    如果 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
    

    【讨论】:

    • 我现在用进程值更新了代码,但不知何故它不能正常工作。 (仍然有包含这些字符的 URL)。我什至用拒绝正则表达式更新了规则,但它不起作用。也许它与网站有关?
    猜你喜欢
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2019-02-03
    • 2014-10-22
    相关资源
    最近更新 更多