1. 程式人生 > >如何批量下載一些網站上的壓縮包或者圖片

如何批量下載一些網站上的壓縮包或者圖片

原創網址: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加速的操作

不懂的可以看看相關的文章:比如點這裡