基于C#百度图片批量下载工具的实现

在家没网,无聊怎么办?不如来看点美女图片吧,网络快时批量下载,有空时慢慢看,嘿嘿,本人是个好人。于是这个工具的实现,那简直是迫在眉睫啊,来看看是怎么实现的吧。

先上图片吧:

这是软件的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下可以直接跑的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 17:01:10

基于C#百度图片批量下载工具的实现的相关文章

自己动手写工具:百度图片批量下载器

开篇:在某些场景下,我们想要对百度图片搜出来的东东进行保存,但是一个一个得下载保存不仅耗时而且费劲,有木有一种方法能够简化我们的工作量呢,让我们在离线模式下也能爽爽地浏览大量的美图呢?于是,我们想到了使用网络抓取去帮我们去下载图片,并且保存到我们设定的文件夹中,现在我们就来看看如何来设计开发一个这样的图片批量下载器. 一.关于网络抓取与爬虫 网络蜘蛛的主要作用是从Internet上不停地下载网络资源.它的基本实现思想就是通过一个或多个入口网址来获取更多的URL,然后通过对这些URL所指向的网络资

Light Image Resizer(5.1.2.0)图片批量处理工具便携已注册版

之前也分享过这类图片批量处理工具,都还可以,今天就在来分享一个,这次的ui界面鸡哥感觉还行,今天介绍的这个工具是Light Image Resizer,它可以把一张或多张图片批量改大小,只需要把那些图片拖到工具中,工具允许你将各种特效应用到图片种例如褪色色调.还可以批量给图片加水印.Light Image Resizer内置常用显示器分辨率,而且可以自动检测当前显示器的分辨率,可以帮您快速制作数张适合你屏幕的桌面壁纸.除此之外Light Image Resizer还内置图片压缩.批量转换功能,内

免费百度地图矢量下载工具V5.7使用文档

免费百度地图矢量下载工具V5.7发布了,可以在 https://download.csdn.net/download/niudieyi/10669822 下载.没有CSDN积分的可以加QQ群 732173652 下载.主要更新为POI下载提供简单和复杂版本的关键字.同时提供了软件使用文档. 最近闲来无事,写了一个使用文档.内容如下: 免费百度地图矢量数据爬取器V5.7使用手册 一.软件安装 软件无需安装,直接运行文件夹下的 "百度地图矢量数据下载.exe" 即可 二.软件使用 软件主界

Mipony 免费的网络硬盘批量下载工具,下载网盘文件省时省力!

现在用网盘分享文件的人越来越多了,所以异次元之前推出了一个“找文件网盘搜索引擎“方便大家查找下载资源.如果你常常下载一些网盘的资源,你肯定会发现大多数国外网盘免费下载时都需要等待一定倒数时间的,往往下载多个文件时间会变得很长而且相当麻烦. Mipony 是一款免费的网盘批量下载工具,和 FreeRapid 类似,可以让你方便快速从网盘上下载文件,省去烦人的等待和弹窗广告,还能复制多个地址进行批量下载…… MiPony的特性: Mipony 目前支持近80个国内外流行的网络硬盘,包括国内最热门的1

Node.js meitulu图片批量下载爬虫1.01版

在 http://www.cnblogs.com/xiandedanteng/p/7614051.html 一文我曾经书写过一个图片下载爬虫,但原有程序不是为下载图片而设计故有些绕,于是稍微改写了一下,可读性应该稍好些.功能上和原程序差不多,只是输出目录不是固定在test目录了.代码如下: //================================================ // https://www.meitulu.com图片批量下载Node.js爬虫1.01 // 2017

Node.js meitulu图片批量下载爬虫1.06版

//====================================================== // https://www.meitulu.com图片批量下载Node.js爬虫1.06 // 1.00 完成图片爬虫,手动输入页数和目录 // 1.01 改写. // 1.02 手动输入页面url,然后自动解析 // 1.03 从命令行获得页面url,然后自动解析 // 1.04 解决数量节点位置不固定bug和输入状态不退出bug // 1.05 增加自动模式和手动模式 // 1

Node.js meitulu图片批量下载爬虫1.03版

//====================================================== // https://www.meitulu.com图片批量下载Node.js爬虫1.03 // 1.01 手动输入页数和目录 // 1.02 手动输入页面url,然后自动解析 // 1.02 从命令行获得页面url,然后自动解析 // 2017年11月6日 //====================================================== // 内置h

Node.js nvshens图片批量下载爬虫 1.00

//====================================================== // www.nvshens.com图片批量下载Node.js爬虫1.00 // 此程序与meitulu爬虫类似,先写个架子在这里 // 2017年11月9日 //====================================================== // 内置https模块 var https=require("https"); // 内置文件处理模

Node.js abaike图片批量下载Node.js爬虫1.00版

这个与前作的差别在于地址的不规律性,需要找到下一页的地址再爬过去找. //====================================================== // abaike图片批量下载Node.js爬虫1.00 // 2017年11月9日 //====================================================== // 内置http模块 var http=require("http"); // 内置文件处理模块,用于创