输入关键词及页数,然后开启多线程下载,保存到代码目录下的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("请输入要下载的关键词:\n>>>")
nums = input("请输入要下载的页数:\n>>>")
# 循环调用获取url
for i in range(int(nums)):
# 传入关键字和页码
urls = get_url(i, keyword)
get_downurl(urls)