【四】C# 基于WPF 使用CefSharp来做万能爬虫---扩展 一个httpClient访问辅助类可设置代理

目录

    【一】C# 基于WPF 使用CefSharp来做万能爬虫

    【二】C# 基于WPF 使用CefSharp来做万能爬虫

    【三】C# 基于WPF 使用CefSharp来做万能爬虫

    【四】C# 基于WPF 使用CefSharp来做万能爬虫---扩展 一个httpClient访问辅助类可设置代理

 

using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Net.Http.Headers;
using System.Net.Security;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace HttpWebHelper
{
    /// <summary>
    /// 请求URL的一个辅助类
    /// </summary>
    public static class HttpRequest
    {
        /// <summary>
        /// 请求的封装,封装了默认请求方式
        /// </summary>
        /// <param name="url"></param>
        /// <param name="httpType"></param>
        /// <param name="query"></param>
        /// <param name="postdata"></param>
        /// <returns></returns>
        public static ReturnMessage Request(string url, MethodEnum method = MethodEnum.Get, string cookStr = "", Dictionary<string, string> query = null, object postdata = null)
        {
            Args httpArgs = new Args();
            httpArgs.Url = url;
            httpArgs.Method = method;
            httpArgs.cookStr = cookStr;
            if (query != null)
                httpArgs.QueryDic = query;
            if (postdata != null)
                httpArgs.postData.Data = postdata;
            return Request(httpArgs);
        }

        /// <summary>
        /// http请求的集合体
        /// </summary>
        /// <param name="httpArgs">请求类</param>
        /// <returns></returns>
        public static ReturnMessage Request(Args httpArgs)
        {
            var request = CreateHttpWebRequest(httpArgs);
            bool iscatch = false;
            HttpWebResponse response;
            try
            {
                response = request.GetResponse() as HttpWebResponse;
            }
            catch (WebException ex)
            {
                iscatch = true;
                response = ex.Response as HttpWebResponse;
            }
            if (httpArgs.isFile && httpArgs.FileInfo != null)
            {
                if (iscatch)
                {
                    return new ReturnMessage { Status = Convert.ToInt32(response.StatusCode), HtmlSource = "下载失败" };
                }
                else
                {

                    if (SaveFile(httpArgs.FileInfo, response))
                    {
                        return new ReturnMessage { Status = Convert.ToInt32(response.StatusCode), HtmlSource = "下载成功" };
                    }
                    else
                    {
                        return new ReturnMessage { Status = Convert.ToInt32(response.StatusCode), HtmlSource = "下载失败" };
                    }
                }
            }
            else
            {
                return HandleHttpWebRequest(response);
            }



        }

        /// <summary>
        /// 处理返回值
        /// </summary>
        /// <param name="httpWebResponse"></param>
        /// <returns></returns>
        private static ReturnMessage HandleHttpWebRequest(HttpWebResponse httpWebResponse)
        {
            ReturnMessage returnMessage = new ReturnMessage();
            returnMessage.Hearders = HandleHeaders(httpWebResponse.Headers);
            if (returnMessage.Hearders != null && returnMessage.Hearders.Keys.Contains("Set-Cookie"))
            {
                returnMessage.CookieStr = returnMessage.Hearders["Set-Cookie"];
                returnMessage.Hearders.Remove("Set-Cookie");
            }
            returnMessage.Status = Convert.ToInt32(httpWebResponse.StatusCode);
            returnMessage.HtmlSource = GetHtmlSource(httpWebResponse);
            returnMessage.JsonObject = HandleHtmlSource(returnMessage.HtmlSource);
            return returnMessage;
        }

        /// <summary>
        /// 创建请求HttpClient
        /// </summary>
        /// <param name="httpArgs"></param>
        /// <returns></returns>
        private static HttpWebRequest CreateHttpWebRequest(Args httpArgs)
        {
            HttpWebRequest request = null;
            if (httpArgs.Url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            {
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
                request = WebRequest.Create(httpArgs.Url) as HttpWebRequest;
                request.ProtocolVersion = HttpVersion.Version10;
            }
            else
            {
                request = WebRequest.Create(httpArgs.Url) as HttpWebRequest;
            }
            request.Method = httpArgs.Method.ToString();//设置请求方式
            request.UserAgent = httpArgs.UserAgent;//设置浏览器用户头
            request.ReadWriteTimeout = httpArgs.TimeOut * 1000;//设置读取文本时的超时时间
            request.Timeout = httpArgs.TimeOut * 1000;//设置请求时的超时时间
            request.Accept = httpArgs.Accept;//设置请求获取的类型
            request.KeepAlive = httpArgs.KeepAlive;//设置是否保持链接的存活
            request.AllowAutoRedirect = httpArgs.KeepAlive;//如果请求应自动遵循来自 Internet 资源的重定向响应
            if (httpArgs.cookStr.Length > 0)
                request.Headers.Add("Cookie", httpArgs.cookStr);
            if (httpArgs.poxy.Ip != string.Empty)
            {
                WebProxy proxy = new WebProxy(httpArgs.poxy.Ip, httpArgs.poxy.Port);
                request.Proxy = proxy;
            }
            if (httpArgs.Hearders != null && httpArgs.Hearders.Count > 0)
            {
                foreach (var key in httpArgs.Hearders.Keys)
                {
                    request.Headers.Add(key, httpArgs.Hearders[key]);
                }
            }
            if (httpArgs.postData != null && httpArgs.postData.Data != null && httpArgs.Method == MethodEnum.Post)//是指请求内容
            {
                string parms = string.Empty;
                switch (httpArgs.postData.contentType)
                {
                    case ContentType.FromData://from表单提交
                        {
                            parms = httpArgs.postData.Data.ToString();
                            request.ContentType = "application/x-www-form-urlencoded";
                        }
                        break;
                    case ContentType.Json://json提交
                        {
                            parms = Newtonsoft.Json.JsonConvert.SerializeObject(httpArgs.postData.Data);
                            request.ContentType = "application/json";
                        }
                        break;
                }
                byte[] data = httpArgs.postData.encoding.GetBytes(parms.ToString());
                request.ContentLength = data.Length;
                using (Stream stream = request.GetRequestStream())
                {
                    stream.Write(data, 0, data.Length);
                }
            }
            return request;
        }


        /// <summary>
        /// 处理返回的htmlSource
        /// </summary>
        /// <returns></returns>
        private static JToken HandleHtmlSource(string htmlSource)
        {
            JToken jObject = null;
            try
            {
                jObject = JToken.Parse(htmlSource);
                return jObject;
            }
            catch
            {
                return null;
            }
        }


        /// <summary>
        /// 处理返回值里面的Header
        /// </summary>
        /// <param name="header"></param>
        /// <returns></returns>
        private static Dictionary<string, string> HandleHeaders(WebHeaderCollection header)
        {
            Dictionary<string, string> valuePairs = new Dictionary<string, string>();
            foreach (var key in header.AllKeys)
            {
                string values = string.Empty;
                values = header.Get(key);
                valuePairs.Add(key, values);
            }
            return valuePairs;
        }

        /// <summary>
        /// 保存成文件
        /// </summary>
        /// <param name="savePath"></param>
        /// <param name="respones"></param>
        /// <returns></returns>
        private static bool SaveFile(FileInfo savePath, HttpWebResponse respones)
        {
            //获取服务器返回的资源  
            try
            {
                if (!savePath.Directory.Exists)
                {
                    savePath.Directory.Create();
                }
                using (Stream sream = respones.GetResponseStream())
                {
                    List<byte> list = new List<byte>();
                    while (true)
                    {
                        int data = sream.ReadByte();
                        if (data == -1)
                            break;
                        list.Add((byte)data);
                    }
                    File.WriteAllBytes(savePath.FullName, list.ToArray());
                }
                return true;
            }

            catch { return false; }

        }

        private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true; //总是接受
        }

        /// <summary>
        /// 获取该网页的源码 //兼容gzip格式的
        /// </summary>
        /// <param name="responseGet">该网页的HttpWebResponse</param>
        /// <returns></returns>
        private static string GetHtmlSource(HttpWebResponse responseGet)
        {
            string retur = string.Empty;
            try
            {
                string encodingStr = responseGet.CharacterSet.ToLower().ToString();
                if (encodingStr == "iso-8859-1")
                    encodingStr = "gb2312";
                Encoding encoding = Encoding.GetEncoding(encodingStr);
                Stream streamReceive = responseGet.GetResponseStream();
                try
                {
                    if (responseGet.ContentEncoding.ToLower().Contains("gzip"))
                    {
                        //gzip格式
                        streamReceive = new GZipStream(streamReceive, CompressionMode.Decompress);
                    }
                }
                catch { }
                using (System.IO.StreamReader sr = new System.IO.StreamReader(streamReceive, encoding))
                {
                    retur = sr.ReadToEnd();
                }
            }
            catch { }
            return retur;
        }


        /// <summary>
        /// MD5摘要算法
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string GetMd5Str32(string str)
        {
            MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
            char[] temp = str.ToCharArray();
            byte[] buf = new byte[temp.Length];
            for (int i = 0; i < temp.Length; i++)
            {
                buf[i] = (byte)temp[i];
            }
            byte[] data = md5Hasher.ComputeHash(buf);
            StringBuilder sBuilder = new StringBuilder();
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }
            return sBuilder.ToString();

        }
    }


    /// <summary>
    /// http返回值内容的格式化
    /// </summary>
    public class ReturnMessage
    {
        /// <summary>
        /// 请求回来的html详细内容
        /// </summary>
        public string HtmlSource { get; set; } = string.Empty;

        /// <summary>
        /// 请求回来的详细内容如果是Json的话会自动转化为js对象
        /// </summary>
        public JToken JsonObject { get; set; } = null;

        /// <summary>
        /// 请求返回回来的状态码
        /// </summary>
        public int Status { get; set; } = 200;

        /// <summary>
        /// 请求返回回来的所有cookie
        /// </summary>
        public string CookieStr { get; set; } = string.Empty;

        /// <summary>
        /// 请求的Headers
        /// </summary>
        public Dictionary<string, string> Hearders { get; set; } = null;
    }

    /// <summary>
    /// http请求时的参数格式化
    /// </summary>
    public class Args
    {
        /// <summary>
        /// 请求的url
        /// </summary>
        public string Url { get; set; } = string.Empty;
        /// <summary>
        /// 请求的query参数
        /// </summary>
        public Dictionary<string, string> QueryDic { get; set; } = new Dictionary<string, string>();
        /// <summary>
        /// http请求类型
        /// </summary>
        public MethodEnum Method { get; set; } = MethodEnum.Get;
        /// <summary>
        /// http请求postStr
        /// </summary>
        public PostData postData { get; set; } = new PostData();
        /// <summary>
        /// http请求时的hearder
        /// </summary>
        public Dictionary<string, string> Hearders { get; set; } = null;
        /// <summary>
        /// http请求时的cookie
        /// </summary>
        public string cookStr { get; set; } = string.Empty;
        /// <summary>
        /// 代理
        /// </summary>
        public Poxy poxy { get; set; } = new Poxy();

        public int TimeOut { get; set; } = 20;
        /// <summary>
        /// 用户身份信息头
        /// </summary>
        public string UserAgent { get; set; } = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36";

        /// <summary>
        /// 表单方式
        /// </summary>
        public string Accept { get; set; } = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3";

        /// <summary>
        /// 链接是否保持存活
        /// </summary>
        public bool KeepAlive { get; set; } = false;

        /// <summary>
        /// 如果请求应自动遵循来自 Internet 资源的重定向响应,则为 true;否则为 false。 默认值为 false。
        /// </summary>
        public bool AllowAutoRedirect { get; set; } = false;
        /// <summary>
        /// 是否是文件
        /// </summary>
        public bool isFile { get; set; } = false;
        /// <summary>
        /// 文件存储的路径
        /// </summary>
        public FileInfo FileInfo { get; set; } = null;

    }
    /// <summary>
    /// 代理配置
    /// </summary>
    public class Poxy
    {
        /// <summary>
        /// 代理服务器IP
        /// </summary>
        public string Ip { get; set; } = string.Empty;
        /// <summary>
        /// 代理服务器端口号
        /// </summary>
        public int Port { get; set; } = 80;
    }

    /// <summary>
    /// 提交数据
    /// </summary>
    public class PostData
    {
        /// <summary>
        /// 请求body的方式 默认json
        /// </summary>
        public ContentType contentType { get; set; } = ContentType.Json;
        /// <summary>
        /// post提交的data的内容
        /// </summary>
        public object Data { get; set; } = new object();
        /// <summary>
        /// 编码格式
        /// </summary>
        public Encoding encoding { get; set; } = Encoding.UTF8;


    }
    /// <summary>
    /// postData内容的格式
    /// </summary>
    public enum ContentType
    {
        FromData,//表单提交
        Json     //json方式提交
    }

    /// <summary>
    /// 请求的类型
    /// </summary>
    public enum MethodEnum
    {
        Get,
        Post,
        Put,
        Delete
    }
}

