之前看了Sql Server中的基本数据类型,发现image这个类型还是比较特殊的。

于是乎就做了一个将图片以二进制流形式存储的程序http://www.cnblogs.com/JsonZhangAA/p/5568575.html,现在如果我想批量ed存储网上一个网站的图片,难道我要手写n多地址吗?显然这是不可取的,针对这种情况,就用C#写了一个简单的爬虫,我们所爬的对象是天文网http://www.tianwenwang.cn/

程序的原理是利用WebRequest和WebResponse来相应网站(不懂,只能这样说0.0),而后利用StreamWrite将网站的源文件存储到txt文本文件中,这是我们可以发现一个

现象,图片地址都是类似于http://p.tianwenwang.cn/upload/150318/68181426648163.jpg!list.jpg,http://p.tianwenwang.cn/upload/150312/58341426094069.jpg!list.jpg这种的,于是可以利用正则表达式来将里面的http:全部取出,放到一个字符串数组中,最后就是判断地址时候包含典型的jpg,gif等图片类型后缀了(V1.0最大的缺陷),如果包含就将其存储到数据库中。

后台代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms; namespace 网络爬虫
{
public partial class Form1 : Form
{
private static string[] getLinks(string html)
{
const string pattern = @"http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?";
Regex r = new Regex(pattern, RegexOptions.IgnoreCase); //新建正则模式
MatchCollection m = r.Matches(html); //获得匹配结果
string[] links = new string[m.Count]; for (int i = ; i < m.Count; i++)
{
links[i] = m[i].ToString(); //提取出结果
}
return links;
}
private static bool isValiable(string url)
{
if (url.Contains(".jpg") || url.Contains(".gif")||url.Contains(".png"))
{
return true; //得到一些图片之类的资源
}
return false;
}
private static void savePicture(string path)
{
DataClasses1DataContext db = new DataClasses1DataContext();
Uri url = new Uri(path);
WebRequest webRequest = WebRequest.Create(url);
WebResponse webResponse = webRequest.GetResponse(); if (isValiable(path))//判断如果是图片,就将其存储到数据库中。
{
Bitmap myImage = new Bitmap(webResponse.GetResponseStream()); MemoryStream ms = new MemoryStream();
myImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
var p = new pictureUrl
{
pictureUrl1 = ms.ToArray()
};
db.pictureUrl.InsertOnSubmit(p);
db.SubmitChanges();
} }
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
string rl;
string path = this.textBox1.Text;
Uri url = new Uri(path);
WebRequest webRequest = WebRequest.Create(url);
WebResponse webResponse = webRequest.GetResponse();
Stream resStream = webResponse.GetResponseStream();
StreamReader sr = new StreamReader(resStream, Encoding.UTF8);
StringBuilder sb = new StringBuilder();
while ((rl = sr.ReadLine()) != null)
{
sb.Append(rl);
}
FileStream aFile = new FileStream("../../txt.txt", FileMode.OpenOrCreate);
StreamWriter sw = new StreamWriter(aFile);//将网页存储到了txt文本文件中
sw.WriteLine(sb.ToString());
sw.Close();
string[] s;
s = getLinks(sb.ToString());
int i = ;
foreach (string sl in s)
{
i++;
savePicture(sl);
}
}
}
}

本版本只能对类似于天文网的这类网站进行爬虫,我会后续升级爬虫,争取做出一个通用的爬虫O(∩_∩)O~!

C#写爬虫,版本V1.0的更多相关文章

  1. 历时2月,动态线程池 DynamicTp 发布里程碑版本 V1.0.8

    关于 DynamicTp DynamicTp 是一个基于配置中心实现的轻量级动态线程池管理工具,主要功能可以总结为动态调参.通知报警.运行监控.三方包线程池管理等几大类. 经过多个版本迭代,目前最新版 ...

  2. 促进客户转化,提高客单价!酷客多小程序发布版本V1.0.9!

    商户和企业主的又一次福音!酷客多小程序新零售o2o商城系统酷爱用户,为了追求极致的用户体验,没日没夜地沉浸于新功能的开发,经过一番努力,新功能终于上线啦! 此次版本迭代,在原有功能基础上做了大幅提升, ...

  3. up61博客模版版本v1.0.0

    经过两天的努力 终于把博客模板框架写出来了. 表示写模板累死了,很久没有写样式了,还是那么难搞.没有PHP写函数爽. 不管怎么样 第一版出来了.以下是部分截图.预览 当然在示例部署到项目上的时候 ,部 ...

  4. wzplayer for ios 针对(mms)优化版本V1.0

    wzplayer for ios针对mms优化版本发布. 1.支持mms,http,rtmp,rtsp等协议 2.支持全格式 下载地址:http://www.coolradio.cn/WzPlayer ...

  5. 远程算数程序——版本v1.0

    很少有需要背诵的程序,但是从这个程序开始,标记的都是必须背诵的. 远程算数程序概述 远程算数程序比较简单,分为服务器端和客户端,客户端发送欲计算的表达式给服务器端,服务端经过计算又返回结果给客户端.如 ...

  6. Node.js开源应用OSN发布初始V1.0版本-见面版本

    Nodejs开源应用OSN初始版本V1.0发布,请参考本操作说明文档,有任何问题请留言 Nodejs开源应用OSN发布V1.0版本: OSChina收录地址: OSC收录地址:http://www.o ...

  7. 动态线程池框架 DynamicTp v1.0.6版本发布。还在为Dubbo线程池耗尽烦恼吗?还在为Mq消费积压烦恼吗?

    DynamicTp 简介 DynamicTp 是一个基于配置中心实现的轻量级动态线程池管理工具,主要功能可以总结为 动态调参.通知报警.运行监控.三方包线程池管理等几大类. 经过几个版本迭代,目前最新 ...

  8. YC-Framework版本更新:V1.0.3

    分布式微服务框架:YC-Framework版本更新V1.0.3!!! 本次版本V1.0.3更新 集成分布式事务Seata: 集成分布式事务Tx-LCN: 集成Kafka: 集成RocketMQ: 集成 ...

  9. YC-Framework版本更新:V1.0.5

    分布式微服务框架:YC-Framework版本更新V1.0.5!!! 本次版本V1.0.5更新 所有模块依赖调整: 部分问题修复: Nacos模块化: Eureka模块化: 支持SOA(即WebSer ...

随机推荐

  1. Flash AS实现时钟效果(全脚本实现)

    最近工作中用到个Flash效果,好久没有写FlashAS脚本了,就想从以前写的代码中找一些实例.竟然看到硬盘中还留有若干年前的代码. 这个时钟效果是全部采用脚本实现,图形也是用脚本绘制的.写于2005 ...

  2. 与其他.Net异步模式和类型进行互操作

    返回该系列目录<基于Task的异步模式--全面介绍> Tasks和异步编程模型APM(Tasks and the Asynchronous Programming Model) 从APM到 ...

  3. Redis学习笔记~常用命令总结

    回到目录 客户端redis-cli常用的命令总结 连接到服务器 redis-cli -h 127.0.0.1 -p 6379 --连接指定的redis服务器 发布/订阅, pub/sub模式运行在re ...

  4. 理解nginx的配置

    Nginx配置文件主要分成四部分:main(全局设置).server(主机设置).upstream(上游服务器设置,主要为反向代理.负载均衡相关配置)和 location(URL匹配特定位置后的设置) ...

  5. Atitti 跨语言异常的转换抛出 java js

    Atitti 跨语言异常的转换抛出 java js 异常的转换,直接反序列化为json对象e对象即可.. Js.没有完整的e机制,可以参考java的实现一个stack层次机制的e对象即可.. 抛出Ru ...

  6. iOS开发——高级语法篇&继承、实现、依赖、关联、聚合、组合的联系与区别

    继承.实现.依赖.关联.聚合.组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者 ...

  7. 常用 sql

    一. sql 多个字段拼接 mysql:     1. concat函数  如果连接串中存在NULL,则返回结果为NULL:        例如: select concat('1','2','3') ...

  8. android 权限大全

    教程 博客 淘帖     论坛›eoe·Android开发资源区›Android开发实例教程 191507 12 / 2 页下一页 android 权限大全 『癲瘋霸気』 于 2013-4-3 10: ...

  9. KnockoutJS 3.X API 第四章(14) 绑定语法细节

    data-bind绑定语法 Knockout的声明性绑定系统提供了一种简洁而强大的方法来将数据链接到UI. 绑定到简单的数据属性或使用单个绑定通常是容易和明显的. 对于更复杂的绑定,它有助于更好地了解 ...

  10. CSS技能汇总,研究及实践

    最近一直在研究CSS,因为发现实践中大部分时间都在写CSS,且自己感觉写的很烂,虽然以前看的很多,但却很少有去实践过,更别提研究了,现在发现根本就不是你懂你就会,很多都是你用着用着才真的会了的,于是现 ...