C#写爬虫,版本V2.1

  这次是对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];
            int count = 0;
            for (int i = 0; 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();
                int counts = 0;
                string[] str = getLinks(line, out counts);
                this.progressBar1.Maximum = counts;
                for (int i = 0; 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 = 30000;
                //设置连接超时时间
                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();
        }
    }
}
时间: 2024-10-14 18:06:24

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

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

今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为v1.0,开发中的版本号定义为v0.x.数据存放?这个是一个练手的玩具,就写在txt文本里吧.其实主要的不是学习爬虫,而是依照这个需求锻炼下自己的编程能力,最重要的是要有一个清晰的思路(我在以这个目标努力着).ok,主旨已经订好了,开始‘撸串’了. 目标网站:http://bohaishibei.com/post/category/main/(一个很有趣的网站,一段话配一个图,老

用go写爬虫服务并发请求,限制并发数

java写爬虫服务,思路是线程池,任务队列,限制并行线程数即可. go要用另一种设计思路,不能在线程层面限制,协程的异步请求,如果不作处理,并行发出所有网络请求,因网络请求数过多,会抛出异常 低版本的go可以并行执行map的操作,高版本会报异常,需要把map改为array,改起来很简单 func updateAllShowTimePeople() { //得到要请求的url,多批次请求 allurls := getShowTimeTypeIndexFromDB() //要请求的任务总数 allu

[Python]新手写爬虫全过程

今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为v1.0,开发中的版本号定义为v0.x.数据存放?这个是一个练手的玩具,就写在txt文本里吧.其实主要的不是学习爬虫,而是依照这个需求锻炼下自己的编程能力,最重要的是要有一个清晰的思路(我在以这个目标努力着).ok,主旨已经订好了,开始‘撸串’了. 目标网站:http://bohaishibei.com/post/category/main/(一个很有趣的网站,一段话配一个图,老

Python写爬虫-爬甘农大学校新闻

Python写网络爬虫(一) 关于Python: 学过C. 学过C++. 最后还是学Java来吃饭. 一直在Java的小世界里混迹. 有句话说: "Life is short, you need Python!"  翻译过来就是: 人生苦短, 我用Python 究竟它有多么强大,  多么简洁? 抱着这个好奇心, 趁不忙的几天. 还是忍不住的小学了一下.(- - 其实学了还不到两天) 随便用一个"HelloWorld"的例子 //Java class Main{ pu

python写爬虫使用urllib2方法

python写爬虫使用urllib2方法 整理了一部分urllib2的使用细节. 1.Proxy 的设置 urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy. 如果想在程序中明确控制 Proxy 而不受环境变量的影响,可以使用代理. 新建test14来实现一个简单的代理Demo: import urllib2 enable_proxy = True proxy_handler = urllib2.ProxyHandler({"http" : 'htt

【转载】不会编程也能写爬虫?可视化爬虫工具是什么东东

原文:不会编程也能写爬虫?可视化爬虫工具是什么东东 随着Scrapy等框架的流行,用Python等语言写爬虫已然成为一种时尚.但是今天,我们并不谈如何写爬虫,而是说说不要写代码就能写出来的爬虫. 爬虫新时代 在早期互联网世界,写爬虫是一项技术含量非常高的活,往大的方向说,爬虫技术是搜索引擎的重要组成部分. 随着互联网技术的发展,写爬虫不再是门槛非常高的技术了,一些编程语言甚至直接提供爬虫框架,例如python的Scrapy框架,它们让写爬虫走入“寻常百姓家”. 在知乎的热门话题“能利用爬虫技术做

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

在使用Python写爬虫的时候,常常会遇到各种令人抓狂的编码错误问题.下面给出一些简单的解决编码错误问题的思路,希望对大家有所帮助. 首先,打开你要爬取的网站,右击查看源码,查看它指定的编码是什么,如: <META http-equiv=Content-Type content="text/html; charset=gb2312"> 我这里指定的charset为gb2312,下面我都会用gb2312作为例子进行编码解码 提交输入 我们常常要获取输入,通过参数的形式提交请求

scrapy写爬虫经历

scrapy写爬虫经历 前一段时间自己做项目参赛,用scrapy爬了许多网课平台的数据,当时没咋总结.最近又要搞事情,总结一下吧.有啥想法都会在次记录下来. 1. 安装,使用 ubuntu 1604 docker+mysql5.7 anaconda>python3.6 pycharm pip install scrapy 安装Scrapy 在pycharm新建一个项目,然后在终端输入: scrapy startproject companys 就会自动建立一个文件树.如下图: 2. 3. 4.

第一次写爬虫 , 程序一直运行不终止

 之所以陷入不终止状态        是由于正则表达式出错  正则表达式引擎一直处于回溯状态  (回溯结束,程序可能终止,没去尝试)  当一个正则表达式占用浏览器上秒,上分钟或者更长时间时,问题原因很可能是回溯失控. 这个例子告诉我们,在写爬虫时,如果数据过多,   正则表达式一定要不能出错. 原文地址:https://www.cnblogs.com/xiaohaodeboke/p/11781225.html

Python从零开始写爬虫-2 使用正则表达式解析HTML

上一篇博客Python从零开始写爬虫-1 使用Python发送http请求并获得网页源代码中我们已经学习到如何从网站上获取html的源码, 那么今天我们就来学习如何使用正则表达式来解析HTML.同样以Python的Api文档为例. 正则表达式: 又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式通常被用来检索.替换那些符合某个模式(规则)的文本.(从百度上复制过来的) 看这篇文章没有正则表达式的基础也可