这里,我遇到了一个困难。请求大神支个招。
我通过遍历网站,获得了我所要下载的资源链接。每个资源文件看起来都是从ftp文件服务器上去抓取的。
![233509_WVzR_243525.png](http://static.oschina.net/uploads/space/2015/0116/233509_WVzR_243525.png)
上面的资源链接为:ftp://med:w7o0nse@60.2.237.172/med66/2014/yaoshi/jichu/yxzh/word/yxzh_jy0501.exe
大神可以帮忙试试看。
我在这方面是菜鸟,我直接用下载一般文件的方式尝试获取文件:
resp = urllib2.urlopen(url) with open(filename, 'w') as wfile: wfile.write(resp.read())
运行报错:
File "/usr/lib/python2.6/ftplib.py", line 223, in voidresp
resp = self.getresp() File "/usr/lib/python2.6/ftplib.py", line 218, in getresp raise error_perm, respurllib2.URLError: <urlopen error ftp error: 550 Failed to change directory.>好像意思是说路径不存在。看来是我想得太简单了。我直接用浏览器点网络提供的下载链接进行下载:
![234051_Bs4U_243525.png](http://static.oschina.net/uploads/space/2015/0116/234051_Bs4U_243525.png)
确实又能下载下来。
我再试了一下,直接将"ftp://med:w7o0nse@60.2.237.172/med66/2014/yaoshi/jichu/yxzh/word/yxzh_jy0501.exe"粘贴到浏览器的地址栏,Enter。结果也能正常下载文件。就然不是用Firefox,用Konqueror浏览器也可以。
哪为什么流览器都办到的事儿,我用程序就死活办不了呢?没理由呀!
我在网上查找资料,对ftp地址了解了一下。原来med为用户名,w7o0nse为登陆密码。于是我用ftp命令再试一下:
ftp> open 60.2.237.172Connected to 60.2.237.172 (60.2.237.172).220 ��ӭ�����л�������У����վ��Name (60.2.237.172:hevake_lcj): med331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> cd /med66/250 Directory successfully changed.ftp> cd /med66/2014/yaoshi/jichu/yxzh/word550 Failed to change directory.ftp> get yxzh_jy0101.exelocal: yxzh_jy0101.exe remote: yxzh_jy0101.exe227 Entering Passive Mode (60,2,237,172,232,214).150 Opening BINARY mode data connection for yxzh_jy0101.exe (-1 bytes).226 File send OK.
结果我查看当前目录,果真有一个叫yxzh_jy0101.exe的文件,但是文件大小为0,等于是空文件。
OOps~
后记:
其实并不是用urllib2下载方法的问题,确实是有部分链接是失效的。这种情况下,我们可以尝试别的链接。
如下为我写的python下载方法,供大家参考:
def download_file(url, filename): print('Download : ' + url) print(' Save as : ' + filename) print(' Process: '), def call_back(blocknum, blocksize, totalsize): if totalsize == 0: return percent = 100.0 * blocknum * blocksize / totalsize if (percent > 100.0): percent = 100.0 print('\b'*7 + '%5.1f%%' % percent), try: temp_filename = filename + '.tmp' urllib.urlretrieve(url, temp_filename, call_back) os.rename(temp_filename, filename) print('\n== Done ==') return True except: print('\n== Error ==') return False pass
谢谢大家的关注!