C#我自己做一个网站图片的抓取

sinat_25186077 2016-09-30 02:26:09
我自己做了一个网站图片的抓取, 感觉速度有点慢抓取4000张图片 可能得用15分钟左右的时间,
我百度看 用线程可以加快抓取,然后创建了5个线程抓取,但是 5个线程是同步执行 同样的操作 一个图片就抓取了5次,
代码应该怎么写 才能让线程 不抓取同样的内容呢
...全文
1116 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
greatbody 2016-10-09
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
若图片平均大小为 1M,那么 4000 / (15 * 60) = 4.44 M/s 也就是你这少需要 30M 线路带宽,已经很快了 如果开宽还有富裕,是可以考虑用多线程的 你可以设一个待抓取图片的队列,每个线程只从队首取出图片 url,这样就不会重复了 如果抓取失败,还应将相应 url 重新入队
版主说的非常对,大家都要这样做,代码就会很稳定了。
江南小鱼 2016-10-08
  • 打赏
  • 举报
回复
七天,不足以表达我对祖国母亲的热爱。经过这七天,我总是在深思,伟大的祖国母亲为什么不再过一个阴历生日呢? 开工了,从今天起我才知道未来七天其实不短。
我叫小菜菜 2016-10-08
  • 打赏
  • 举报
回复
引用 32 楼 sinat_25186077 的回复:
[quote=引用 30 楼 zhi_ai_yaya 的回复:] 我又回来了!!
怎么给代码你 ,没看到传文件的呀[/quote] 哟西,非常感谢~~ 把代码直接张贴上来就OK啦。 如果是demo,包含解决方案,引用库之类的,可以上传到CSDN下载,让大家可以下载,然后张贴下载链接到帖子后面。 讨论一个问题,最后得到一些解决办法,作为总结放到帖子最后,然后结贴。论坛本来就应该这样的
破碎的脸 2016-10-08
  • 打赏
  • 举报
回复
用MD5码,可能会好一些,MD5码可以识别文件的不同。
sinat_25186077 2016-10-08
  • 打赏
  • 举报
回复
http://down.51cto.com/data/2248694 最初版本的代码 传上去了 有需要的自己看看啊,csdn 上面的我传上去没显示 没得办法,换了个网站传了
sinat_25186077 2016-10-08
  • 打赏
  • 举报
回复
引用 33 楼 zhi_ai_yaya 的回复:
[quote=引用 32 楼 sinat_25186077 的回复:] [quote=引用 30 楼 zhi_ai_yaya 的回复:] 我又回来了!!
怎么给代码你 ,没看到传文件的呀[/quote] 哟西,非常感谢~~ 把代码直接张贴上来就OK啦。 如果是demo,包含解决方案,引用库之类的,可以上传到CSDN下载,让大家可以下载,然后张贴下载链接到帖子后面。 讨论一个问题,最后得到一些解决办法,作为总结放到帖子最后,然后结贴。论坛本来就应该这样的[/quote] - - 我电脑上只有最初版的,修改的不在我电脑上,不过我先传上去吧,你自己改改 哈哈
sinat_25186077 2016-10-07
  • 打赏
  • 举报
回复
引用 30 楼 zhi_ai_yaya 的回复:
我又回来了!!
怎么给代码你 ,没看到传文件的呀
泡泡龙 2016-10-06
  • 打赏
  • 举报
回复
如果网站请求等待时间长的话,异步的好处就体现出来了,在等待网站返回的时间,可以发1000个请求了,然后慢慢等着回来
我叫小菜菜 2016-10-06
  • 打赏
  • 举报
回复
我又回来了!!
sinat_25186077 2016-10-06
  • 打赏
  • 举报
回复
引用 28 楼 liucqa 的回复:
我觉得异步会快些吧
异步还没用 还没比较
泡泡龙 2016-10-06
  • 打赏
  • 举报
回复
我觉得异步会快些吧
sinat_25186077 2016-10-06
  • 打赏
  • 举报
回复
用了 并行加线程处理以后 速度快多了 O(∩_∩)O哈哈~
大然然 2016-10-01
  • 打赏
  • 举报
回复
5个线程访问同样一个方法,还没有参数,5次调用都在干同样的事情当然重复下载了,你弄点参数进去,让第一个线程干1---5 ,第二个现场6-10 。。。。。。
摇撼大地 2016-09-30
  • 打赏
  • 举报
