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日记录 以前的那个从网上找到的方法, 在一些网站上用不了,如17K,取出来的是乱码,要么就是一坨JS,好像是用JS又重新加载了什么的 using System; using System.Collections.Generic; using System.We…...
element-ui checkbox 组件源码分享
简单分享 checkbox 组件,主要从以下三个方面来分享: 1、组件的页面结构 2、组件的属性 3、组件的方法 一、组件的页面结构 二、组件的属性 2.1 value / v-model 属性,绑定的值,类型 string / number / boolean,无…...
JavaEE--小Demo--数据库建立
目录 实验准备 本次所要新建的文件 实验步骤 step1-demo.sql 1.在resources文件夹下新建demo.sql文件 2.打开此目录,并运行命令提示符 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 数据库中有两个非常重要的参数,一个是innodb_flush_log_at_trx_commit,另外一个是sync_binlog,这两个参数称之为双一参数,前者控制了redo log 的刷盘机制,后者控制了binlog 的刷盘机制 这两个参…...
CodeSys创建自定义的html5控件
文章目录 背景创建html5control.xml文件控件界面以及逻辑的实现使用的资源安装自定义的html5控件库 背景 查看官方的资料:https://content.helpme-codesys.com/en/CODESYS%20Visualization/_visu_html5_dev.html 官方的例子: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的用户行为
在当今数字化时代,社交媒体平台已经成为人们生活中不可或缺的一部分,而Facebook作为全球最大的社交网络之一,其背后隐藏着许多数据之谜。本文将深入探讨Facebook的用户行为,并试图解读其中的奥秘。 用户行为数据的收集 Facebook作…...
学习 考证 帆软 FCP-FineBI V6.0 考试经验
学习背景: 自2024年1月起,大部分时间就在家里度过了,想着还是需要充实一下自己,我是一个充满热情的个体。由于之前公司也和帆软结缘,无论是 Fine-Report 和 Fine-BI 都有接触3年之久,但是主要做为管理者并…...
《过滤器模式(极简c++)》
本文章属于专栏- 概述 - 《设计模式(极简c版)》-CSDN博客 本章简要说明过滤器模式。本文分为模式说明、本质思想、实践建议、代码示例四个部分。 模式说明 方案: 过滤器模式是一种结构型设计模式,用于过滤一组对象,基…...
【C++】如何用一个哈希表同时封装出unordered_set与unordered_map
👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.哈希桶源码 2.哈希…...
Day45:WEB攻防-PHP应用SQL二次注入堆叠执行DNS带外功能点黑白盒条件
目录 PHP-MYSQL-二次注入-DEMO&74CMS DEMO-用户注册登录修改密码 CMS-74CMS个人中心简历功能 PHP-MYSQL-堆叠注入-DEMO&CTF强网 Demo 2019强网杯-随便注(CTF题型) PHP-MYSQL-带外注入-DEMO&DNSLOG(让服务器主动把数据交出去) 知识点&…...
web安全之:三种常见的Web安全威胁
Web安全是确保Web应用和用户数据安全的一系列措施和实践。了解和防御常见的安全威胁是每个Web开发人员的基本职责。下面,我们将详细讨论三种常见的Web安全威胁:SQL注入、跨站脚本(XSS)和跨站请求伪造(CSRF)…...
C#,图论与图算法,用于检查给定图是否为欧拉图(Eulerian Graph)的算法与源程序
1 欧拉图 欧拉图是指通过图(无向图或有向图)中所有边且每边仅通过一次通路, 相应的回路称为欧拉回路。具有欧拉回路的图称为欧拉图(Euler Graph), 具有欧拉通路而无欧拉回路的图称为半欧拉图。 对欧拉图的一个现代扩展是蜘蛛图,它向欧拉图增加了可以连接的存在点。 这给…...
Dubbo框架的介绍
什么是dubbo Dubbo是一个高性能的、轻量级的开源RPC(远程过程调用)框架,由阿里巴巴公司开发并开源。它提供了基于Java的远程服务调用和管理的解决方案,可以帮助开发者快速构建分布式应用和服务。 Dubbo具有以下特点: …...
手机实时监控电脑屏幕(手机可以看到电脑在干什么吗)
已经2024年了,假如你还在问我,手机可以看到电脑在干什么吗,有没有手机实时监控电脑屏幕的系统。 那么证明,你可能已经out 了。 现代科技告诉发展的态势下,这种技术已经很成熟了。 域智盾软件就可以实现这种效果↓我们…...
合成孔径雷达干涉测量InSAR数据处理、地形三维重建、形变信息提取、监测
原文链接:合成孔径雷达干涉测量InSAR数据处理、地形三维重建、形变信息提取、监测https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247598798&idx7&snc054ed7c9d9c433d00837a7798080935&chksmfa820329cdf58a3f6b5986d6d4da3d19f81e3efd0b159f…...
云原生(五)、Docker-Swarm集群
基础环境说明 1、环境准备 1、启动4台服务器(在同一个网段内)。 2、重命名4台服务器,方便区分。 hostnamectl set-hostname swarm1 reboot安装docker。参考文章:云原生(二)、Docker基础 2、DockerSwarm…...
arm核的DMPIS是如何计算的
直接看这篇:https://zhuanlan.zhihu.com/p/660155292 写的很好: "SA8155P的CPU算力计算如下(按照A75性能提升50%来计算,即 5.2 * 1.5 7.8 DMIPS/MHz ) SA8155P算力 2.419GHz * 1核 * 7.8 DMIPS/MHz 2.131GH…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
