c 抓取网页数据(C#中正则表达式的用法及使用的使用方法有哪些)
优采云 发布时间: 2021-10-29 13:20c 抓取网页数据(C#中正则表达式的用法及使用的使用方法有哪些)
这两天一直在学习课程,打算从网上搜集一些有趣的资料。最近大家对环境问题的关注度越来越高,我们计划采集中国各个城市的每日空气质量日报数据。登录环保部网站后,以网站上的表格形式提供。但不提供数据导出或包下载功能。所以我在互联网上搜索了从网页中获取数据的方法。其中,很多人都提到并推荐了抓取网页源代码,然后使用正则表达式获取的方法。于是先是学习了正则表达式,然后又折腾了一遍,终于完成了任务。
正则表达式(Regular Expression,regex/regexp/re)是计算机科学的一个概念。正则表达式使用单个字符串来描述和匹配一系列符合某种语法规则的字符串。在许多文本编辑器中,正则表达式通常用于检索和替换符合某种模式的文本。(本段出处:正则表达式)
推荐这个网站学习正则表达式的使用。感觉你看看这个网站,很快就能上手了。
CSDN上sysdzw的版主多年前写了一个命令行小程序,叫RegTop(有后续基于表单的版本RegTestTool),可以结合批量命令来抓取网页数据。不幸的是,我不知道该怎么做。一个关于网页编码的参数总是设置不正确(IQ Clumsy -_-|||),所以只好放弃治疗了……不过RegTestTool这个小工具,还不如手头有一个,比较好用用于检查正则表达式是否正确编写。
关于正则表达式的更多信息,我不会在这里过多介绍。我只看了需要的部分。先简单说一下C#中正则表达式的用法:
using System.Text.RegularExpression;
string pattern = @"(\d{1,8})\n.*([^x00-xff]{2,8})\n.*(\d{4}-\d\d-\d\d)\n.*(\d{1,4})\n.*([^x00-xff]{2,6}|--)\n.*(.*?)\n.*([^x00-xff]{1,4})";
Regex regex = new Regex(pattern);
Match m = regex.Match(web_source);
while (m.Success)
{
// Do something...
m = m.NextMatch();
}
首先,使用字符串来定义正则表达式。由于各种可能的转义字符在表达式中是必不可少的,直接用@""的形式来表示字符串就可以了。然后,创建一个新的 Regex 变量并用刚才的表达式对其进行初始化。接下来,定义一个 Match 来接收 Regex 变量 Match(string) 方法的结果。如果匹配成功(m.Success==true),则匹配结果存储在m.Groups[i]中。值得注意的是,Groups[0]中放置的不是正则表达式中的第一个匹配,而是正则表达式匹配的整个字符串(注意下一个正则表达式中可能同时有多个匹配) ,所以在使用的时候,直接从Group[1]开始。处理此匹配后,使用 m.NextMatch() 访问下一个匹配。哦,最后,
至于获取网页的源代码,C#提供了相应的方法(这么快忘记了,唉-_-|||),可惜在使用的时候总是无法获取到网页的完整源代码. 时间关系,没深入研究,从网上找了另一种方式获取源码:
using System.Net;
///
/// 获得网页源代码
///
/// 页面网址
/// 以字符串形式保存的网页源代码
private static string GetWebSource(string http)
{
// Set http web address
System.Uri url = new System.Uri(http);
// Set Web Request
HttpWebRequest hwrq = WebRequest.Create(url) as HttpWebRequest;
hwrq.Method = "GET"; // (GET/POST)
hwrq.Referer = http;
hwrq.Timeout = 50000; // Timeout(ms)
hwrq.Accept = "*/*"; // All Types
hwrq.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)";
hwrq.CookieContainer = new CookieContainer(); // Cookies
// Create HttpWebResponse Object
HttpWebResponse resp = hwrq.GetResponse() as HttpWebResponse;
StreamReader reader = new StreamReader(
resp.GetResponseStream(),
System.Text.Encoding.GetEncoding("UTF-8"));
string respHTML = reader.ReadToEnd();
resp.Close();
Console.WriteLine("Web Responsed!");
return respHTML;
}
对于慢速网络或者外来网站,Timeout可以设置大一些,否则超时直接报异常。
问题主要两部分解决了,剩下的工作就简单了:先抓取网页源码,然后用正则表达式匹配有用的项,然后用StringBuilder连接,用StreamWriter写文件,OK~嘿嘿, 采集资料 呵呵~