相信GitHub对于每一个从事开发的人都不会陌生,这里是技术人的乐园,在学校学习实践的时候经常会需要从这里查找相关的项目,遇上很好的或者是感兴趣的项目往往想要下载下来运行体验一番,在这个过程中往往会出现下载失败的问题,这里很大的一部分原因就是网速不稳定以及网速很低的问题,在这里我之前的一篇博客《GitHub网站项目下载速度过慢、下载失败问题成功解决》已经提供了两种亲测可行的解决方案,需要的话可是拿去使用。
想要下载GitHub中的某个项目,最常见的有两种形式:
1、在Git的命令行中使用"git clone 指定项目链接"的方式进行下载
2、就是借助界面的操作,如下图所示,点击红色方框里面的按钮即可下载。
看到这里,不禁想:能不能基于Python实现项目的自动下载呢?当然是木有问题的了
基于Python实现指定项目的下载就是抓取了项目下载的链接之后模拟网络请求就可以了,思想很简单,具体的代码实现如下所示:
def single(username,projectname,path,branch_name='master'): ''' 单个项目处理模块 ''' #代理构建 header_list=generate_random_UA(num=100) headers={'User-Agent':random.choice(header_list)} ip_proxy=random.choice(ip_list) one_type,one_ip,one_port=ip_proxy[0],ip_proxy[1],ip_proxy[2] proxy={one_type:one_type+'://'+one_ip+':'+one_port} url='https://codeload.github.com/{}/{}/zip/{}'.format(username,projectname,branch_name) filename=path+'/'+projectname zipfile_name=filename+'.zip' data=None try: data=urllib2.urlopen(url) with open(zipfile_name,'wb') as f: f.write(data.read()) with zipfile.ZipFile(zipfile_name, 'r') as f: f.extractall(path+'.') print('geting http://github.com/'+username+'/'+projectname) except (urllib.error.URLError): try: headers['Host']='github.com' request=requests.get('https://github.com/{}/{}'.format(username,projectname), headers=headers,proxies=proxy,timeout=5) response=urllib2.urlopen(request) pattern='/{}/{}/tree/(.*?)/'.format(username,projectname) b_name=re.findall(pattern, str(response.read()))[-1] single(username,projectname,path,b_name) except Exception as e: print('Exception: ',e) pass
参数说明如下,其中:
username:用户名projectname:项目名path:保存路径
基于命令的启动形式对于操作来说不是很方便,这里基于GUI实现了简单的界面可以方便地进行使用了,效果图如下所示:
源码后续整理后上传我的GitHub,需要的话留言告知,我后续提供下载链接。