首页 > 编程语言 >C#获取HTML源码

C#获取HTML源码

时间:2024-03-23 13:33:27浏览次数:29  
标签:HTML C# request System 源码 using new response string

  C#获取HTML源码 2024年03月23日记录 以前的那个从网上找到的方法, 在一些网站上用不了,如17K,取出来的是乱码,要么就是一坨JS,好像是用JS又重新加载了什么的  

using System;
using System.Collections.Generic;
using System.Web;
using System.Net;
using System.IO;
using System.Text;
using System.Net.Security;    
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;

namespace Niunan.XiaoShuo.Util
{
    /// <summary>
    /// http连接基础类,负责底层的http通信
    /// </summary>
    public class HttpService
    {

        public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            //直接确认,否则打不开    
            return true;
        }

        /// <summary>
        /// post提交
        /// </summary>
        /// <param name="xml"></param>
        /// <param name="url"></param>
        /// <param name="isUseCert"></param>
        /// <param name="timeout"></param>
        /// <param name="contenttype">如:application/x-www-form-urlencoded,text/xml</param>
        /// <param name="Authorization">为空的时候就不用加,用于容联云通讯</param>
        /// <returns></returns>
        public static string Post(string xml, string url, bool isUseCert, int timeout,string contenttype = "application/x-www-form-urlencoded",string Authorization="")
        {
            System.GC.Collect();//垃圾回收,回收没有正常关闭的http连接

            string result = "";//返回结果

            HttpWebRequest request = null;
            HttpWebResponse response = null;
            Stream reqStream = null;

            try
            {
                //设置最大连接数
                ServicePointManager.DefaultConnectionLimit = 200;
                //设置https验证方式
                if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
                {
                    ServicePointManager.ServerCertificateValidationCallback =
                            new RemoteCertificateValidationCallback(CheckValidationResult);
                }

                /***************************************************************
                * 下面设置HttpWebRequest的相关属性
                * ************************************************************/
                request = (HttpWebRequest)WebRequest.Create(url);

                request.Method = "POST";
                request.Timeout = timeout * 1000;

                if (!string.IsNullOrEmpty(Authorization))
                {
                    request.Headers.Add(HttpRequestHeader.Authorization, Authorization);
                }
            

                //设置代理服务器
                //WebProxy proxy = new WebProxy();                          //定义一个网关对象
                //proxy.Address = new Uri(WxPayConfig.PROXY_URL);              //网关服务器端口:端口
                //request.Proxy = proxy;

                //设置POST的数据类型和长度
                request.ContentType =contenttype;
                byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
                request.ContentLength = data.Length;

                //是否使用证书
                if (isUseCert)
                {
                    //复制微信DEMO的,这里不用证书
                    //string path = HttpContext.Current.Request.PhysicalApplicationPath;
                    //X509Certificate2 cert = new X509Certificate2(path + WxPayConfig.SSLCERT_PATH, WxPayConfig.SSLCERT_PASSWORD);
                    //request.ClientCertificates.Add(cert);
                    //Log.Debug("WxPayApi", "PostXml used cert");
                }

                //往服务器写入数据
                reqStream = request.GetRequestStream();
                reqStream.Write(data, 0, data.Length);
                reqStream.Close();

                //获取服务端返回
                response = (HttpWebResponse)request.GetResponse();

                //获取服务端返回数据
                StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
                result = sr.ReadToEnd().Trim();
                sr.Close();
            } 
            catch (Exception e)
            {
               // Log.Error("HttpService", e.ToString());
                throw  e;
            }
            finally
            {
                //关闭连接和流
                if (response != null)
                {
                    response.Close();
                }
                if(request != null)
                {
                    request.Abort();
                }
            }
            return result;
        }

        /// <summary>
        /// 处理http GET请求,返回数据
        /// </summary>
        /// <param name="url">请求的url地址</param>
        /// <returns>http GET成功后返回的数据,失败抛WebException异常</returns>
        public static string Get(string url)
        {
            System.GC.Collect();
            string result = "";

            HttpWebRequest request = null;
            HttpWebResponse response = null;

            //请求url以获取数据
            try
            {
                //设置最大连接数
                ServicePointManager.DefaultConnectionLimit = 200;
                //设置https验证方式
                if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
                {
                    ServicePointManager.ServerCertificateValidationCallback =
                            new RemoteCertificateValidationCallback(CheckValidationResult);
                }

                /***************************************************************
                * 下面设置HttpWebRequest的相关属性
                * ************************************************************/
                request = (HttpWebRequest)WebRequest.Create(url);

                request.Method = "GET";

                //设置代理
                //WebProxy proxy = new WebProxy();
                //proxy.Address = new Uri(WxPayConfig.PROXY_URL);
                //request.Proxy = proxy;

                //获取服务器返回
                response = (HttpWebResponse)request.GetResponse();

                //获取HTTP返回数据
                StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
                result = sr.ReadToEnd().Trim();
                sr.Close();
            } 
            catch (Exception e)
            {

                throw e;
            }
            finally
            {
                //关闭连接和流
                if (response != null)
                {
                    response.Close();
                }
                if (request != null)
                {
                    request.Abort();
                }
            }
            return result;
        }
    }
}

 

弄了一上午,到处问人到处查,发现下面的代码可以用于17K网站,
var handler = new HttpClientHandler()
{
    AutomaticDecompression = System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate,
    UseCookies=false,
};
var httpClient = new HttpClient(handler);
var requestMessage = new HttpRequestMessage(HttpMethod.Get, url);
requestMessage.Headers.Add("Accept-encoding", "gzip, deflate, br, zstd");
var message = await httpClient.SendAsync(requestMessage);
var content = await message.Content.ReadAsStringAsync();
//后来发现这段代码前几次可以抓取到,然后又抓不到了。。只能用下面的模拟浏览器打开网页抓取源代码了

 

