这次是对2.0的小修补,2.0交互几乎没有,这次添加了进度条,和文本框,同时由于取得的链接主要会出现错误是:webResponse错误。

针对这种情况,设置了

 try
                {
                    webResponse = (HttpWebResponse)webRequest.GetResponse();
                }
                catch(WebException ex)
                {
                    webResponse = (HttpWebResponse)ex.Response;
                }

截取错误信息,这里我们不处理,后续直接判定statecode属性来决定是否还要执行下面的程序。

另外一点变化就是以前是通过将所获取的网页存到文本中去,这次

WebRequest myRequest = WebRequest.Create("http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1466307565574_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=" + Uri.EscapeDataString(keyWord));
            HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
            if (myResponse.StatusCode == HttpStatusCode.OK)
            {
                Stream strm = myResponse.GetResponseStream();
                StreamReader sr = new StreamReader(strm);
                string line = sr.ReadToEnd();

将它全放入了string中。

最后一点是去掉了DownloadPage这个方法,如上,它的功能可以放入按钮的单击事件中实现,没有必要把一件事做两遍。

下面是前台页面:

后台代码:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
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.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 百度图片爬虫V2._1
{
    public partial class Form1 : Form
    {
        public delegate void AsynFunction(string s,int i);
        public Form1()
        {
            InitializeComponent();
        }
        private static string[] getLinks(string html, out int counts)
        {
            const string pattern = @"http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?";
            Regex r = new Regex(pattern, RegexOptions.IgnoreCase); //新建正则模式
            MatchCollection m = r.Matches(html); //获得匹配结果
            string[] links = new string[m.Count];
            ;
            ; i < m.Count; i++)
            {
                if (isValiable(m[i].ToString()))
                {
                    links[count] = m[i].ToString(); //提取出结果
                    count++;
                }

            }
            counts = count;
            return links;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            string keyWord = this.textBox1.Text;
            WebRequest myRequest = WebRequest.Create("http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1466307565574_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=" + Uri.EscapeDataString(keyWord));
            HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
            if (myResponse.StatusCode == HttpStatusCode.OK)
            {
                Stream strm = myResponse.GetResponseStream();
                StreamReader sr = new StreamReader(strm);
                string line = sr.ReadToEnd();
                ;
                string[] str = getLinks(line, out counts);
                this.progressBar1.Maximum = counts;
                ; i < counts; i++)
                {
                    AsynFunction fun = new AsynFunction(savePicture);
                    fun.BeginInvoke(str[i],i, ar => {
                        fun.EndInvoke(ar);
                        this.progressBar1.BeginInvoke(new Action(() =>
                        {
                            this.progressBar1.Value =progressBar1.Maximum;
                        }));
                        this.textBox2.BeginInvoke(new Action(() =>
                        {
                            StringBuilder sb=new StringBuilder();
                            sb.Append(Environment.NewLine);
                          //  sb.Append(str[i].ToString());
                            sb.Append("下载结束");
                            this.textBox2.Text += sb.ToString();
                        }));
                    }, fun);
                }
            }
        }
        private static bool isValiable(string url)
        {
            if (url.Contains(".jpg") || url.Contains(".gif") || url.Contains(".png"))
            {
                return true; //得到一些图片之类的资源
            }
            return false;
        }
        public void savePicture(string path,int i)
        {
            if (path != "" && path != null)
            {
                DataClasses1DataContext db = new DataClasses1DataContext();
                Uri url = new Uri(path);
                HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(url);
                webRequest.Referer = "http://image.baidu.com";
                webRequest.Timeout = ;
                //设置连接超时时间
                webRequest.AllowAutoRedirect = true;
                webRequest.Headers.Set("Pragma", "no-cache");
                webRequest.UserAgent = "Mozilla-Firefox-Spider(Wenanry)";
                HttpWebResponse webResponse;
                try
                {
                    webResponse = (HttpWebResponse)webRequest.GetResponse();
                }
                catch(WebException ex)
                {
                    webResponse = (HttpWebResponse)ex.Response;
                }

                if(webResponse!=null&&webResponse.StatusCode==HttpStatusCode.OK)
                {

                    if (isValiable(path))//判断如果是图片,就将其存储到数据库中。
                    {
                        Bitmap myImage = new Bitmap(webResponse.GetResponseStream());

                        MemoryStream ms = new MemoryStream();
                        myImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                        var p = new pictureUrl
                        {
                            pictureUrl1 = ms.ToArray()
                        };
                        db.pictureUrl.InsertOnSubmit(p);
                        db.SubmitChanges();
                        this.progressBar1.BeginInvoke(new Action(() =>
                        {
                            this.progressBar1.Value = i;
                        }));
                        this.textBox2.BeginInvoke(new Action(() =>
                        {
                            StringBuilder sb1 = new StringBuilder();
                            sb1.Append(path);
                            sb1.Append("图片下载开始" + Environment.NewLine);
                            this.textBox2.Text += sb1.ToString();
                        }));
                    }
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

C#写爬虫,版本V2.1的更多相关文章

  1. [Python]新手写爬虫全过程(已完成)

    今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为v1.0,开发中的版本号定义为v0.x.数据存放?这个是一个练手的玩具,就写在tx ...

  2. [Python]新手写爬虫全过程(转)

    今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为v1.0,开发中的版本号定义为v0.x.数据存放?这个是一个练手的玩具,就写在tx ...

  3. ECSHOP 数据库结构说明 (适用版本v2.7.3)

    ECSHOP 数据库结构说明 (适用版本v2.7.3) 1.account_log 用户账目日志表 字段 类型 Null/默认 注释 log_id mediumint(8) 否 / 自增 ID 号 u ...

  4. 手把手教你用.NET Core写爬虫

    写在前面 自从上一个项目58HouseSearch从.NET迁移到.NET core之后,磕磕碰碰磨蹭了一个月才正式上线到新版本. 然后最近又开了个新坑,搞了个Dy2018Crawler用来爬dy20 ...

  5. 让你从零开始学会写爬虫的5个教程(Python)

    写爬虫总是非常吸引IT学习者,毕竟光听起来就很酷炫极客,我也知道很多人学完基础知识之后,第一个项目开发就是自己写一个爬虫玩玩. 其实懂了之后,写个爬虫脚本是很简单的,但是对于新手来说却并不是那么容易. ...

  6. scrapy写爬虫是出现no module named win32api错误

    windows下利用scrapy(python2.7)写爬虫,运行 scrapy crawl dmoz 命令时提示:exceptions.ImportError: No module named wi ...

  7. PHP, Python, Node.js 哪个比较适合写爬虫?

    PHP, Python, Node.js 哪个比较适合写爬虫? 1.对页面的解析能力2.对数据库的操作能力(mysql)3.爬取效率4.代码量推荐语言时说明所需类库或者框架,谢谢.比如:python+ ...

  8. 怎么用Python写爬虫抓取网页数据

    机器学习首先面临的一个问题就是准备数据,数据的来源大概有这么几种:公司积累数据,购买,交换,政府机构及企业公开的数据,通过爬虫从网上抓取.本篇介绍怎么写一个爬虫从网上抓取公开的数据. 很多语言都可以写 ...

  9. python写爬虫时的编码问题解决方案

    在使用Python写爬虫的时候,常常会遇到各种令人抓狂的编码错误问题.下面给出一些简单的解决编码错误问题的思路,希望对大家有所帮助. 首先,打开你要爬取的网站,右击查看源码,查看它指定的编码是什么,如 ...

  10. 用c+libcurl+PCRE写爬虫2--好用的正则表达式

    写爬虫最重要的就是正则表达式的处理(爬出来的数据的筛选,清洗,过滤等操作). 通过一篇文章 http://blog.csdn.net/quaful/article/details/6460880 来确 ...

随机推荐

  1. ZOJ 2412 Farm Irrigation

    Farm Irrigation Time Limit: 2 Seconds      Memory Limit: 65536 KB Benny has a spacious farm land to ...

  2. logo上传

  3. HDU 3920Clear All of Them I(状压DP)

    HDU 3920   Clear All of Them I 题目是说有2n个敌人,现在可以发n枚炮弹,每枚炮弹可以(可以且仅可以)打两个敌人,每一枚炮弹的花费等于它所行进的距离,现在要消灭所有的敌人 ...

  4. Oracle Berkeley DB Java 版

    Oracle Berkeley DB Java 版是一个开源的.可嵌入的事务存储引擎,是完全用 Java 编写的.它充分利用 Java 环境来简化开发和部署.Oracle Berkeley DB Ja ...

  5. ORACLE查看数据文件-控制文件-日志文件-表空间信息

    1.查看当前数据库中的所有用户:select username from dba_users; 2.查看当前会话登录的用户:show user或select username from user_us ...

  6. 什么是防盗链设置中的空Referer

    设置防盗链时候指明和不指明空Referer的差别及实现后的效果? 什么是Referer? 这里的 Referer 指的是HTTP头部的一个字段,也称为HTTP来源地址(HTTP Referer).用来 ...

  7. Partial Tree

    Partial Tree 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5534 完全背包 做这题前去学习了下完全背包,觉得这个优化简直神技!(以前都是 ...

  8. Javascript兑现图片预加载【回调函数,多张图片】 (转载)

    Javascript实现图片预加载[回调函数,多张图片] 使用JS实现一组图片动画效果或者使用HTML5 Canvas渲染一系列图片等案例中,需要图片全部加载完成方可运行动画效果.此时程序中就会涉及多 ...

  9. 非滤波单目视觉slam笔记1

    非滤波单目视觉slam 主要分为以下8部分 数据类型 数据关联 初始化 位姿估计 地图维护 地图生成 失效恢复 回环检测 数据类型 直接法(稠密,半稠密) 基本原理是亮度一致性约束,\(J(x,y) ...

  10. 【Swift】 iOS开发容易产生Bug的地方

    1.隐藏navigationBar(尤其是多级隐藏) 2.共用collectionView或tableView 3.继承关系下,注意覆写父类时的super方法的调用 4.关于权限的问题(相机权限,相册 ...