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

 Lan   2020-06-24 18:35   401 人阅读  0 条评论

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

image.png

# -*- 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)
本文地址:https://www.lanol.cn/post/304.html
版权声明:本文为原创文章,版权归 Lan 所有,欢迎分享本文,转载请保留出处!

 发表评论


表情

还没有留言,还不快点抢沙发?