吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2757|回复: 20
收起左侧

[其他转载] 爬取妹纸图窗体程序

  [复制链接]
GGsimida 发表于 2020-3-5 17:29
本帖最后由 GGsimIDA 于 2020-3-5 17:56 编辑







3月5日17:55分之前下的朋友,可能代码有问题
是我没测试完全就发上来,很抱歉我的错,现在更新后暂时没发现问题了



看到论坛python和java都有爬妹纸图的

那我觉得C#也必须拥有姓名


水平有限也没能上多线程
小生不才,也没做过商业项目,代码命名不规范望各位见谅


做的窗体程序可以自由选择想要爬取的类别、数量、起始页等

链接在最下面

编辑器版本是VisualStudio2017



软件窗体

软件窗体



需要注意的是爬取间隔不能太小,我没仔细测试目前发现一秒一张图片没被拒绝

请求太频繁会被网站拒绝,就会生成一堆的空文件夹或者里面图片不全

爬取数量如果为0,就是爬取99999999(四舍五入等于一直爬吧)

第几页开始可以不填就默认从第一页开始

爬取数量的单位是套,不是张,网站里一套图可能有几十张

图片保存路径是:程序所在目录\开始爬取时时间\套图标题\
刚刚发现的BUG是爬取间隔不能不填,现在已经修改代码默认可以不填,间隔就为一秒

以下是部分代码和下载链接

