欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

scrapy urllib.parse 解析含有'/'字符ftp链接时异常的临时处理

程序员文章站 2022-12-22 21:26:53
先给出修改部分代码: urllib.parse 今天应产品需求,将天气数据按天获取,并写入ftp,方便交换任务入库或者直接处理。 天气数据直接使用中国天气预报网的页面解析获取。 然而在写ftp时,看到scrapy官方文档表示 可以直接使用内置的feed storage搞定。 省事当然OK。 sett ......

先给出修改部分代码:

urllib.parse 

def _splitnetloc(url, start=0):
    # modified by liucheng at 20190103
    at_index = url.find('@', start)
    # modified by liucheng
    delim = len(url)   # position of end of domain part of url, default is end
    for c in '/?#':    # look for delimiters; the order is not important
        wdelim = url.find(c, start)        # find first of this delim
        # modified by liucheng at 20190103
        if at_index > 0:
            wdelim = url.find(c, at_index)
        # modified by liucheng
        if wdelim >= 0:                    # if found
            delim = min(delim, wdelim)     # use earliest delim position
    return url[start:delim], url[delim:]   # return (domain, rest)

  

 

今天应产品需求,将天气数据按天获取,并写入ftp,方便交换任务入库或者直接处理。

天气数据直接使用中国天气预报网的页面解析获取。

 

然而在写ftp时,看到scrapy官方文档表示 可以直接使用内置的feed storage搞定。

省事当然ok。

settings.py文件中添加行:

feed_uri = "ftp://xxx/xxx/xxx:password@xxxftp.xxx.com/weather_101020100.text"

  

按照配置,奈何怎么都报错,显示域名解析不正确。

百度异常信息无果。

debug跟进,发现ftp地址解析严重异常。

问题代码部分:

def _splitnetloc(url, start=0):
    delim = len(url)   # position of end of domain part of url, default is end
    for c in '/?#':    # look for delimiters; the order is not important
        wdelim = url.find(c, start)        # find first of this delim
        if wdelim >= 0:                    # if found
            delim = min(delim, wdelim)     # use earliest delim position
    return url[start:delim], url[delim:]   # return (domain, rest)

  这边留着一个坑,只要存在'/',那么就取起始位置start到最新出现的'/'位置delim间的作为域domain。

这导致,当用户名或者密码中存在'/'时,获得的域domain 就是残缺的。

所以对该段逻辑进行了 文首的修改。