1.任务背景
数据如图所示:
在浏览器中打开对应的某个ftp链接,如下图所示,目标是将其中红框中的压缩包下载下来,一个ftp下载一个,一条数据对应下载两个压缩包:
2.数据预处理
def changePre(data): #更换url前缀为https hurlsGen=[] #存放所有转换完成的Gen FTP链接 hurlsRef=[] #存放所有转换完成的Ref FTP链接 i=0 while i
3.得到每条转换后的url对应的HTML代码 def getHTMLText(url, code="utf-8"): #得到转换后的每条url对应的HTML代码 try: r = requests.get(url) r.raise_for_status() r.encoding = code return r.text except: return ""
4.分析网页源码
如上图所示,可以发现代码非常简单,所有文件链接都在a标签中。
5.解析HTML代码,提取指定下载文件的文件名。 def parseHTMLText(html): #解析网页源码,提取指定下载文件的文件名 doc=pq(html) #用pyquery提取a标签 a=doc('a') filename='RNG' #默认文件名为RNG for item in a.items(): #遍历所有提取的a标签,根据href属性值,找到指定的下载文件的文件名 if 'protein.gpff.gz' in item.attr('href'): filename=item.attr('href') print(filename) return filename
6.提取待下载的文件,并写在本地文件夹中 def writeFile(basicUrl,filename,filepath,count): filepath1='{0}/{1}'.format(filepath,str(count)+'_'+filename)#本地写入路径 if not os.path.exists(filepath1): with open(filepath1,'wb') as f: file=requests.get(basicUrl+filename) #指定文件的下载链接 if file.status_code==200: #可能有的链接不含指定文件 此时会生成一个空文件,文件名为:序号_RNG f.write(file.content)
7.全部代码: #-*- coding:utf-8 -*- import requests import os from pyquery import PyQuery as pq import pandas as pd from multiprocessing import Pool def getHTMLText(url, code="utf-8"): #得到转换后的每条url对应的HTML代码 try: r = requests.get(url) r.raise_for_status() r.encoding = code return r.text except: return "" def parseHTMLText(html): #解析网页源码,提取指定下载文件的文件名 doc=pq(html) #用pyquery提取a标签 a=doc('a') filename='RNG' #默认文件名为RNG for item in a.items(): #遍历所有提取的a标签,根据href属性值,找到指定的下载文件的文件名 if 'protein.gpff.gz' in item.attr('href'): filename=item.attr('href') print(filename) return filename def writeFile(basicUrl,filename,filepath,count): filepath1='{0}/{1}'.format(filepath,str(count)+'_'+filename)#本地写入路径 if not os.path.exists(filepath1): with open(filepath1,'wb') as f: file=requests.get(basicUrl+filename) #指定文件的下载链接 if file.status_code==200: #可能有的链接不含指定文件 此时会生成一个空文件,文件名为:序号_RNG f.write(file.content) def changePre(data): #更换url前缀为https hurlsGen=[] #存放所有转换完成的Gen FTP链接 hurlsRef=[] #存放所有转换完成的Ref FTP链接 i=0 while i
8.问题: