C#本人本人做一个网站图片的抓取 | Code Bye

C#本人本人做一个网站图片的抓取

.Net技术 码拜 3年前 (2017-04-27) 419次浏览
本人本人做了一个网站图片的抓取, 感觉速度有点慢抓取4000张图片 可能得用15分钟左右的时间,
本人百度看 用线程可以加快抓取,然后创建了5个线程抓取,但是 5个线程是同步执行 同样的操作 一个图片就抓取了5次,
代码应该怎么写 才能让线程 不抓取同样的内容呢
解决方案

5

页号(序数)应作为参数传入,而不是在  uploadimg 中循环产生
也就是 uploadimg 方法每次抓取一个页面中的图片

5

分批次。
多线程编程,关键在于分派任务。
可以使用一个队列存储url,每次线程从队列中获取一批url(加锁,或使用线程安全的队列)。

5

给你个控制台演示代码你体会一下

        static void Main(string[] args)
        {
            var tasks = Enumerable.Range(0, 50);
            var q = from x in tasks.AsParallel().WithDegreeOfParallelism(5)
                    select DoIt(x);
            Console.WriteLine("总共用了{0}个线程执行了{1}个任务!\n", q.Distinct().Count(), tasks.Count());
        }
        static int DoIt(int n)
        {
            var tid = Thread.CurrentThread.ManagedThreadId;
            Console.WriteLine("{0} : {1}", tid, n);
            return tid;
        }

5

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();
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#本人本人做一个网站图片的抓取
喜欢 (0)
[1034331897@qq.com]
分享 (0)