基於C#的百度圖片批量下載工具
阿新 • • 發佈:2019-02-10
在家沒網,無聊怎麼辦?不如來看點美女圖片吧,網路快時批量下載,有空時慢慢看,嘿嘿,本人是個好人。於是這個工具的實現,那簡直是迫在眉睫啊,來看看是怎麼實現的吧。
先上圖片吧:
這是軟體的WinForm介面,基於C#實現。
上程式碼,也就100多行。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace 圖片下載器 { public partial class Form1 : Form { private string dir; public Form1() { Control.CheckForIllegalCrossThreadCalls = false;//這種方法不推薦使用,即不檢查跨執行緒操作,應該使用委託的 InitializeComponent(); } private void butSelect_Click(object sender , EventArgs e) { FolderBrowserDialog dlg = new FolderBrowserDialog(); if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) { textDir.Text = dlg.SelectedPath; } } public static int pagecount = 1; private void Showpages() { this.textShow.AppendText("目前正在下載第" + pagecount + "頁\n"); } private void butStart_Click(object sender , EventArgs e) { string key = textKeyWords.Text; if (string.IsNullOrEmpty(key)) {//檢測關鍵字 MessageBox.Show("請輸入關鍵詞!"); return; } if (string.IsNullOrEmpty(textDir.Text)) {//檢測路徑 MessageBox.Show("請選擇路徑!"); return; } dir = textDir.Text; if (!dir.EndsWith("\\")) { dir = dir + "\\"; } Thread thread = new Thread(() => {//啟動一個新執行緒 process(key); }); thread.Start();//執行緒啟動 } private void process(string key) { int count = (int)numericUpDown.Value;//請求的頁面數量 for (int i = 0 ; i < count ; i++) { pagecount = i + 1; Showpages(); HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://image.baidu.com/search/avatarjson?tn=resultjsonavatarnew&ie=utf-8&word=" + Uri.EscapeUriString(key) + "&cg=girl&pn=" + (i + 1) * 60 + "&rn=60&itg=0&z=0&fr=&width=&height=&lm=-1&ic=0&s=0&st=-1&gsm=360600003c"); using (HttpWebResponse res = (HttpWebResponse)req.GetResponse()) { if (res.StatusCode == HttpStatusCode.OK) { using (Stream stream = res.GetResponseStream()) { try { download(stream); } catch (Exception e) { textShow.BeginInvoke(new Action(() => { textShow.AppendText(e.Message + Environment.NewLine); })); } } } else { MessageBox.Show("獲取第" + i + "頁失敗!" + res.StatusCode); } } } } private void download(Stream stream) { using (StreamReader reader = new StreamReader(stream)) { string json = reader.ReadToEnd(); JObject objRoot = (JObject)JsonConvert.DeserializeObject(json); JArray imgs = (JArray)objRoot["imgs"]; for (int j = 0 ; j < imgs.Count ; j++) { JObject img = (JObject)imgs[j]; string objUrl = (string)img["objURL"];//http://hibiadu....../1.jpg // textShow.AppendText(objUrl + Environment.NewLine); //儲存的路徑是:destDir; try { DownloadImage(objUrl);//避免一個方法中的程式碼過於複雜 } catch (Exception ex) { //子執行緒的程式碼中操作介面控制元件要使用BeginInvoke textShow.BeginInvoke(new Action(() => { textShow.AppendText(ex.Message + Environment.NewLine); })); } } } } private void DownloadImage(string objUrl) { //得到儲存的路徑 string path = Path.Combine(dir , Path.GetFileName(objUrl)); HttpWebRequest req = (HttpWebRequest)WebRequest.Create(objUrl); req.Referer = "http://image.baidu.com/";//欺騙網站伺服器這是從百度圖片發出的 using (HttpWebResponse res = (HttpWebResponse)req.GetResponse()) { if (res.StatusCode == HttpStatusCode.OK) { using (Stream stream = res.GetResponseStream()) using (Stream filestream = new FileStream(path , FileMode.Create)) { stream.CopyTo(filestream); } } else { throw new Exception("下載失敗" + res.StatusCode); } } } } }
右擊檢視圖片,即可檢視大圖。
最終效果就是這個樣子,如何,自我感覺還是可以的。
百度網盤下載:http://pan.baidu.com/s/1kT3YzXl密碼: gafi
第一個為本程式的整個解決方案,第二個為本程式編譯後的可執行程式,Windows下可以直接跑的。