回复
这个东西。我第一个想到的是Paralel。for。
sinat_25186077 2016-09-30
  • 打赏
  • 举报
回复
引用 22 楼 crystal_lz 的回复:
[quote=引用 20 楼 sinat_25186077 的回复:] [quote=引用 17 楼 crystal_lz 的回复:]

private Queue<string> m_que_url = new Queue<string>();

private void DownLoadCallBack() {
    string strUrl = string.Empty;
    WebClient web = new WebClient();
    while (true) {
        lock (m_que_url) {
            if (m_que_url.Count == 0) break;
            strUrl = m_que_url.Dequeue();
        }
        try {
            web.DownloadFile(strUrl, "yourfilename");
        } catch (Exception ex) {
            Console.WriteLine(ex.Message);
        }
    }
}

//set m_que_url
int nThreadCount  = 50;
for (int i = 0; i < nThreadCount; i++) {
    new Thread(DownLoadCallBack) { IsBackground = true }.Start();
}
兄台你好眼熟啊 -- [/quote] 是不是在你梦里出现过。。[/quote]可能是看别的帖子的时候 看到了你的发言了吧
crystal_lz 2016-09-30
  • 打赏
  • 举报
回复
引用 20 楼 sinat_25186077 的回复:
[quote=引用 17 楼 crystal_lz 的回复:]

private Queue<string> m_que_url = new Queue<string>();

private void DownLoadCallBack() {
    string strUrl = string.Empty;
    WebClient web = new WebClient();
    while (true) {
        lock (m_que_url) {
            if (m_que_url.Count == 0) break;
            strUrl = m_que_url.Dequeue();
        }
        try {
            web.DownloadFile(strUrl, "yourfilename");
        } catch (Exception ex) {
            Console.WriteLine(ex.Message);
        }
    }
}

//set m_que_url
int nThreadCount  = 50;
for (int i = 0; i < nThreadCount; i++) {
    new Thread(DownLoadCallBack) { IsBackground = true }.Start();
}
兄台你好眼熟啊 -- [/quote] 是不是在你梦里出现过。。
sinat_25186077 2016-09-30
  • 打赏
  • 举报
回复
引用 17 楼 crystal_lz 的回复:

private Queue<string> m_que_url = new Queue<string>();

private void DownLoadCallBack() {
    string strUrl = string.Empty;
    WebClient web = new WebClient();
    while (true) {
        lock (m_que_url) {
            if (m_que_url.Count == 0) break;
            strUrl = m_que_url.Dequeue();
        }
        try {
            web.DownloadFile(strUrl, "yourfilename");
        } catch (Exception ex) {
            Console.WriteLine(ex.Message);
        }
    }
}

//set m_que_url
int nThreadCount  = 50;
for (int i = 0; i < nThreadCount; i++) {
    new Thread(DownLoadCallBack) { IsBackground = true }.Start();
}
看起来 不错
sinat_25186077 2016-09-30
  • 打赏
  • 举报
回复
引用 17 楼 crystal_lz 的回复:

private Queue<string> m_que_url = new Queue<string>();

private void DownLoadCallBack() {
    string strUrl = string.Empty;
    WebClient web = new WebClient();
    while (true) {
        lock (m_que_url) {
            if (m_que_url.Count == 0) break;
            strUrl = m_que_url.Dequeue();
        }
        try {
            web.DownloadFile(strUrl, "yourfilename");
        } catch (Exception ex) {
            Console.WriteLine(ex.Message);
        }
    }
}

//set m_que_url
int nThreadCount  = 50;
for (int i = 0; i < nThreadCount; i++) {
    new Thread(DownLoadCallBack) { IsBackground = true }.Start();
}
兄台你好眼熟啊 --
sinat_25186077 2016-09-30
  • 打赏
  • 举报
回复
引用 18 楼 zhi_ai_yaya 的回复:
先mark,节后我回来收取代码刚好有上百万张图片url要抓,虽然大部分不怎样,但有小部分是很给力的图片方便的话贴段代码,感谢楼主
- - 要我的代码 干嘛
我叫小菜菜 2016-09-30
  • 打赏
  • 举报
回复
先mark,节后我回来收取代码刚好有上百万张图片url要抓,虽然大部分不怎样,但有小部分是很给力的图片方便的话贴段代码,感谢楼主
加载更多回复(17)

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