使用示例:

string url = "http://192.168.1.97:8001/api/NEWICM/NewCompanyModule/NewCompanyDetailInfo/GetContactInfo";

string cookStr="sessionStr=1234567";
var relut = HttpRequest.Request(url, MethodEnum.Get, cookStr);

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WPF是一种用于创建Windows桌面应用程序的技术,而CefSharp是一个针对.NET应用程序的Chromium嵌入式浏览器框架。结合使用WPFCefSharp,我们可以创建一个自定义的浏览器应用程序。 首先,我们需要在WPF项目中添加CefSharp的引用,以便能够使用相关功能和组件。接下来,我们可以在XAML文件中创建一个WebBrowser控件,这个控件将会是我们浏览器应用程序的主要窗口。在代码中,我们可以使用CefSharp的API来配置浏览器的行为,比如加载URL、前进、后退、刷新等操作。 为了实现这些功能,我们需要编写一些C#代码。首先,我们需要初始化CefSharp设置,并在应用程序启动时进行加载。然后,我们可以在浏览器的事件处理程序中编写代码,以响应用户的行为,例如在URL改变时加载新的页面,或在点击后退按钮时返回上一页。 此外,我们还可以通过使用CefSharp提供的API,实现一些其他的自定义功能。例如,我们可以通过JavaScript与浏览器进行交互,执行一些特定的脚本操作,或者通过注入自定义的CSS样式来修改网页的外观。 总而言之,使用WPFCefSharp,我们可以创建一个功能强大且自定义的浏览器应用程序。通过灵活运用CefSharp的API,我们可以实现各种浏览器相关的功能,并与用户进行交互。这是一个非常有用且有趣的项目,可以满足用户对浏览器的个性化需求。 ### 回答2: WPF是一种用于创建富客户端应用程序的开发框架,而CEFSharp是基于Chromium内核的用于嵌入式浏览器的开源框架。使用CEFSharp可以很方便地在WPF应用程序中嵌入浏览器功能。 首先,我们需要在WPF应用程序中添加CEFSharp的NuGet包。然后在XAML中创建一个WindowsFormsHost控件,用于嵌入浏览器。接下来,我们可以在代码中用CEFSharp的ChromiumWebBrowser控件来加载和显示网页。 加载一个网页非常简单,只需调用ChromiumWebBrowser的Load方法并传入网页的URL即可。此外,我们还可以注册一些事件来处理浏览器的加载完成、加载进度、错误等情况。例如,可以使用LoadEnd事件来监听页面加载完成,然后执行一些自定义逻辑。 此外,我们还可以通过调用ChromiumWebBrowser的ExecuteScriptAsync方法来在加载的网页中执行JavaScript代码。这使得我们可以通过与网页进行交互,实现一些复杂的功能。 在加载和显示网页时,我们也可以通过相关API来控制浏览器的行为,比如设置代理、禁用/启用JavaScript、禁止弹出窗口等。 总的来说,使用CEFSharp可以很方便地在WPF应用程序中嵌入浏览器功能。无论是显示网页,还是与网页进行交互,都可以通过CEFSharp轻松实现。这为开发者提供了更多的可能性,使得我们可以在WPF应用程序中创造出更加丰富和复杂的浏览器体验。 ### 回答3: WPF(Windows Presentation Foundation)是一种用于开发Windows应用程序的框架,而CefSharp是一个基于谷歌开源项目Chromium Embedded Framework (CEF)的.NET库,它允许在WPF应用程序中嵌入一个完整的浏览器。 使用CefSharpWPF应用程序中创建一个浏览器可以带来许多好处。首先,由于使用了Chromium的底层技术,CefSharp浏览器具有出色的跨平台兼容性和稳定性。它能够处理各种网页内容,包括HTML,CSS,JavaScript和其他多媒体元素。其次,CefSharp提供了强大的API,开发人员可以使用C#编写代码来控制浏览器的行为。这使得对浏览器的定制和扩展变得非常容易。 要在WPF中集成CefSharp浏览器,首先需要将CefSharp的NuGet包添加到项目中。然后,在需要嵌入浏览器的窗体中,可以使用XAML定义一个WebBrowser控件。接下来,在代码中初始化CefSharp,并设置WebBrowser控件的源为所需的URL或页面内容。 开发人员可以使用C#代码与嵌入的浏览器进行交互。例如,可以使用CefSharp的API执行一些常见的浏览器操作,如导航到新的URL,前进和后退浏览历史记录,或者捕获页面上的事件。此外,还可以通过JavaScript与页面进行交互,实现双向通信。 除了基本的浏览功能,CefSharp还提供了一些高级功能,如自定义页面呈现,浏览器扩展和弹出窗口管理。这些功能使得开发人员能够根据需要定制浏览器的外观和行为。 总之,使用CefSharpWPF应用程序中创建一个浏览器是一种简单而强大的方法,可以使应用程序获得Web浏览功能,并根据需要进行自定义和扩展。无论是实现一个简单的浏览器界面还是构建一个复杂的浏览器应用程序,CefSharp都能提供所需的功能和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值