当前位置:网站首页 > 更多 > 编程开发 > 正文

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

作者:CC下载站 日期:2020-06-24 00:00:00 浏览:69 分类:编程开发

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

#-*-coding:utf-8-*-
"""
-------------------------------------------------
@Author:Lan
@Blog:www.lanol.cn
@Date:2020/6/24
@Description:GitHub搜索关键词批量下载
-------------------------------------------------
"""
importos
importthreading

fromparselimportSelector
fromrequestsimportget

#基础URL,因为后面有很多重复的,所以到时候就直接拼接
baseurl='https://github.com'
#请求头,用来反反爬
headers={
'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/83.0.4103.116Safari/537.36',
}


#获取项目链接
defget_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=[nealfornealin
response.xpath("//div[@class='f4text-normal']/a[@class='v-align-middle'][email protected]").extract()]
#返回结果URL
returnresult_urls


#开启下载
defdown(url,name):
#判断文件夹是否存在,如果不存在则创建
ifnotos.path.exists('gitdown'):
os.makedirs('gitdown')
#输出目前进度
print(f'正在下载{name}')
#打开这个文件,为写入字节(wb)的方式
withopen(f'gitdown/{name[:10]}.zip','wb')asf:
#写入获取到的content
f.write(get(url=url,headers=headers).content)
#输出目前进度
print(f'下载{name}结束')


#获取下载链接,并多线程下载
defget_downurl(urls):
#因为GitHub有一个规律就是下载链接都是项目名然后放到https://github.com/{项目名}/archive/master.zip,然后就传给下载的def开启线程下载
forindex,iinenumerate(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
foriinrange(int(nums)):
#传入关键字和页码
urls=get_url(i,keyword)
get_downurl(urls)

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