网页信息抓取

article/2025/9/30 3:45:01
——看到社区里面好多人都有抓取网页信息的需要,特地把我自己做的DEMO放上来,供大家参考,也希望大家多提意见,共同学习完善这个小程序.
 
准备工具:Dreamweaver,RegexBuddy

抓取分3步进行:
1)下载网页数据;
2)处理网页得到想要的数据;
3)保存数据

一、下载网页源代码
这个步骤有很多种方法可以实现,但是目的只有一个,那就是: 给定网页Url,获得网页源代码.


1.使用WebClient下载:

//...
//这里是WebClient需要使用的命名空间
using System.Net;					
//...
WebClient wbDown = new WebClient();		
string strResult = wbDown.DownloadString("http://www.baidu.com/");
//OK,strResult就是下载到的网页源代码
//...


优点:方便,快捷,直接调用System.Net.WebClient就可以进行下载,大部分网页都可以下载下来

缺点:如果遇到需要用户名名和密码的网站,那就很麻烦了.


2.使用HttpWebRequest和HttpWebResponse

//...
using System.Net;
using System.IO;
//引用的命名空间
string strUrl = "http://www.baidu.com/";
HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(strUrl);
HttpWebResponse Response = (HttpWebResponse)Request.GetResponse();
StreamReader sr = new StreamReader(Response.GetResponseStream(), System.Text.Encoding.GetEncoding("gb2312"));
string strResult = sr.ReadToEnd();
//...

优点:灵活性比较大,可以下载多种数据,设置以后可以下载带用户名密码的网页,可以传递cookie等;

缺点:代码比较多,不太优雅,建议封装后使用.


3.使用WebBrowser

WebBrower相当于一个小型的或者 mini IE,你可以在窗体中显示这个控件,然后查看具体的网页,而前面几种却不可以.当然,如果你愿意,也可以把它隐藏起来.


i)隐藏WebBrowser

//...
string Url = @"http://www.baidu.com/";
WebBrowser wb = new WebBrowser()
{Url = new Uri(Url)
};
while (!wb.DocumentText.Contains("</html>"))
{if(DialogResult.OK == MessageBox.Show("数据下载中,请稍等..."))continue;
}
string strResult = wb.DocumentText;
//...

ii)显示WebBrowser

这个就不多说了,拖控件,改Url,你懂得.网页源代码 = 控件名.DocumentText.


优点:WebBrowser的优点有很多,比如可以查看网页的内容,特殊网页也能抓取...

缺点:拖着这么大一个控件,着实有点累赘...


//待添加其他方法



二、定位网页数据

这个过程我称之为定位数据,就是在整个网页中定位你想要的那个元素,比如一个<table>或者一段<div>等.

此过程目前有两种方法供大家选择:

1.正则表达式匹配;

2.使用HtmlAgilityPack;(不是很熟悉)

本文只提供正则表达式的方法供大家借鉴,还请读者见谅.


正则表达式定位

如果你是长期做数据采集工作,建议深入学习一下,这里是DeerChao的正则表达式入门,非常推荐.如果你只是想做一个课程设计,听听我的简介也无妨.

"定位"过程,主要使用了Regex.Match()方法,返回的结果是正则匹配的文本.也就是目标网页数据.

我大致解释一下,比如你有这样一段文本:

"I am 20 years old."
想得到年龄这个数据,也就是"20",如何使用正则捕获呢?

//...
using System.Text.RegularExpressions;
//导入正则表达式命名空间
//...
string strTest = @"I am 20 years old.";
string strResult = "";
strResult = Regex.Match(strTest, @"\d+").Value;
Console.WriteLine(strResult);
Console.ReadKey();

OK,捕获成功!但也许你会问,这个程序和定位有什么关系呢?恩,让我来解释下:

你可以多次使用: strResult = Regex.Match(strResult , @"正则").Value;一步一步缩小网页中数据的范围,最后定位到你想到的那部分数据.

类似"I am 20 years old."你可以分三步定位到"20"

那么网页你可以用相同的方式定位到嵌套中的内容(当然,没有嵌套的部分, 你也可以尝试一次性捕获),


strResult = Regex.Match(strResult , "(?is)登录.*?更多").Value; 
strResult = Regex.Match(strResult , "(?is)<input.type=""submit"".*?>").Value;
通过这两句代码,你就可以定位到百度的"百度一下"按钮,当然你也可以把前面一句删除,因为百度首页只有一个提交按钮.但是如果是其他网站,有多个提交按钮那就要重新考虑正则的写法.

FAQ

定位数据的原理基本介绍完了,相信读者会有很多疑问(文笔不好,见谅),我自己先写一些吧:

