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

原创网址:http://blog.csdn.net/qq_24864285/article/details/79137514

因为项目需要,我们需要从网上下载很多图片来做为数据集测试项目,经过一些研究,实现了批量下载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加速的操作

不懂的可以看看相关的文章:比如点这里



猜你喜欢

转载自blog.csdn.net/qq_22239043/article/details/79142419
今日推荐