如何批量下載一些網站上的壓縮包或者圖片
原創網址: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加速的操作
不懂的可以看看相關的文章:比如點這裡。