最近在研究利用网站的API 自动保存网站图片的搜索结果,实验了百度,搜狗,bing 都比较的顺利,都能很好的完成我的想法。
其实一直挺喜欢豆瓣的,最近发现豆瓣也有类似图片搜索的功能,而且里面的图片都是人工标记好的,质量比较高,所以想做一个想软件,功能是输入一个关键字,就自动下载这个关键字对应的图片。
查找API 一切都很顺利,当我在和豆瓣的服务器端通信的时候,在浏览器里面能够很好的显示的结果,突然变成了error 403 ;
我的调用代码是这样的
WebClient wc = new WebClient();
string tempSearchString_coding = HttpUtility.UrlEncode(keywords);
string DouBanAPI = "http://www.douban.com/j/search_photo?q=" + tempSearchString_coding + "&limit=20&start=" + string.Format("{0}", 0);
byte[] aryByte = wc.DownloadData(DouBanAPI);
期望出现的结果是:
{"images":[{"src":"http:\/\/img5.douban.com\/view\/photo\/photo\/public\/p2165894096.jpg","author":"荷田田","url":"http:\/\/www.douban.com\/link2\/?url=http%3A%2F%2Fwww.douban.com%2Fphotos%2Fphoto%2F2165894096%2F&query=%E6%9D%8E%E5%86%B0%E5%86%B0&cat_id=1025&type=search","id":"2165894096","title":"李冰冰","width":449,"height":600},{"src":"http:\/\/img3.douban.com\/view\/photo\/photo\/public\/p2165894100.jpg","author":"荷田田","url":"http:\/\/www.douban.com\/link2\/?url=http%3A%2F%2Fwww.douban.com%2Fphotos%2Fphoto%2F2165894100%2F&query=%E6%9D%8E%E5%86%B0%E5%86%B0&cat_id=1025&type=search","id":"2165894100","title":"李冰冰","width":476,"height":600},{"src":"http:\/\/img3.douban.com\/view\/photo\/thumb\/public\/p2165894103.jpg","author":"荷田田","url":"http:\/\/www.douban.com\/link2\/?url=http%3A%2F%2Fwww.douban.com%2Fphotos%2Fphoto%2F2165894103%2F&query=%E6%9D%8E%E5%86%B0%E5%86%B0&cat_id=1025&type=search","id":"2165894103","title":"李冰冰","width":170,"height":114},{"src":"http:\/\/img5.douban.com\/view\/photo\/photo\/public\/p2165894106.jpg","author":"荷田田","url":"http:\/\/www.douban.com\/link2\/?url=http%3A%2F%2Fwww.douban.com%2Fphotos%2Fphoto%2F2165894106%2F&query=%E6%9D%8E%E5%86%B0%E5%86%B0&cat_id=1025&type=search","id":"2165894106","title":"李冰冰","width":478,"height":600},但是一个无情403错误打击了我。但是一切的操作在浏览器端还是好好的。
通过查阅资料,我明白了403 错误指的是,没有权限的错误,不是我代码的的问题。要怎么样获得权限呢,网上有很多种说法,什么设置cookie啊什么的,我都不懂。
我就用了一个最笨的办法解决了这个问题,通过设置WebClient 的CredentialCache解决了这个问题。
首先新建一个 CredentialCache;
CredentialCache myCache = new CredentialCache();
然后加入豆瓣的账号密码:
myCache.Add(new Uri("http://www.douban.com/"), "Basic", new NetworkCredential(UserName, SecurelyStoredPassword));
wc.Credentials = myCache; // 添加授权证书
设置使用 chrome 调用
wc.Headers.Add("User-Agent", "chrome ");
经过这一番设置之后,就没有了403 错误,都可以正常的调用了。
今天又get 了一项新技能真开心!!