ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 6601|回复: 10

[原创] VSTO之玩转网页抓取(C#)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-11-18 19:51 | 显示全部楼层 |阅读模式

VSTO相对于VBA等有着得天独厚,无法比拟的优势,当然在网抓具体体现在多线程,编码,以及验证码图片等等的处理,当然具体有什么好处,度娘比我更有说服力,我就不多费话了。


C#用于网抓的类和方法很多,我就挑和VBA相近类using System.Net下的HttpWebRequest来和大家探讨一下。

首先引用using System.Net是针对HttpWebRequest<<必需的,再次对于文本的流(上传或处理流)using System.IO<<必需,再者如果是想开启多线程,那么using System.Threading也就是必需的了,还有一个处理验证码图片的时候需要using System.Drawing,当然还有其他的一些类,暂时就不说了,至少上面这几个类也不太可能说得太透彻,主要就是针对网抓来进行。


第一,进行一个最简单的网抓,GET类

  1. string url = "填入GET的网页";
  2.             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  3.             request.Method = "GET";
  4.             HttpWebResponse response = (HttpWebResponse)request.GetResponse();
复制代码

这样的话就得到了服务器返回的数据流,然后再对这个流进行简单处理

  1. public static string GetResponseText(HttpWebResponse response)
  2.         {
  3.       string Text = "";
  4.       using (Stream stream = response.GetResponseStream())
  5.       {
  6.             StreamReader sr = new StreamReader(stream, Encoding.Default);
  7.             Text = sr.ReadToEnd();
  8.       }
  9.       return Text;
  10.         }
复制代码

上面一个自定义函数就是针对处理response流

所以最上面那一段代码只需再加进一句引用这个处理流的函数即可

  1. string responseText = GetResponseText(response);
复制代码

这样就得到了我们所需要的文本

第二,最简单的POST

POST的中文意思是提交,所以POST就是客户端与服务器交互,客户端告诉服务器,我提交一些数据,告诉需要做什么,这样等待服务器做出相应的回应。

一般POST和GET在代码上没有什么区别,只不过在POST的时候比GET多了一个提交数据,就是VBA里常用的.send,话不多说,先上一段代码

  1. string url = "填入GET的网页";
  2. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  3. request.Method = "POST";
复制代码

好了,至此就完成了一个简单的POST示例,有了上面这个模板,基本上能完成所以网抓。其他的无非就是在上面进行修修补补,比如模拟其他头文件,针对于HTTPS的证书等,还值得一提的就是Cookie了,因为这个request不再受cookie的困扰,不像VBA里会自动保持cookie,就是说对于同一个request,你每次都需要去设置这个cookie,方法也简单,后面再细说。

我想大家光看完上面这些,估计就在想,啊,C#的写的代码还没VBA的简单,实乎不然,其实比VBA里的代码要简单,为什么这么说呢,首先一点,就是编码问题,再也不用去找转UTF-8,GB2312,还有其实一些网页编码等,还有一个就是上传文件等的流,不用再去想,唉这种文件的怎么send出去呀,代码是什么呀。。不用再去乱翻一堆资料了。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-11-19 11:16 | 显示全部楼层
谢谢分享,确实觉得VSTO一个最大的优势就是可以有很多的.Net的资源可以直接利用。

TA的精华主题

TA的得分主题

发表于 2015-4-19 21:53 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-5-4 10:15 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-9-10 13:49 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-6-15 15:18 | 显示全部楼层
C#搞不来,照着楼主的代码画了下vb.net,测试成功,呵呵
  1. Imports Net = System.Net
  2. Imports IO = System.IO
  3. Public Class ThisWorkbook

  4.     Public Function httpweb(url As String)
  5.         Dim request As Net.HttpWebRequest = Net.HttpWebRequest.Create(url)
  6.         request.Method = "GET"
  7.         Dim response As Net.HttpWebResponse = request.GetResponse()
  8.         httpweb = GetResponseText(response)
  9.     End Function


  10.     Private Function GetResponseText(response As Net.HttpWebResponse)

  11.         Dim text As String = Nothing
  12.         Dim stream As IO.Stream = response.GetResponseStream()
  13.         Dim SR As IO.StreamReader = New IO.StreamReader(stream, Encoding.UTF8)
  14.         text = SR.ReadToEnd()
  15.         Return text
  16.     End Function
  17. End Class
复制代码

TA的精华主题

TA的得分主题

发表于 2016-6-15 15:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
sheet1这里做个按钮来引用,刚刚学VSTO,还是很不熟悉
  1. Public Class Sheet1

  2.     Private Sub Sheet1_Startup() Handles Me.Startup

  3.     End Sub

  4.     Private Sub Sheet1_Shutdown() Handles Me.Shutdown

  5.     End Sub

  6.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  7.         Me.Range("A1").Value2 = Globals.ThisWorkbook.httpweb("http://www.baidu.com")
  8.     End Sub
  9. End Class
复制代码

TA的精华主题

TA的得分主题

发表于 2018-1-2 15:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 jinbinghao 于 2018-1-2 15:56 编辑

以前用VBA抓过一个天气预报的,一直用的很正常.
改用C#后,试了好久,尝试用各种编码,一直乱码,一直乱码,一直乱码.
原来数据是压缩的,还得先解压,VBA就不需要.
虽然VBA现在太多不支持的东西,但依然还是有点小牛B的地方呀.
GZipStream gzip = new GZipStream(stream, CompressionMode.Decompress)

TA的精华主题

TA的得分主题

发表于 2018-1-2 20:35 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-2-23 19:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
正想学这方面的知识
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-12 05:17 , Processed in 0.058058 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表