用c#编写爬虫在marinetraffic下载船仅仅图片

近期在做船仅仅识别方面的事情,须要大量的正样本来训练adaboost分类器。

于是到marinetraffic这个站点上下载船仅仅图片。写个爬虫来自己主动下载显然非常方便。

站点特点

在介绍爬虫之前首先了解一下marinetraffic这个站点的一些特点:

1. 会定期检測爬虫行为。假设觉得有爬虫大量下载图片。

会把该连接增加黑名单,后几天都没办法下载。

2. 船仅仅图片资源差异大。有的船仅仅有1000多张图,有的船仅仅没有一张图,我们须要的是非常多船仅仅的非常多张图。所以须要对下载的船仅仅按优先级排序。

3. 用来训练分类器的正样本要求检測对象的分辨率一样。而marinetraffic站点下载的图片能够设置下在的图片的宽度,站点依据长宽比,生成对应的高度。所以。不同图片高度不一样。须要自己后期处理。

解决方式

  1. 针对爬虫检測。设置一个随机等待时间,10s左右。能够绕过站点爬虫行为检測。
  2. 对船仅仅依照图片熟练排序,先下载图片数量多的,而且每一个船仅仅不用下载太多。保证图片的差异性。比如
  3. 在下载的时候使用统一的宽度。

    后期处理从图片中抠出分辨率一样的船仅仅

爬虫源代码

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;

namespace 船仅仅图像爬虫
{
    class Program
    {

        static void download_all_shipid(List<string> shipid_list)
        {
            try
            {

                WebClient MyWebClient = new WebClient();

                MyWebClient.Headers["User-Agent"] = "blah";
                MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据;

                //Console.WriteLine("here1");
                //http://www.marinetraffic.com/en/photos/of/ships/shipid:281519/

                //http://www.marinetraffic.com/en/ais/index/ships/all
                //http://www.marinetraffic.com/ais/index/ships/all/page:2/sort:COUNT_PHOTOS/direction:desc;

                for (int pageNum = 1; pageNum < 100; pageNum++)
                {
                    Console.WriteLine("開始分析第" + pageNum + "张网页");

                    MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据;
                    MyWebClient.Headers["User-Agent"] = "blah";
                    try
                    {
                        //Console.WriteLine("here0");
                        Byte[] pageData = MyWebClient.DownloadData(@"http://www.marinetraffic.com/en/ais/index/ships/all/page:" + pageNum + "/sort:COUNT_PHOTOS/direction:desc/per_page:50"); //从指定站点下载数据
                        //pageHtml = Encoding.Default.GetString(pageData);  //假设获取站点页面採用的是GB2312,则使用这句;            

                        string pageHtml = Encoding.UTF8.GetString(pageData); //假设获取站点页面採用的是UTF-8。则使用这句;

                        //Console.WriteLine(pageHtml);//在控制台输入获取的内容;
                        //Console.WriteLine("here1");
                        int urlindex = -1;
                        string org_label = "shipid:";
                        urlindex = pageHtml.IndexOf(org_label, urlindex + 1);

                        while (urlindex != -1)
                        {
                            int endOfUrl = pageHtml.IndexOf("/", urlindex + org_label.Length);
                            //Console.WriteLine("here2");
                            string shipid = pageHtml.Substring(urlindex + org_label.Length, endOfUrl - urlindex - org_label.Length);
                            if (!shipid_list.Contains(shipid))
                            {
                                Console.WriteLine("新增id:" + shipid);
                                shipid_list.Add(shipid);
                            }
                            //Console.WriteLine("已有id:" + shipid);

                            urlindex = pageHtml.IndexOf(org_label, urlindex + 1);
                        }

                        ///保存网页
                        //using (StreamWriter sw = new StreamWriter("ouput.html"))//将获取的内容写入文本
                        //{
                        //    sw.Write(pageHtml);
                        //}
                        Console.WriteLine("完毕第" + pageNum + "页分析");
                    }
                    catch (WebException webEx)
                    {

                        Console.WriteLine(webEx.Message.ToString());

                    }

                    //以下是一个随机数的方法保证10秒后再下载。以绕过违规检測。
                    Console.Write("绕开站点爬虫行为检測中......");
                    Random rd = new Random();
                    int time_sleep = rd.Next() % 10 + 10;
                    Thread.Sleep(time_sleep * 1000);
                    Console.WriteLine();
                }

                Console.WriteLine("分析结束");
                //以下把list内容保存进文件,使用序列化的方法;
                string file = @"C:\Users\dragonfive\Desktop\爬虫获得船仅仅图片\第三批\0_100page_shipid.txt";
                using (FileStream fsWriter = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    //以下对stu进行序列化。
                    BinaryFormatter bf = new BinaryFormatter();
                    bf.Serialize(fsWriter, shipid_list);
                }

            }

            catch (WebException webEx)
            {

                Console.WriteLine(webEx.Message.ToString());

            }
        }