Q:匹配的结果有多个值怎么办?

A:匹配网页数据的时候,多会遇到匹配结果是多个的情况,比如多个table,多个div标签等,这个时候,我们可以使用MatchCollection来接受返回的结果集,例如:
MatchCollection mcResult = Regex.Matches(strHtml, @"(?is)<table.*?table>");

你可以使用foreach遍历这个集合,也可以使用下标访问其中的元素.但是注意,你需要使用Regex.Matches()方法,而不是Regex.Match()方法,注意到那个es了吗?这个就代表你可能匹配了多个结果.

Q:你在正则里写的(?is)是什么意思?

A:这个是正则表达式的匹配选项,.Net里面也有对应的选项
(?i) 代表不区分大小写 等价于.net中RegexOptions.IgnoreCase选项;

(?s) 表示让"."号匹配换行,即"."代表了[\s\S] 等价于.net中RegexOptions.Singleline选项;

//当然还有其他问题,这里就先不列出来了,希望大家可以发表评论,我会尽力解答.

三、保存数据
保存数据有多种形式,比如XML格式,<table>标签内容,直接写入数据库,保存为txt....大家可以依照自己的需求来选择合适的方式进行保存.
但是,为了统一,我建议使用XML来保存内容,一来,一个网页中的数据基本上都可以转换为XML格式;二来,XML录入数据库,转换为其他形式都很方便;三来,XML操作数据方便,如果需要修改数据,有很多API类库之类的可以调用.总之是好处多多啊,呵呵.

@"Author:			wushuai1346Description:		不断完善中.版权所有,转载请注明出处,谢谢.Copyright (C) 2011 wushuai1346,All Rights ReservedUrl:				http://blog.csdn.net/wushuai1346/article/details/7108424Createtime :    	2011-12-28Updatetime :    	2011-12-29"



http://chatgpt.dhexx.cn/article/OFEE2jIW.shtml

相关文章

网页抓取 - 完整指南

&#x1f482; 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 介绍什么是网页抓…

使用 Python 进行网页抓取

如果您知道如何做到这一点&#xff0c;那么对于企业和个人使用来说&#xff0c;网络抓取似乎是一种非常有用的节省时间的工具。我们将重点介绍为什么您应该使用 Python 进行网页抓取&#xff0c;并为您提供有关如何完成它的快速教程&#xff0c;包括使用哪些Python 开发工具。 …

网页数据抓取工具 (谷歌插件 web Scraper)

最简单的数据抓取教程&#xff0c;人人都用得上 Web Scraper 是一款免费的&#xff0c;适用于普通用户&#xff08;不需要专业 IT 技术的&#xff09;的爬虫工具&#xff0c;可以方便的通过鼠标和简单配置获取你所想要数据。例如知乎回答列表、微博热门、微博评论、电商网站商品…

国内五大主流网站内容抓取工具/采集软件大盘点

大数据技术用了多年时间进行演化&#xff0c;才从一种看起来很炫酷的新技术变成了企业在生产经营中实际部署的服务。其中&#xff0c;数据采集产品迎来了广阔的市场前景&#xff0c;无论国内外&#xff0c;市面上都出现了许多技术不一、良莠不齐的采集软件。 今天&#xff0c;我…

排名前20的网页爬虫工具

网络爬虫在许多领域都有广泛的应用,它的目标是从网站获取新的数据,并加以存储以方便访问。而网络爬虫工具越来越为人们所熟知,因为它能简化并自动化整个爬虫过程,使每个人都可以轻松访问网络数据资源。 1. Octoparse Octoparse是一个免费且功能强大的网站爬虫工具,用于从网…

2020年30种最佳的免费网页爬虫软件

原文链接&#xff1a;2020年30种最佳的免费网页爬虫软件 网页抓取&#xff08;也称为网络数据提取&#xff0c;网络爬虫&#xff0c;数据收集和提取&#xff09;是一种网页技术&#xff0c;从网站上提取数据。将非结构化数据转换为可以存储在本地计算机或数据库中的结构化数据…

12款最常使用的网络爬虫工具推荐

网络爬虫在当今的许多领域得到广泛应用。它的作用是从任何网站获取特定的或更新的数据并存储下来。网络爬虫工具越来越为人所熟知&#xff0c;因为网络爬虫简化并自动化了整个爬取过程&#xff0c;使每个人都可以轻松访问网站数据资源。使用网络爬虫工具可以让人们免于重复打字…

推荐15款免费的网页抓取软件

网页抓取&#xff08;也称为网络数据提取或网页爬取&#xff09;是指从网上获取数据&#xff0c;并将获取到的非结构化数据转化为结构化的数据&#xff0c;最终可以将数据存储到本地计算机或数据库的一种技术。 网页抓取是通过抓取软件实现的。当你在使用浏览器如Chorme浏览页面…

