C#寫爬蟲,版本V2.1

来源:http://www.cnblogs.com/JsonZhangAA/archive/2016/06/25/5616654.html
-Advertisement-
Play Games

這次是對2.0的小修補,2.0交互幾乎沒有,這次添加了進度條,和文本框,同時由於取得的鏈接主要會出現錯誤是:webResponse錯誤。 針對這種情況,設置了 截取錯誤信息,這裡我們不處理,後續直接判定statecode屬性來決定是否還要執行下麵的程式。 另外一點變化就是以前是通過將所獲取的網頁存到 ...


  這次是對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();
        }
    }
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Async in C# 5.0(C#中的非同步編程Async) 蝸牛翻譯之第一章 ...
  • 交流QQ群 ASP.NET鷹組 460845632 我會傾囊相授 我們要做微信支付當配置好微信微信商戶和支付配置之後我們首先應該看 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1# 這是微信統一下單的參數,我將這個參數做成 ...
  • 1 /// <summary> 2 /// ************************************************* 3 /// 類名:MP3幫助類 4 /// 修改日期:2016/06/25 5 /// 作者:董兆生 6 /// 聯繫方式:QQ490412323 7 // ...
  • 在FormPanel中按回車按鍵,會觸發預設按鈕的click事件。設置方法為在FormPanel中設置DefaultButton屬性,如果沒有設置這個屬性,預設為最後一個按鈕。 1.預設最後一個按鈕為預設按鈕 2.以數字編號指點預設按鈕 3.用ID指定預設按鈕 4.用選擇器指定預設按鈕 視圖的完整代 ...
  • 使用VS2015進行C++開發的6個主要原因 使用Visual Studio 2015進行C++開發 在今天的 Build 大會上,進行了“將你的 C++ 代碼轉移至 VS2015 的 6 個原因”的演講,其中探討了 VS2015 中對於 C++ 開發者們更有用的新功能。自從它在 2015 年七月的 ...
  • C#——類 一、String 類 系統內置的處理字元串類型的函數方法類。方便我們對字元串類型進行一系列的處理。 1、Length:獲取字元串的長度,返回一個int類型的值 string x=Console.ReadLine();//小string是大String的快捷方式 int i = x.Len ...
  • 一、前言: 最近做一個簡單的線上升級Demo,使用了微軟較早的.Net Remoting技術來練手。 簡單的思路就是在伺服器配置一個Remoting對象,然後在客戶端來執行Remoting對象中的方法。 過程: (1) 讀取本地dll文件的名稱與版本號,與伺服器的進行對比 (2) 確認需要升級的文件 ...
  • Ext.Net版本:4.1.0 Ext.Net官網:ext.net Ext.Net官方演示:mvc.ext.net Ext.Net MVC Example 下載:github.com/extnet/Ext.NET.Examples.MVC Ext.Net Nuget 地址:www.nuget.org ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...