        /// <summary>
        /// 依据得到的ship_id获得该ship_id的全部图片;
        /// </summary>
        /// <param name="ship_id"></param>
        static void download_jpg(string ship_id)
        {
            try
            {
                Console.WriteLine("開始下载shipid为:"+ship_id+"的图片");
                WebClient MyWebClient = new WebClient();

                MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据
                MyWebClient.Headers["User-Agent"] = "blah";
                //http://www.marinetraffic.com/en/photos/of/ships/shipid:281519/
                //http://www.marinetraffic.com/en/photos/of/ships/shipid:371668/per_page:1000/page:1
                Byte[] pageData = MyWebClient.DownloadData(@"http://www.marinetraffic.com/en/photos/of/ships/shipid:" + ship_id + @"/per_page:100/page:1"); //从指定站点下载数据

                //string pageHtml = Encoding.Default.GetString(pageData);  //假设获取站点页面採用的是GB2312。则使用这句            

                string pageHtml = Encoding.UTF8.GetString(pageData); //假设获取站点页面採用的是UTF-8,则使用这句
                //Console.WriteLine(pageHtml);//在控制台输入获取的内容
                Console.WriteLine("元网页已下载");
                //using (StreamWriter sw = new StreamWriter("ouput.html"))//将获取的内容写入文本
                //{
                //    sw.Write(pageHtml);
                //}

                int urlindex = -1;
                string org_label = "data-original=‘";
                urlindex = pageHtml.IndexOf(org_label, urlindex + 1);

                int i = 0;

                //Directory.CreateDirectory(@"./" );
                while (urlindex != -1)
                {
                    int endOfUrl = pageHtml.IndexOf("‘", urlindex + org_label.Length);

                    string url = pageHtml.Substring(urlindex + org_label.Length, endOfUrl - urlindex - org_label.Length);

                    ////以下是unicode编码转换为string的方式;
                    //MatchCollection mc = Regex.Matches(strName, @"\\u([\w]{2})([\w]{2})", RegexOptions.Compiled | RegexOptions.IgnoreCase);
                    //byte[] bts = new byte[2];
                    //foreach (Match m in mc)
                    //{
                    //    bts[0] = (byte)int.Parse(m.Groups[2].Value, NumberStyles.HexNumber);
                    //    bts[1] = (byte)int.Parse(m.Groups[1].Value, NumberStyles.HexNumber);
                    //    musicName += Encoding.Unicode.GetString(bts);
                    //}
                    //Console.WriteLine("接下来下载的是:" + musicName);

                    //以下是一个随机数的方法保证10秒后再下载。以绕过违规检測。
                    Console.Write("绕过站点爬虫行为检測中......");
                    Random rd = new Random();
                    int time_sleep = rd.Next() % 10 + 10;
                    Thread.Sleep(time_sleep * 1000);
                    Console.WriteLine();
                    try
                    {
                        //这是下载的命令;
                        Console.WriteLine(url);

                        MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据
                        MyWebClient.Headers["User-Agent"] = "blah";
                        Byte[] jpgdata = MyWebClient.DownloadData(url); //从指定网页下载数据;

                        //把下载的内容保存在一个地方;
                        using (FileStream fs = new FileStream(@"C:\Users\dragonfive\Desktop\爬虫获得船仅仅图片\第三批\" + ship_id + "_" + i + ".jpg", FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            fs.Write(jpgdata, 0, jpgdata.Length);
                        }
                    }
                    catch (WebException webEx)
                    {
                        Console.WriteLine("被捕获了吗?");
                        Console.WriteLine(webEx.Message.ToString());

                    }

                    Console.WriteLine("成功下载第" + (i ++) + "张图片");

                    urlindex = pageHtml.IndexOf(org_label, urlindex + 1);
                }

                ///保存网页
                //using (StreamWriter sw = new StreamWriter("ouput.html"))//将获取的内容写入文本
                //{
                //    sw.Write(pageHtml);
                //}
                Console.WriteLine("*****************************************");
                Console.WriteLine("下载"+i+"张ship_id为"+ship_id+"的图片");
                Console.WriteLine("*****************************************");
                //Console.ReadLine(); //让控制台暂停,否则一闪而过了 

            }

            catch (WebException webEx)
            {

                Console.WriteLine(webEx.Message.ToString());

            }
        }
        static void Main(string[] args)
        {

            List<string> shipid_list = new List<string>();
            //shipid_list.Add("371681");//临时高速产生图片用这个;
            download_all_shipid(shipid_list);
            //string file = @"C:\Users\dragonfive\Desktop\爬虫获得船仅仅图片\第三批\0_100page_shipid.txt";
            //using (FileStream fsReader = new FileStream(file, FileMode.Open, FileAccess.Read))
            //{
            //    //以下进行反序列话;
            //    BinaryFormatter bf = new BinaryFormatter();
            //    shipid_list = (List<string>)bf.Deserialize(fsReader);
            //    Console.WriteLine("成功加载" + shipid_list.Count + "个shipid");
            //}
            ////371652 371668  371681 1252401
            //shipid_list.Remove("371652");
            //shipid_list.Remove("371668");
            //shipid_list.Remove("371681");
            //shipid_list.Remove("1252401");
            ////132264
            //shipid_list.Remove("371077");
            //shipid_list.Remove("132264");
            //shipid_list.Remove("224871");
            //shipid_list.Remove("279923");
            //shipid_list.Remove("369163");
            //shipid_list.Remove("266342");
            //shipid_list.Remove("371216");
            //shipid_list.Remove("368174");
            //shipid_list.Remove("369163");

            foreach (var ship_id in shipid_list)
            {
                download_jpg(ship_id);
            }

            Console.ReadLine(); //让控制台暂停,否则一闪而过了 

        }
    }
}

时间: 2024-11-18 09:05:50

用c#编写爬虫在marinetraffic下载船仅仅图片的相关文章

编写爬虫自动下载王者荣耀官网上好看的壁纸

前言 偶然间发现王者荣耀的官网上发布了这么多好看的壁纸. 地址:http://pvp.qq.com/web201605/wallpaper.shtml 看了一下,每一张都挺喜欢的,而且还有十多页,一张一张去慢慢下载肯定不是作为一个Geeker的正确姿势. 由于最近python用得比较多,所以看到什么好玩的就想爬虫下载下来,所以看到这么多好看图片,我又"熟练"地掏出了python. 分析 这个网站长这样. 首先对腾讯这个网站进行分析. 这个每一个小图对应的div <ul>标签

python爬虫实战——5分钟做个图片自动下载器

python爬虫实战--图片自动下载器 制作爬虫的基本步骤 顺便通过这个小例子,可以掌握一些有关制作爬虫的基本的步骤. 一般来说,制作一个爬虫需要分以下几个步骤: 分析需求(对,需求分析非常重要,不要告诉我你老师没教你) 分析网页源代码,配合F12(没有F12那么乱的网页源代码,你想看死我?) 编写正则表达式或者XPath表达式(就是前面说的那个神器) 正式编写python爬虫代码 效果 运行: 恩,让我输入关键词,让我想想,输入什么好呢?好像有点暴露爱好了. 回车 好像开始下载了!好赞!,我看

【图文详解】python爬虫实战——5分钟做个图片自动下载器

python爬虫实战--图片自动下载器 之前介绍了那么多基本知识[Python爬虫]入门知识,大家也估计手痒了.想要实际做个小东西来看看,毕竟: talk is cheap show me the code! 制作爬虫的基本步骤 顺便通过这个小例子,可以掌握一些有关制作爬虫的基本的步骤. 一般来说,制作一个爬虫需要分以下几个步骤: 1. 分析需求(对,需求分析非常重要,不要告诉我你老师没教你) 2. 分析网页源代码,配合F12(没有F12那么乱的网页源代码,你想看死我?) 3. 编写正则表达式或

震惊!编写“爬虫”,怎么“面向监狱编程”了?

2019年9月以来,不少因为非法使用“爬虫”技术,而使公司面临诉讼,程序猿被警察带走的新闻震惊了IT圈的小伙伴们! 我只是个写爬虫的,跟我有什么关系? 许多程序员都有这样的想法,技术是无罪的,我只是个打工的程序员,公司干违法的业务,跟我没关系...只能说,程序猿们真是图样图森破了. 看到那么多爬虫导致公司触犯法律的新闻,有人开玩笑说,编写爬虫程序,就是“面向监狱编程”. 看个案例: 抓取用户社交数据,尤其是用户隐私相关. (图片文字来自新浪网) 其实,“爬虫”只是一种技术,没有那么可怕如果使用技

编写爬虫程序的神器 - Groovy + Jsoup + Sublime(转)

写过很多个爬虫小程序了,之前几次主要用C# + Html Agility Pack来完成工作.由于.NET FCL只提供了"底层"的HttpWebRequest和"中层"的WebClient,故对HTTP操作还是需要编写很多代码的.加上编写C#需要使用Visual Studio这个很"重"的工具,开发效率长期以来处于一种低下的状态. 最近项目里面接触到了一种神奇的语言Groovy -- 一种全面兼容Java语言且提供了大量额外语法功能的动态语言.

编写爬虫程序的神器 - Groovy + Jsoup + Sublime

写过很多个爬虫小程序了,之前几次主要用C# + Html Agility Pack来完成工作.由于.NET BCL只提供了"底层"的HttpWebRequest和"中层"的WebClient,故对HTTP操作还是需要编写很多代码的.加上编写C#需要使用Visual Studio这个很"重"的工具,开发效率长期以来处于一种低下的状态.   最近项目里面接触到了一种神奇的语言Groovy -- 一种全面兼容Java语言且提供了大量额外语法功能的动态语

Python爬虫之足球小将动漫(图片)下载

??尽管俄罗斯世界杯的热度已经褪去,但这届世界杯还是给全世界人民留下了无数难忘的回忆,不知你的回忆里有没有日本队的身影?本次世界杯中,日本队的表现让人眼前一亮,很难想象,就是这样一只队伍,二十几年还是我们国家足球队的水平一样,也许还不如我们国足呢. ??足球小将(队长小翼.キャプテン翼)由日本著名动漫家高桥阳一于1981年开始连载,从此这部动漫就伴随着一代又一代的日本,甚至全世界的少年儿童成长,也在无形有形中促进了日本足球的进步.本届世界杯中,在日本与比利时的比赛中,日本球迷们高举队长小翼的画面

面试题:编写上传和下载文件测试用例

编写上传和下载文件测试用例 走火入魔系列之:上传|下载文件 一.题目: 如何编写上传和下载文件测试用例 1. 上传功能测试点 假如:我们要调试上传功能,前端代码为: <!DOCTYPE html> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <

python爬虫 之 抓取高清图片

这个网站http://www.hbc333.com/是一个壁纸图片网站,提供各种分辨率的图片的下载,因此想写一个爬虫脚本批量下载这些图片. 经观察,2560*1600分辨率的图片的网址格式为:http://www.hbc333.com/size/2560x1600/n/ (n是页数), 每张预览图片的地址是:/data/out/253/46659416-watch-dogs-wallpaper.jpg, 而原图的链接则为:http://www.hbc333.com/data/out/253/46