IPMI22:ipmi——ipmitool使用

简介 ipmitool是一个实用程序&#xff0c;用于监视、配置和管理支持智能平台管理接口 (IPMI) 的工具&#xff0c;遵循ipmi协议。它是一个开源项目&#xff0c;项目官网&#xff1a;https://sourceforge.net/projects/ipmitool/&#xff0c;github地址&#xff1a;https://gith…

从入门到精通:IPMITool 的详尽指南

简介&#xff1a;分享一款非常实用的服务器管理工具——IPMITool。许多从事服务器管理的朋友可能已经对这款工具有所了解&#xff0c;但对于初入这个领域的朋友们&#xff0c;它可能仍然有些陌生。本文将带领你从了解IPMITool的基本概念开始&#xff0c;逐步深入到其实际应用中…

ipmitool常用命令详解

ipmitool命令 ipmitool –I [open|lan|lanplus] command OpenIPMI接口&#xff0c;command有以下项&#xff1a; raw&#xff1a;发送一个原始的IPMI请求&#xff0c;并且打印回复信息。 lan&#xff1a;配置网络&#xff08;lan&#xff09;信道(channel) chassis &#xf…

如何自己实现字符串拷贝函数

一般写法&#xff1a; char *my_strcpy(char *dst,const char *src) {assert(dst ! NULL);assert(src ! NULL);char *ret dst;while((* dst * src) ! \0) // 运算符优先级高于*;return ret; } 可以看到很简单&#xff0c;只需考虑三点。 1&#xff0c;判断源字符串和目的字…

C语言 字符串-字符串的复制

字符串复制函数&#xff1a; strcpy(目标字符串的首地址,被复制的字符串的首地址) 复制p到a&#xff1a; char * p"12345";char a[20];strcpy(a, p);printf("%s\n", a); strcpy_s(目标字符串的首地址,缓冲长度,被复制的字符串的首地址) strcpy_s(a, 20, p…

C语言 实现字符串的复制

1.将字符串a的数据复制到字符串b中 &#xff08;5.用for循环和指针来实现 &#xff09;------注释掉部分采用的是此方法 #include <stdio.h> int main() {void copy_string(char from[], char to[]);char a[]"I am a student.";//char a[11];//for (int i 0…

C语言的字符串复制

提示&#xff1a;仅供参考&#xff0c;如有错误&#xff0c;还望指出。 目录 目录 一、字符串复制 二、一些优化 1.一次简单优化 2.二次优化 3.三次优化 4.四次优化 5.最后的优化 总结 前言 以下是对字符串复制的一些优化 一、字符串复制 这是自己能想到的方法 主要…

不使用strcpy()函数实现字符串复制功能

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h>int main() {/*不使用strcpy()函数实现字符串复制功能*/int i 0;char str1[100];char str2[100];printf("请输入字符串-> \n");gets(str1);while (str1[i] ! \0) /*判断字符数组的第一位不是结束符*/{st…

C语言字符串复制函数strcpy()的编写与详解

strcpy&#xff0c;即string copy&#xff08;字符串复制&#xff09;的缩写。 原型声明&#xff1a;char *strcpy(char *dest, const char *src); 头文件&#xff1a;#include <string.h> 和 #include <stdio.h> 功能&#xff1a;把从src地址开始且含有NULL结束符…

C语言函数库之字符串拷贝函数(string.h)

1.字符串拷贝函数strcpy 函数定义&#xff1a; char *strcpy(char *str1, const char *str2); 函数功能&#xff1a;把字符串str2(包括\0)拷贝到字符串str1当中&#xff0c;并返回str1。举例&#xff1a; #include<stdio.h> #include<string.h> int main(){char s…

【C/C++】C语言复制字符串及复制函数汇总(strcpy()/memcpy()/strncpy()/memmove())

目录: strcpy()举例&#xff1a; memcpy()举例&#xff1a; strncpy()举例&#xff1a; memmove()举例&#xff1a; 我们首先来考虑一个简单的问题&#xff0c;我们定义了一个字符串&#xff0c;然后想要复制这个字符串&#xff0c;在C语言中&#xff0c;我们可以用for循环和指…

C语言编写字符串拷贝(strcpy)函数详解以及assert函数

目录 一.strcpy函数 原型声明 功能 说明 代码及运行结果 二.自己编写strcpy函数 代码一及运行结果 代码二&#xff08;改进&#xff09;及运行结果 代码三&#xff08;进一步改进&#xff09;及assert函数 在这里解释一下什么是asser函数&#xff08;断言函数&#xff…