[C#] 纯文本查看 复制代码
private void StartCrawling_Click(object sender, EventArgs e)
        {
            if (StartCrawling.Text == "开始爬取")
            {
                List<CheckBox> selected = new List<CheckBox>();
                foreach (var item in selection) if (item.Checked) selected.Add(item);
                if (CrawlingQuantity.Text == "" && selected.Count != 0)
                {
                    MessageBox.Show("未选中爬取项或者未输入爬取数量,爬取数量:0 为一直爬取");
                    return;
                }
                StartCrawling.Text = "停止爬取";
                int totalnum = int.Parse(CrawlingQuantity.Text);
                if (totalnum == 0) totalnum = 999999999;
                progressBar1.Maximum = totalnum;
                GetTotalUrl(totalnum,selected);
            }
            else
            {
                StartCrawling.Text = "开始爬取";
            }
        }

        private string DownloadHtml(string url, string referer)
        {
            string result = "";
            HttpWebRequest request;
            try
            {
                request = (HttpWebRequest)HttpWebRequest.Create(url);
                request.Referer = referer;
                request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36";
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream stream = response.GetResponseStream();
                StreamReader reader = new StreamReader(stream);
                result = reader.ReadToEnd();
                stream.Close();
                reader.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            return result;
        }

        private void GetTotalUrl(int num, List<CheckBox> selection)
        {
            if (StartCrawling.Text == "开始爬取") return;
            int avgnum = num / selection.Count;
            int reminder = num % selection.Count;
            foreach (var item in selection)
            {
                string url = "";
                int realnum = avgnum;
                classification.TryGetValue(item.Text, out url);
                if (reminder > 0)
                {
                    realnum++;
                    reminder--;
                }
                if (int.Parse(BeginPage.Text) > 1 && BeginPage.Text != "") url += "page/" + BeginPage.Text;
                GetUrl(realnum, url);
            }
            progressBar1.Value = 0;
            MessageBox.Show("爬取完毕!");
            StartCrawling.Text = "开始爬取";
        }

        private void GetUrl(int totalnum,string url)
        {
            int num = 0;
            string htmlCode = DownloadHtml(url, "https://www.mzitu.com/");
            if (htmlCode == "") return;
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(htmlCode);
            HtmlNodeCollection postlist = doc.DocumentNode.SelectNodes("//div[starts-with(@class,'postlist')]");
            HtmlNodeCollection pins = postlist[0].SelectSingleNode("ul").SelectNodes("li");
            string rootPath = System.Environment.CurrentDirectory + "\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + "\\";  //保存路径为:程序所在目录+开始爬取时的时间
            foreach (var li in pins)
            {
                if (StartCrawling.Text == "开始爬取") return;
                if (num == totalnum) break;
                if (li.GetAttributeValue("class", "" != "box"))
                {
                    string path = rootPath + li.SelectSingleNode("a").SelectSingleNode("img").GetAttributeValue("alt", "");
                    if (!Directory.Exists(path)) Directory.CreateDirectory(path);
                    DownloadImg(path, li.SelectSingleNode("a").GetAttributeValue("href", ""), li.SelectSingleNode("a").GetAttributeValue("href", ""),url);
                    progressBar1.Value++;
                    num++;
                }
            }
            if (num < totalnum)
            {
                HtmlNode navlinks = doc.DocumentNode.SelectSingleNode("//a[starts-with(@class,'next page-numbers')]");
                if (navlinks == null) return;
                GetUrl(totalnum - num, navlinks.GetAttributeValue("href", ""));
            }
        }

        private void DownloadImg(string path, string url, string f_url,string referer)
        {
            if (StartCrawling.Text == "开始爬取") return;
            string htmlCode = DownloadHtml(url,referer);
            if (htmlCode == "") return;
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(htmlCode);
            HtmlNode mainimage = doc.DocumentNode.SelectSingleNode("//div[starts-with(@class,'main-image')]").SelectSingleNode("p").SelectSingleNode("a").SelectSingleNode("img");
            string imgurl = mainimage.GetAttributeValue("src", "");
            HttpWebRequest request;
            try
            {
                request = (HttpWebRequest)HttpWebRequest.Create(imgurl);
                request.Referer = referer;
                request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36";
                request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9";
                request.ContentType = "image/jpeg";
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream stream = response.GetResponseStream();
                Image img = Image.FromStream(stream);
                img.Save(path + "\\" + doc.DocumentNode.SelectSingleNode("//h2[starts-with(@class,'main-title')]").InnerText + ".jpg");
                stream.Close();
            }
            catch
            {
                MessageBox.Show("软件请求过于频繁被服务器拒绝,请停止爬取后调高爬取间隔。");
                return;
            }
            HtmlNodeCollection pagenavi = doc.DocumentNode.SelectSingleNode("//div[starts-with(@class,'pagenavi')]").SelectNodes("span");
            int page = 0;
            foreach (var item in pagenavi) if (item.Attributes.Count == 0) page = int.Parse(item.InnerText);
            page++;
            string new_url = f_url + "/" + page.ToString();
            float sleepTime = float.Parse(Interval.Text) * 1000;
            System.Threading.Thread.Sleep((int)sleepTime);
            Application.DoEvents();
            if (doc.DocumentNode.SelectSingleNode("//a[starts-with(@href,'" + new_url + "')]") != null) DownloadImg(path, new_url, f_url,url);
        }



链接: https://pan.baidu.com/s/1Cm07q7pj09OzdCJbEs-anQ 提取码: skjc
蓝奏云链接:https://www.lanzouj.com/i9yt2od


很抱歉,刚刚有个BUG没发现就发上来了,现在已经修复,链接已经更新大家可以放心下载

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| GGsimida 发表于 2020-3-5 17:57
yanglixu 发表于 2020-3-5 17:47
凡是我看不懂的,都被我封为大神。但,你这大神能考虑下小白的感受吗?有个实例来看看岂不是更直观?

应板块规则,此板块不能成品。。。
xihua 发表于 2020-3-5 18:49
GGsimida 发表于 2020-3-5 17:58
很抱歉刚刚发的版本代码有BUG,现在更新了

妹子图的图好小,应该爬这里:https://www.meitulu.com/
第七只海东青 发表于 2020-3-5 17:45
yanglixu 发表于 2020-3-5 17:47
凡是我看不懂的,都被我封为大神。但,你这大神能考虑下小白的感受吗?有个实例来看看岂不是更直观?
孤独色的夜 发表于 2020-3-5 17:49
大哥,牛啊······
jinyangwang 发表于 2020-3-5 17:50
文件被删了???
liu8501 发表于 2020-3-5 17:51
感谢分享好思路
明主 发表于 2020-3-5 17:55
抓取妹子图片?不是很明白
 楼主| GGsimida 发表于 2020-3-5 17:56
jinyangwang 发表于 2020-3-5 17:50
文件被删了???

很抱歉刚刚发的版本代码有问题,现在更新
 楼主| GGsimida 发表于 2020-3-5 17:58
liu8501 发表于 2020-3-5 17:51
感谢分享好思路

很抱歉刚刚发的版本代码有BUG,现在更新了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-17 00:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表