Famio Liew
Application/Web Beginner
home
首页
bubble_chart
工具
keyboard_arrow_down
links
链接收藏
info
关于
assignment_late
苏ICP备15006533号-1
menu 绯末小筑 famio.CN

C#写一个简单爬虫的思路

绯末 于 2018-09-07 09:15:32 发布

这不算一个新奇的东西,现在到处都是爬虫,python的爬虫库更是成熟。因为我对C#更熟悉一些,所以这里用C#来写一个简单的爬虫。

大致需要考虑到的点:


1:先不考虑httpheader
2:从模拟用户访问角度出发,获取某个URL的全部页面代码
3:从获取到的代码中进行字符串处理,从而得到我们需要的东西

再思考以下需要用到的库:


1: WebRequest用于模拟用户访问网页
2:IO用于读取页面的内容
3:需要进行字符串处理,一般都使用正则匹配,所以 RegularExpressions也是必须的

定下了目标后,就可以开始动手了。
首先需要引用库:
using System.Net;
using System.IO;
using System.Text.RegularExpressions;

一般爬虫都是获取页面的文章内容或者图片资源,那么举个例子,这次的目标是,我们获取某个页面的<img>标签里的内容。
首先需要定义获取 <img>标签内容的正则式:<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>
使用Regex类定义一个正则:Regex reg = new Regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>");
然后定义好一个页面的基础Url:string url = "http://www.mzitu.com/zipai/comment-page-1";
接着就是调用WebRequest来获取页面的源码:
WebRequest request = WebRequest.Create(url);
WebResponse response = (WebResponse)request.GetResponse();
拿到源码后我们需要读取内容并存放进一个string变量中:
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream, Encoding.UTF8);
string result = reader.ReadToEnd();

至此,result就是整个页面的源码内容了。上面Encoding.UTF8是将页面编码设定为UTF8,如果出现乱码,这里需要根据页面使用的编码进行改变。
接下来,我们需要将页面源码和最初设定的正则式进行匹配,以筛选出所有<img>标签。
MatchCollection mc = reg.Matches(result);
再使用foreach遍历拿到的<img>,同时进行提取src属性中内容的动作:
foreach (Match m in mc)
{
Regex regex = new Regex("\"[^\"]*\""); //使用正则筛选出第一对引号内的内容(包含引号)
string a = regex.Match(m.ToString()).Value.Replace("\"", ""); //使用Replace去除掉引号
Console.WriteLine(a); //输出
}
上面的变量 a就是图片的地址啦,因为有foreach循环,这里就会输出全部的<img>标签里的图片地址啦:
http://wx3.sinaimg.cn/mw1024/9d52c073gy1fv04izqbtkj20dc0hsdl4.jpg
http://wx1.sinaimg.cn/mw1024/9d52c073gy1fv04j0tnlrj20qo0ygwpi.jpg
http://wx1.sinaimg.cn/mw1024/9d52c073gy1fuwnesg0stj20oz0zk7b9.jpg
http://wx1.sinaimg.cn/mw1024/9d52c073gy1fuwnesaq76j20qo0zkn3v.jpg
http://wx2.sinaimg.cn/mw1024/9d52c073gy1fuwnes5okyj20k00qo77c.jpg
http://wx4.sinaimg.cn/mw1024/9d52c073gy1fuwnesej4gj20j60nyn3z.jpg
http://wx2.sinaimg.cn/mw1024/9d52c073gy1fuwnespsq6j20sg11uh1n.jpg
http://wx3.sinaimg.cn/mw1024/9d52c073gy1fuwnesrhlwj20sg11utls.jpg
http://wx3.sinaimg.cn/mw1024/9d52c073gy1fuwnes1ednj20k00qo3zu.jpg
http://wx2.sinaimg.cn/mw1024/9d52c073gy1fuwnes91fwj20g40o6q7q.jpg
http://wx3.sinaimg.cn/mw1024/9d52c073gy1fuwnes4mk4j20ia0ocdhm.jpg

这样,拿到了我们要的东西后,就是数据库读写的操作了,这里就不赘述了。
这是一个简单的爬虫思路,后续我再补充一些有关header的反爬思路。