scrapy urllib.parse 解析含有'/'字符ftp链接时异常的临时处理
程序员文章站
2022-05-04 13:30:08
先给出修改部分代码: 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 就是残缺的。
所以对该段逻辑进行了 文首的修改。