60行代码GitHub项目多线程批量下载爬虫

2022-07-14 14:56:55 浏览数 (1)

输入关键词及页数,然后开启多线程下载,保存到代码目录下的gitdown,文件命名为项目名

代码语言:javascript复制
# -*- 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)

0 人点赞