当前位置: 首页 > news >正文

C#获取HTML源码

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的也能实现操作浏览器打开网页的功能,用于自动化测试的,以前有记录过这个名字,不过一直没有时间看。。。主要是“懒”。。。。。

Installation | Playwright .NET

相关文章:

C#获取HTML源码

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

element-ui checkbox 组件源码分享

简单分享 checkbox 组件&#xff0c;主要从以下三个方面来分享&#xff1a; 1、组件的页面结构 2、组件的属性 3、组件的方法 一、组件的页面结构 二、组件的属性 2.1 value / v-model 属性&#xff0c;绑定的值&#xff0c;类型 string / number / boolean&#xff0c;无…...

JavaEE--小Demo--数据库建立

目录 实验准备 本次所要新建的文件 实验步骤 step1-demo.sql 1.在resources文件夹下新建demo.sql文件 2.打开此目录&#xff0c;并运行命令提示符 3.打开数据库mysql -uroot -p 4.创建数据库create database demo; 5.使用数据库use demo; 6.导入数据source demo.sql;…...

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记19_前方的路

1. 技术与财富分配不均 1.1. 当前的财富分配不均早已成为世界难题 1.1.1. 世界上有一半的人口——相当于35亿人——拥有的财富却不敌在一辆双层巴士上的商业精英的个人财富总和 1.2. 部分线上市场仍受到竞争机制支配的事实并不能为其他市场的反竞争策略开脱 1.3. 企业的市场…...

MySQL双一参数性能测试

MySQL双一参数 MySQL 数据库中有两个非常重要的参数&#xff0c;一个是innodb_flush_log_at_trx_commit&#xff0c;另外一个是sync_binlog&#xff0c;这两个参数称之为双一参数&#xff0c;前者控制了redo log 的刷盘机制&#xff0c;后者控制了binlog 的刷盘机制 这两个参…...

CodeSys创建自定义的html5控件

文章目录 背景创建html5control.xml文件控件界面以及逻辑的实现使用的资源安装自定义的html5控件库 背景 查看官方的资料&#xff1a;https://content.helpme-codesys.com/en/CODESYS%20Visualization/_visu_html5_dev.html 官方的例子&#xff1a;https://forge.codesys.com/…...

Xcode15报错: SDK does not contain ‘libarclite‘

pod lib lint *** 报错 clang: error: SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a; try increasing the minimum deployment target 或者xcode…...

矩阵快速幂

快速幂 #include<iostream> using namespace std;int main(){int a, b, p;cin>>a>>b>>p;int res 1 % p;while(b){if(b & 1) res 1ll * res * a % p;a 1ll * a * a % p;b >> 1;}cout<<res;return 0; }斐波那契数列 #include <ios…...

数据之谜:解读Facebook的用户行为

在当今数字化时代&#xff0c;社交媒体平台已经成为人们生活中不可或缺的一部分&#xff0c;而Facebook作为全球最大的社交网络之一&#xff0c;其背后隐藏着许多数据之谜。本文将深入探讨Facebook的用户行为&#xff0c;并试图解读其中的奥秘。 用户行为数据的收集 Facebook作…...

学习 考证 帆软 FCP-FineBI V6.0 考试经验

学习背景&#xff1a; 自2024年1月起&#xff0c;大部分时间就在家里度过了&#xff0c;想着还是需要充实一下自己&#xff0c;我是一个充满热情的个体。由于之前公司也和帆软结缘&#xff0c;无论是 Fine-Report 和 Fine-BI 都有接触3年之久&#xff0c;但是主要做为管理者并…...

《过滤器模式(极简c++)》

本文章属于专栏- 概述 - 《设计模式&#xff08;极简c版&#xff09;》-CSDN博客 本章简要说明过滤器模式。本文分为模式说明、本质思想、实践建议、代码示例四个部分。 模式说明 方案&#xff1a; 过滤器模式是一种结构型设计模式&#xff0c;用于过滤一组对象&#xff0c;基…...

【C++】如何用一个哈希表同时封装出unordered_set与unordered_map

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.哈希桶源码 2.哈希…...

Day45:WEB攻防-PHP应用SQL二次注入堆叠执行DNS带外功能点黑白盒条件

目录 PHP-MYSQL-二次注入-DEMO&74CMS DEMO-用户注册登录修改密码 CMS-74CMS个人中心简历功能 PHP-MYSQL-堆叠注入-DEMO&CTF强网 Demo 2019强网杯-随便注&#xff08;CTF题型&#xff09; PHP-MYSQL-带外注入-DEMO&DNSLOG(让服务器主动把数据交出去) 知识点&…...

web安全之:三种常见的Web安全威胁

Web安全是确保Web应用和用户数据安全的一系列措施和实践。了解和防御常见的安全威胁是每个Web开发人员的基本职责。下面&#xff0c;我们将详细讨论三种常见的Web安全威胁&#xff1a;SQL注入、跨站脚本&#xff08;XSS&#xff09;和跨站请求伪造&#xff08;CSRF&#xff09;…...

C#,图论与图算法,用于检查给定图是否为欧拉图(Eulerian Graph)的算法与源程序

1 欧拉图 欧拉图是指通过图(无向图或有向图)中所有边且每边仅通过一次通路, 相应的回路称为欧拉回路。具有欧拉回路的图称为欧拉图(Euler Graph), 具有欧拉通路而无欧拉回路的图称为半欧拉图。 对欧拉图的一个现代扩展是蜘蛛图,它向欧拉图增加了可以连接的存在点。 这给…...

Dubbo框架的介绍

什么是dubbo Dubbo是一个高性能的、轻量级的开源RPC&#xff08;远程过程调用&#xff09;框架&#xff0c;由阿里巴巴公司开发并开源。它提供了基于Java的远程服务调用和管理的解决方案&#xff0c;可以帮助开发者快速构建分布式应用和服务。 Dubbo具有以下特点&#xff1a; …...

手机实时监控电脑屏幕(手机可以看到电脑在干什么吗)

已经2024年了&#xff0c;假如你还在问我&#xff0c;手机可以看到电脑在干什么吗&#xff0c;有没有手机实时监控电脑屏幕的系统。 那么证明&#xff0c;你可能已经out 了。 现代科技告诉发展的态势下&#xff0c;这种技术已经很成熟了。 域智盾软件就可以实现这种效果↓我们…...

合成孔径雷达干涉测量InSAR数据处理、地形三维重建、形变信息提取、监测

原文链接&#xff1a;合成孔径雷达干涉测量InSAR数据处理、地形三维重建、形变信息提取、监测https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247598798&idx7&snc054ed7c9d9c433d00837a7798080935&chksmfa820329cdf58a3f6b5986d6d4da3d19f81e3efd0b159f…...

云原生(五)、Docker-Swarm集群

基础环境说明 1、环境准备 1、启动4台服务器&#xff08;在同一个网段内&#xff09;。 2、重命名4台服务器&#xff0c;方便区分。 hostnamectl set-hostname swarm1 reboot安装docker。参考文章&#xff1a;云原生&#xff08;二&#xff09;、Docker基础 2、DockerSwarm…...

arm核的DMPIS是如何计算的

直接看这篇&#xff1a;https://zhuanlan.zhihu.com/p/660155292 写的很好&#xff1a; "SA8155P的CPU算力计算如下&#xff08;按照A75性能提升50%来计算&#xff0c;即 5.2 * 1.5 7.8 DMIPS/MHz &#xff09; SA8155P算力 2.419GHz * 1核 * 7.8 DMIPS/MHz 2.131GH…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...