您的位置:首页 > 运维架构 > 网站架构

如何批量下载一些网站上的压缩包或者图片

2018-01-23 16:12 465 查看
 因为项目需要,我们需要从网上下载很多图片来做为数据集测试项目,经过一些研究,实现了批量下载ImageNet上的图片的程序在这里分享一个批量下载ImageNet图片的经验,其实这个例子适用于很多你知道下载资源命名规则的场合。举一个简单的例子,假如你需要从一个网站批量下载几个图片的压缩包,他们的命名是:1,2,3,4,5,6,7,8,9.那么你只需要在Http请求中对应的地方修改下载资源的命名就能从新下载了。那么实现批量下载呢,这里利用的是谷歌浏览器来实现的。
 ImageNet是比较特殊的一个数据集网站,它有它自己的独特的命名方式(使用的),并且我们能下载到我们需要下载的资源包的名字,如果在其它网站下载东西的时候你不能直接得到的话,就需要爬取到这些名称(可以
使用集搜客等爬虫工具),或者是掌握他们的命名规律。
 为了标识同义词,ImageNet使用WordNet3.0来对命名,他们使用"WordNet ID"来对(wnid)命名文件,这是wordNet
的POS和SYNSET OFFSET的级联,并且ImageNET只考虑名词,所以只要获取到同义词集合(synset)就能下载了,你需要下
载你想要的synset集合,详情请了解 点这里。下载所有synset与wordNetID的映射点这里,以及word'NetID和synset的映射
点这里。我们使用谷歌浏览器来下载,你需要找到你的谷歌浏览器的安装路径下的exe文件比如我的是:
C:/Users/someone/AppData/Local/Google/Chrome/Application/chrome.exe
只要安装了谷歌浏览器的都会有chrome.exe这个可执行文件,并且它在启动的时候有很多可选参数,你可以针对你的需要选择
Chrome.exe的参数选择请参照点这里,这里选择了两个参数:--process-per-tab  --app 。
前者是使每个下载都会在新窗口中打开,第二个是使用默认的应用程序打开模式。因为下载的时候都是弹出一个窗口之后就关
闭,这样打开的话比较方便使用openMP并行加速。
详细的代码:

#pragma once
#ifndef  MAIN
#define MAIN
#include <iostream>
#include <fstream>
#include <windows.h>
#include <vector>
#include <string>
#include <omp.h>
#include <io.h>
int main(int argc, char** argv)
{

//文件
std::vector<std::string>files;
std::ifstream infile("D:/ImageNet/ImageNet关键字.txt");
if (!infile)
{
std::cout << "打开文件错误" << std::endl;
}
while (!infile.eof())
{
char info[200];
infile.getline(info, 200);
files.push_back(std::string(info));
}
char exe[] = "C:/Users/someone/AppData/Local/Google/Chrome/Application/chrome.exe   --process-per-tab  --app";
char searchPath[] = "D:/ImageNet";
int i = 0;
#pragma omp parallel num_threads(5) private(i) shared(files)
{
#pragma omp for schedule(dynamic) //dynamic
for (i = 0;i < files.size();i++)
{
char filesName[] = "";
sprintf(filesName, "%s/%s.tar", searchPath, files[i].c_str());
intptr_t  info = 0;
struct _finddata_t fileInfo;

char url[] = "";
info = _findfirst(filesName, &fileInfo);
if (info == -1L)
{
sprintf(url, "%s http://www.image-net.org/download/synset?wnid=%s&username=yourName&accesskey=yourKey&release=latest&src=stanford", exe, files[i].c_str());
WinExec(url, 0);
}
else
{
_findclose(info);
continue;
}
while (1)
{
info = _findfirst(filesName, &fileInfo);
if (info != -1L)
{
std::cout << "find" << std::endl;
_findclose(info);
break;
}
}
}
}
system("pause");
return 0;
}
#endif // ! MAIN

说明:代码中提到的ImageNet的关键词是上面提到的wordNetID连接中赋值放在里面的。openMP加速的操作
不懂的可以看看相关的文章:比如点这里
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: