C# 网页图片爬虫的几种技术基础

简介:

一、文件流方式获取网络图片资源

方法1

复制代码
string url = string.Format(@"http://webservice.36wu.com/DimensionalCodeService.asmx/GetCodeImgByString?size={0}&content={1}", 5, 123456);
System.Net.WebRequest webreq = System.Net.WebRequest.Create(url);
System.Net.WebResponse webres = webreq.GetResponse();
using(System.IO.Stream stream = webres.GetResponseStream())
{
  ictureBox1.Image = Image.FromStream(stream);
}
复制代码

方法2

生成图片的URL假设是这样:http://localhost/administrator/qrcode.aspx?pid=78

qrcode.aspx.cs的生成图片的部分代码:

复制代码
Image image = new Bitmap(200, 200);
Graphics g = Graphics.FromImage(image);
try
{
  string url="http://localhost";

  DotNetBarcode bc = new DotNetBarcode();
  bc.Type = DotNetBarcode.Types.QRCode;
  bc.PrintCheckDigitChar = true;
  bc.WriteBar(url, 0, 0, 210, 210, g);

  System.IO.MemoryStream ms = new System.IO.MemoryStream();
  image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

  Response.ClearContent();
  //Response.ContentType = "image/Png";
  //Response.BinaryWrite(ms.ToArray());
  Response.ContentType = "application/octet-stream";
  Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode("qrcode.png", System.Text.Encoding.UTF8)); Response.BinaryWrite(ms.ToArray());
ms.Dispose(); }
finally { g.Dispose(); image.Dispose(); }
复制代码

 

或者这样

复制代码
string fileName = "aaa.txt";//客户端保存的文件名 string filePath = Server.MapPath("DownLoad/aaa.txt");//路径 //以字符流的形式下载文件 FileStream fs = new FileStream(filePath, FileMode.Open); byte[] bytes = new byte[(int)fs.Length]; fs.Read(bytes, 0, bytes.Length); fs.Close(); Response.ContentType = "application/octet-stream"; //通知浏览器下载文件而不是打开 Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); Response.BinaryWrite(bytes); Response.Flush(); Response.End();
复制代码

 

 

 

 二、WebClient方式从服务器上下载文件

参考方法1:

复制代码
/// <summary>
/// 下载服务器文件至客户端
/// </summary>
/// <param name="url">被下载的文件地址,绝对路径</param>
/// <param name="dir">另存放的目录</param>
public void DownloadUrlFile(string url, string dir)
{
    WebClient client = new WebClient();
    string fileName = Path.GetFileName(url);  //被下载的文件名
    string path = dir + fileName;   //另存为的绝对路径+文件名
    try
    {
if (!System.IO.Directory.Exists(dir))
{
    System.IO.Directory.CreateDirectory(dir);
}
if (!System.IO.File.Exists(path))
{
    client.DownloadFile(url, path);
}
    }
    catch (Exception)
    {
// ShowError("文件下载失败!");
    }
}
复制代码

 

 

 

 

 

 

参考方法2 [2]

复制代码
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GetPictureByUrl.aspx.cs" Inherits="HoverTreeMobile.GetPictureByUrl" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>根据网址把图片下载到服务器 - 何问起</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    图片网址:<br /><asp:TextBox runat="server" ID="textBoxImgUrl" Width="500" Text="http://hovertree.com/hvtimg/201508/cnvkv745.jpg" />
     <br />   <asp:Button runat="server" ID="btnImg" Text="下载" OnClick="btnImg_Click" />
        <br /><asp:Image runat="server" ID="hvtImg" />
        <br />
        <asp:Literal runat="server" ID="ltlTips" />
    </div>
    </form>
</body>
</html>
复制代码


页面所对应的代码

复制代码
using System;

namespace HoverTreeMobile
{
    public partial class GetPictureByUrl : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnImg_Click(object sender, EventArgs e)
        {
            try
            {
                System.Net.WebClient m_hvtWebClient = new System.Net.WebClient();
                

                //如果不是指定格式图片
                //例如http://hovertree.com/hvtart/bjae/t2lo8pf7.htm 是htm文件,不是图片
                if (!(textBoxImgUrl.Text.EndsWith(".jpg")
                    || textBoxImgUrl.Text.EndsWith(".gif")
                    || textBoxImgUrl.Text.EndsWith(".png")))
                {
                    ltlTips.Text = "输入的不是指定格式的图片的网址";

                    return;
                }

                //生成随机的图片文件名
                string m_picFileName = HoverTree.HoverTreeFrame.Utils.GetHoverTreeString()+ HoverTree.HoverTreeFrame.HoverString.GetLastStr(textBoxImgUrl.Text,4);

                string m_keleyiPicture = Server.MapPath("/hovertreeimages/"+ m_picFileName);
                //根据网址下载文件
                m_hvtWebClient.DownloadFile(textBoxImgUrl.Text, m_keleyiPicture);

                hvtImg.ImageUrl = "/hovertreeimages/" + m_picFileName;
                ltlTips.Text = string.Empty;
            }
            catch(Exception ex)
            {
                ltlTips.Text = ex.ToString();
            }
        }
    }
}
复制代码


//生成随机的图片文件名
string m_picFileName = HoverTree.HoverTreeFrame.Utils.GetHoverTreeString()+ HoverTree.HoverTreeFrame.HoverString.GetLastStr(textBoxImgUrl.Text,4);
以上代码,请下载源代码查看详细实现方法。部分可到 LINK 查看。

HoverTree 开源项目:新增根据网址把图片下载到服务器功能

请看 HoverTreeMobile 项目,http://hovertree.com,何问起,源代码下载 LINK。

 

三、网页相关的方式

方法1:

复制代码
   public partial class DownLoadFile : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string picName = Request.QueryString["InternalSysURL"];
            if (!String.IsNullOrEmpty(picName))
            {
                byte[] content = this.GetImageContent(picName);
                this.WriteResponse(picName, content);
            }
        }

 

        #region
        private byte[] GetImageContent(string picName)
        {
            string fileURL = GetImgUrlPrefix() + picName;

 

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(fileURL);
            request.AllowAutoRedirect = true;

 

            WebProxy proxy = new WebProxy();
            proxy.BypassProxyOnLocal = true;
            proxy.UseDefaultCredentials = true;

 

            request.Proxy = proxy;

 

            WebResponse response = request.GetResponse();

 

            using (Stream stream = response.GetResponseStream())
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    Byte[] buffer = new Byte[1024];
                    int current = 0;
                    while ((current = stream.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        ms.Write(buffer, 0, current);
                    }
                    return ms.ToArray();
                }
            }
        }

 

        private void WriteResponse(string picName, byte[] content)
        {
            Response.Clear();
            Response.ClearHeaders();
            Response.Buffer = false;
            Response.ContentType = "application/octet-stream";
            Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(picName, Encoding.Default));
            Response.AppendHeader("Content-Length", content.Length.ToString());
            Response.BinaryWrite(content);
            Response.Flush();
            Response.End();
        }

 

        private static string GetImgUrlPrefix()
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(AppDomain.CurrentDomain.BaseDirectory + "//Pages//ItemMaintain//ImageDownLoad.xml");
            XmlNodeList nodes = xmlDoc.GetElementsByTagName("ProductImageOriginal");
            if (nodes.Count > 0)
            {
                return nodes[0].ChildNodes[0].Value;
            }
            else { return ""; }
        }

 

        #endregion
    }
复制代码

方法2[3]

根据URL请求获取页面HTML代码

复制代码
    /// <summary>  
    /// 获取网页的HTML码  
    /// </summary>  
    /// <param name="url">链接地址</param>  
    /// <param name="encoding">编码类型</param>  
    /// <returns></returns>  
    public static string GetHtmlStr(string url, string encoding)  
    {  
        string htmlStr = "";  
        if (!String.IsNullOrEmpty(url))  
        {  
            WebRequest request = WebRequest.Create(url);            //实例化WebRequest对象  
            WebResponse response = request.GetResponse();           //创建WebResponse对象  
            Stream datastream = response.GetResponseStream();       //创建流对象  
            Encoding ec = Encoding.Default;  
            if (encoding == "UTF8")  
            {  
                ec = Encoding.UTF8;  
            }  
            else if (encoding == "Default")  
            {  
                ec = Encoding.Default;  
            }  
            StreamReader reader = new StreamReader(datastream, ec);  
            htmlStr = reader.ReadToEnd();                           //读取数据  
            reader.Close();  
            datastream.Close();  
            response.Close();  
        }  
        return htmlStr;  
    }  
复制代码

下载网站图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/// <summary> 
/// 下载网站图片 
/// </summary> 
/// <param name="picUrl"></param> 
/// <returns></returns> 
public  string  SaveAsWebImg( string  picUrl) 
     string  result =  ""
     string  path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase +  @"/File/" ;   //目录 
     try 
    
         if  (!String.IsNullOrEmpty(picUrl)) 
        
             Random rd =  new  Random(); 
             DateTime nowTime = DateTime.Now; 
             string  fileName = nowTime.Month.ToString() + nowTime.Day.ToString() + nowTime.Hour.ToString() + nowTime.Minute.ToString() + nowTime.Second.ToString() + rd.Next(1000, 1000000) +  ".jpeg"
             WebClient webClient =  new  WebClient(); 
             webClient.DownloadFile(picUrl, path + fileName); 
             result = fileName; 
        
    
     catch  { } 
     return  result; 

 

 

 

 

参考文章

1. C# 通过URL获取图片并显示在PictureBox上的方法

2. 根据网址把图片下载到服务器C#代码

3. C#获取网页的HTML码、下载网站图片

4. C#如何通过URL下载图片?

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。


    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/5926259.html,如需转载请自行联系原作者




相关文章
|
2月前
|
数据采集 JavaScript C#
C#图像爬虫实战:从Walmart网站下载图片
C#图像爬虫实战:从Walmart网站下载图片
|
3月前
|
数据采集 存储 C#
C# 爬虫技术:京东视频内容抓取的实战案例分析
C# 爬虫技术:京东视频内容抓取的实战案例分析
|
27天前
|
数据采集 存储 数据挖掘
深入探索 Python 爬虫:高级技术与实战应用
本文介绍了Python爬虫的高级技术,涵盖并发处理、反爬虫策略(如验证码识别与模拟登录)及数据存储与处理方法。通过asyncio库实现异步爬虫,提升效率;利用tesseract和requests库应对反爬措施;借助SQLAlchemy和pandas进行数据存储与分析。实战部分展示了如何爬取电商网站的商品信息及新闻网站的文章内容。提醒读者在实际应用中需遵守法律法规。
152 66
|
9天前
|
数据采集 Web App开发 JavaScript
Selenium爬虫技术:如何模拟鼠标悬停抓取动态内容
本文介绍了如何使用Selenium爬虫技术抓取抖音评论,通过模拟鼠标悬停操作和结合代理IP、Cookie及User-Agent设置,有效应对动态内容加载和反爬机制。代码示例展示了具体实现步骤,帮助读者掌握这一实用技能。
Selenium爬虫技术:如何模拟鼠标悬停抓取动态内容
|
2月前
|
数据采集 机器学习/深度学习 搜索推荐
Python爬虫技术基础与应用场景详解
本文介绍了爬虫技术的基本概念、原理及应用场景,包括数据收集、价格监测、竞品分析和搜索引擎优化等。通过一个实战案例展示了如何使用Python爬取电商网站的商品信息。强调了在使用爬虫技术时需遵守法律法规和道德规范,确保数据抓取的合法性和合规性。
|
2月前
|
数据采集 存储 前端开发
Java爬虫开发:Jsoup库在图片URL提取中的实战应用
Java爬虫开发:Jsoup库在图片URL提取中的实战应用
|
2月前
|
数据采集 JavaScript 前端开发
构建简易Python爬虫:抓取网页数据入门指南
【8月更文挑战第31天】在数字信息的时代,数据抓取成为获取网络资源的重要手段。本文将引导你通过Python编写一个简单的网页爬虫,从零基础到实现数据抓取的全过程。我们将一起探索如何利用Python的requests库进行网络请求,使用BeautifulSoup库解析HTML文档,并最终提取出有价值的数据。无论你是编程新手还是有一定基础的开发者,这篇文章都将为你打开数据抓取的大门。
|
3月前
|
数据采集 JavaScript 前端开发
构建你的第一个Python爬虫:抓取网页数据入门指南
【8月更文挑战第31天】在数字时代,数据是新的石油。本文将引导初学者通过简单的步骤,使用Python编程语言创建一个基础的网络爬虫程序。我们将探索如何从网络上提取信息,并理解背后的原理。无论你是编程新手还是想要扩展你的技术工具箱,这篇文章都将为你提供一条清晰的道路,让你学会编写能够自动获取网络数据的脚本。准备好开始你的网络数据抓取之旅了吗?让我们现在就开始吧!
|
3月前
|
数据采集 JavaScript 前端开发
Python 爬虫实战:抓取和解析网页数据
【8月更文挑战第31天】本文将引导你通过Python编写一个简单的网络爬虫,从网页中抓取并解析数据。我们将使用requests库获取网页内容,然后利用BeautifulSoup进行解析。通过本教程,你不仅能够学习到如何自动化地从网站收集信息,还能理解数据处理的基本概念。无论你是编程新手还是希望扩展你的技术工具箱,这篇文章都将为你提供有价值的见解。
|
3月前
|
Linux C#
【Azure App Service】C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Application
【Azure App Service】C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Application