输入关键词及页数,然后开启多线程下载,保存到代码目录下的gitdown,文件命名为项目名
# -*- coding: utf-8 -*- """ ------------------------------------------------- @ Author :Lan @ Blog :www.lanol.cn @ Date : 2020/6/24 @ Description:GitHub搜索关键词批量下载 ------------------------------------------------- """ import os import threading from parsel import Selector from requests import get # 基础URL,因为后面有很多重复的,所以到时候就直接拼接 baseurl = 'https://github.com' # 请求头,用来反反爬 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36', } # 获取项目链接 def get_url(p, q): # 拼接URL,这里是搜索的URL # p是页码,q是关键词 url = f'{baseurl}/search?p={p}&q={q}&type=Repositories' # 获取搜索结果的html源码,并保存为text给response response = get(url=url, headers=headers).text # 将response转成可以进行Xpath的东西 response = Selector(response) # 列表生成式:因为url有很多个,所以直接这样子就可以自动加到一个列表 result_urls = [neal for neal in response.xpath("//div[@class='f4 text-normal']/a[@class='v-align-middle']/@href").extract()] # 返回结果URL return result_urls # 开启下载 def down(url, name): # 判断文件夹是否存在,如果不存在则创建 if not os.path.exists('gitdown'): os.makedirs('gitdown') # 输出目前进度 print(f'正在下载{name}') # 打开这个文件,为写入字节(wb)的方式 with open(f'gitdown/{name[:10]}.zip', 'wb') as f: # 写入获取到的content f.write(get(url=url, headers=headers).content) # 输出目前进度 print(f'下载{name}结束') # 获取下载链接,并多线程下载 def get_downurl(urls): # 因为GitHub有一个规律就是下载链接都是项目名然后放到https://github.com/{项目名}/archive/master.zip,然后就传给下载的def开启线程下载 for index, i in enumerate(urls): i = threading.Thread(target=down, args=(f'{baseurl}/{i}/archive/master.zip', i.replace('/', '-')[1:])) i.start() if __name__ == '__main__': # 获取用户需求数据 keyword = input("请输入要下载的关键词: >>>") nums = input("请输入要下载的页数: >>>") # 循环调用获取url for i in range(int(nums)): # 传入关键字和页码 urls = get_url(i, keyword) get_downurl(urls)
是已经失效了吗