这个算是我第一次写的爬虫,所以写的比较简单,暂时只根据 用户ID 来进行抓数据
目标网站:图虫网
目的:抓取指定用户的摄影作品
举个栗子:
某用户作品页的链接是这样的
https://tuchong.com/1099189/ 其中后面的数字就是对应用户的标识了
F12后发现他是通过异步调用接口获取的作品数据,所以我们就不能用抓取HTML来进行爬数据了
然后调用的接口地址是这样的
https://tuchong.com/rest/2/sites/1099189/posts?count=30&page=1&before_timestamp=0
然后我们可以分析一下这个链接了,1099189肯定是用户标识了,count=30就是要返回的图片数量,page=1则是分页,before_timestamp=0这个不知道是做啥的,保留默认即可
然后发现图虫并没有验证Cookie和登陆信息,所以可以用最简单的方式来进行爬数据了
效果图:
下面是主要代码
//爬虫要调用的方法 public string Spider() { string UserId = Request["UserId"];////1136739 string url = "https://tuchong.com/rest/2/sites/"+ UserId + "/posts?count=30&page=1&before_timestamp=0"; string result = GetContent("get",url); WebHTMLModel webmodel = JsonToModel(result); List post_list = webmodel.post_list; List list = new List (); foreach (var item in post_list) { list.Add(item.images[0].source.l); } return ToJson(list); } //获取接口内容 public static string GetContent(string method, string url, CookieContainer cookie = null) { HttpWebResponse response = null; HttpWebRequest request = null; if (cookie == null) cookie = new CookieContainer(); try { // 设置参数 request = WebRequest.Create(url) as HttpWebRequest; request.CookieContainer = cookie; request.AllowAutoRedirect = true; request.Method = method.ToUpper(); request.ContentType = "application/json, text/javascript, */*; q=0.01"; string userAgent = string.Format("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36)"); request.UserAgent = userAgent; request.Referer = "https://tuchong.com/"; if (method.ToUpper() == "POST") { request.ContentLength = postData.Length; if (!string.IsNullOrEmpty(postData)) { byte[] data = Encoding.Default.GetBytes(postData); request.ContentLength = data.Length; using (Stream outstream = request.GetRequestStream()) { outstream.Write(data, 0, data.Length); } } } //发送请求并获取相应回应数据 response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才开始向目标网页发送Post请求 using (Stream instream = response.GetResponseStream()) { using (StreamReader sr = new StreamReader(instream, Encoding.Default)) { //返回结果网页(html)代码 string content = sr.ReadToEnd(); return content; } } } catch (Exception ex) { string err = ex.Message; return err; } }
获取到的JSON数据是这样的(实际上是多条,我这里只取其中一条数据),然后进行解析该JSON的结构,转为Model对象(JSON转C#实体类 http://www.bejson.com/convert/json2csharp/)
{ "post_id": "15148915", "author_id": "1099189", "type": "multi-photo", "url": "https://tuchong.com/1099189/15148915/", "published_at": "2017-08-13 20:03:14", "excerpt": "今年夏天,我着重探索了国内的年宝玉则跟博格达雪山,博格达雪山是自己目前为止见过的地貌最丰富的地方,野花,雪山,冰川,冰湖应有尽有,在7天的探索里我蹚过河流,爬过碎石山,钻过冰缝,更是翻越了10多公里长的冰川,收获也是很多,发现了很多不曾被人所拍过的角度。作为一个户外风光摄影者,我也希望能把国内那些很难到达的不为人知的美景带出来让更多的人看到........(小珠峰是博格达雪山旁相邻的一座雪山,因为外形酷似...", "favorites": 704, "comments": 73, "title": "花海中的小珠峰", "image_count": 1, "delete": false, "update": false, "images": [ { "img_id": 21460699, "user_id": 1099189, "title": "", "excerpt": "", "width": 7741, "height": 5618, "source": { "t": "https://photo.tuchong.com/1099189/t/21460699.jpg",//小的1:1预览图 "g": "https://photo.tuchong.com\/1099189/g/21460699.jpg",//大的1:1预览图 "s": "https://photo.tuchong.com\/1099189/s/21460699.jpg",//小的原比例预览图 "m": "https://photo.tuchong.com\/1099189/m/21460699.jpg",//中尺寸原比例预览图 "mr": "https://photo.tuchong.com\/1099189/mr/21460699.jpg",//中尺寸原比例预览图 比m的小一丢丢,比s的大一些 "l": "https://photo.tuchong.com\/1099189/l/21460699.jpg",//大的预览图 "lr": "https://photo.tuchong.com\/1099189/lr/21460699.jpg",//大的预览图 "ft640": "https://photo.tuchong.com/1099189/ft640/21460699.jpg"//大的预览图 } } ], "title_image": null, "tags": [ { "tag_id": 368, "type": "location", "tag_name": "新疆", "event_type": "", "vote": "" } ], "is_favorite": false, "site": { "site_id": "1099189", "type": "user", "name": "卡卡kaka", "domain": "", "description": "90后独立户外风光摄影师", "followers": 8495, "url": "https:\/\/tuchong.com\/1099189\/", "icon": "https:\/\/s1.tuchong.com\/sites\/109\/1099189\/logo_small.jpg?6", "verified": false, "verified_type": 0, "verified_reason": "", "verifications": 0, "verification_list": [ ] } }
返回的信息都不难理解,其中关键地方是在 images 对象中的 source 对象,里面包含了图片的多个尺寸,注释已经在代理里面,具体效果可自行预览
最后的数据我处理成了这样,其实也是做了简化,取出资源里面的大图,同时方便让页面去加载看效果
[ "https://photo.tuchong.com/1099189/l/21462003.jpg", "https://photo.tuchong.com/1099189/l/21461685.jpg", "https://photo.tuchong.com/1099189/l/21461477.jpg", "https://photo.tuchong.com/1099189/l/21461233.jpg", "https://photo.tuchong.com/1099189/l/21460853.jpg", "https://photo.tuchong.com/1099189/l/21460004.jpg", "https://photo.tuchong.com/1099189/l/21460699.jpg" ]
获取到了图片的资源链接,程序操作批量下载就不是问题了