后来又来了个更狠的,用PuppeteerSharp, 相当于用代码来控制让系统中的chrome浏览器打开一个网页,然后再来获取这个网页的源代码
using PuppeteerSharp;  //nuget引入一下

namespace ConsoleApp2
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            await new BrowserFetcher().DownloadAsync(BrowserTag.Stable);  //自动下载他提供的无头浏览器,不用这一行就得在下面指定本地的浏览器

            var browser = await Puppeteer.LaunchAsync(new LaunchOptions
            {
                //ExecutablePath= "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
                Headless = true
            });

            var page = await browser.NewPageAsync();
            await page.GoToAsync("https://www.17k.com/book/554720.html");
            await page.WaitForTimeoutAsync(2000);
            string html = await page.GetContentAsync();

            Console.WriteLine(html);

            await browser.CloseAsync();
        }
    }
}

 

然后还有一个playwright的也能实现操作浏览器打开网页的功能,用于自动化测试的,以前有记录过这个名字,不过一直没有时间看。。。主要是“懒”。。。。。 https://playwright.dev/dotnet/docs/intro

标签:HTML,C#,request,System,源码,using,new,response,string
From: https://www.cnblogs.com/niunan/p/18091019

相关文章

  • 【Java - 框架 - HttpClient】(01) 使用“HttpClient“爬取网页的代码示例 - 快速上手
    使用"HttpClient"爬取网页的代码示例-快速上手;依赖<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>4.4.14</version></dependency><dependency>......
  • 前端学习<一>HTML——04HTML标签:排版标签
    本文主要内容排版标签:<h1><p><hr/><br/><div><span><center><pre>下面来详细介绍一下排版标签。标题标签标题使用<h1>至<h6>标签进行定义。<h1>定义最大的标题,<h6>定义最小的标题。具有align属性,属性值可以是:left、center、right。代码举例: <......
  • GitHub Copilot 在命令行界面中的全面应用:为系统运维人员带来的革命性进步
    随着技术的迅猛发展,GitHubCopilot在命令行界面(CLI)中的全面应用标志着对系统运维人员工作方式的重大革新。此次进步不仅仅体现在命令建议和解释的直接获取,更通过为Bash、PowerShell和Zsh添加助手别名,简化了用户的工作流程。本文将探讨GitHubCopilot在CLI中全面可......
  • 工商银行ECOS系统应用架构
    2019年11月8日,工商银行在北京正式发布ECOS智慧银行生态系统。ECOS以Ecosystem(生态系统)前四个字母命名。其中E代表“企业级”(Enterprise-level),C代表“以客户为中心”(Customer-centred),O代表“开放融合”(Open),S代表“智慧智能”(Smart)。ECOS承载实现智慧银行战略目标的......
  • 银行ETC系统应用架构设计
     根据《加快推进高速公路电子不停车快捷收费应用服务实施方案》(发改基础〔2019〕935号),拓宽ETC发行服务渠道。推动建立全网协同服务模式,完善服务规则,鼓励银行业金融机构、非银行支付机构和互联网企业等服务机构紧密合作。允许ETC绑定既有银行账户和支付账户。支持商业银行推广......
  • 【LeetCode 509 】斐波那契数
    题目描述原题链接:LeetCode.0509斐波那契数解题思路题目直接给出了公式,朴素解法可以直接用\(O(n)\)复杂度求出答案,可以看做是递归或动态规划的入门题;这里重点作为模板题来介绍矩阵快速幂技巧,讲一下\(O(log_2n)\)复杂度的解法:递推公式\(F(n)=F(n-1)+F(n-2)\),转换为矩......
  • Tree Cutting
    这道题目的代码的写法非常新,可以学习首先我们从\(x=1\)开始想起,此时显然一条边都不用切然后是\(x=2\),我们发现所有叶子节点都不能分离开来了,我们把所有叶子节点与其父亲节点弄成一个连通块,显然这里切掉是最优的,在考虑剩下的树,仍然对叶子节点实施这个操作,直到最后没有剩下的树为......
  • 使用Django-Simple-Captcha在Django项目加入验证码模块并自定义样式
    在Django项目中加入验证码功能,通常需要借助第三方库,比如Django-Smple-Captch、Django-reCAPTCHA、DEF-reCAPTCHA、Wagtail-Django-ReCaptcha、Django-Friendly-Captcha等。其中,Django-Smple-Captcha是一个流行的选择,它提供了一个简单而强大的Django应用,无需调用第三方API,......
  • 如何判断kbmMWClientQuery是否修改过?
    TkbmMWClientQuery有一个属性:IsDataModified,表示记录是否被修改过,实测的结果,当为一个字段赋值一个相同的值时,IsDataModified也会变为True。 q.Edit;q.FieldByName('FName').AsString:='test';q.Post;象上面的代码,当q.FieldByName('FName').AsString已经等于test时,IsDataM......
  • 2.5 如何绘制ROC曲线?
    2.5如何绘制ROC曲线?前情提要:2.4ROC曲线是什么?​事实上,ROC曲线是通过不断移动分类器的“截断点”来生成曲线上的一组关键点的,通过下面的例子进一步来解释“截断点”的概念。​在二值分类问题中,模型的输出一般都是预测样本为正例的概率。假设测试集中有20个样本,表2.......