とりあえず、快適におねーさまがたのポートレートを見れるようにしてみた。
元のURLはこんなかんじ。
http://ganref.jp/photo_searches/result/page:1/sort:created/direction:desc?keyword=&parent_category=%E4%BA%BA%E7%89%A9&category=%E5%A5%B3%E6%80%A7
書いたコードはこんなかんじ
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Xml.Linq;
using Nancy.Helpers;
using Sgml;
namespace Antoinette
{
public class GanrefModule : Nancy.NancyModule
{
public GanrefModule()
{
Get["/ganref/lady/"] = _ => "<script> window.location.href='./1'; </script>";
Get["/ganref/lady/{page}"] = _ =>
{
var url =
string.Format("http://ganref.jp/photo_searches/result/page:{0}/sort:created/direction:desc?keyword=&parent_category=%E4%BA%BA%E7%89%A9&category=%E5%A5%B3%E6%80%A7",
HttpUtility.UrlDecode(_.page)
);
XDocument xml;
using (var sgml = new SgmlReader() { Href = url, IgnoreDtd = true })
{
xml = XDocument.Load(sgml);
}
var ns = xml.Root.Name.Namespace;
var imgroot = xml.Descendants(ns + "div").Where(div => div.FirstAttribute.Value == "thumb140");
var imgUrls = imgroot.Select(xElement => xElement.Descendants(ns + "a").Descendants(ns + "img").Skip(2).First().FirstAttribute.Value).ToList();
return imgUrls.Aggregate("", (current, imgUrl) => current + ("<img src='" + imgUrl + "'/>"));
};
}
}
}
ちょっと解説。
Get["/ganref/lady/"] = _ => "<script> window.location.href='./1'; </script>";
なしでもよいのだけど、なしの場合は自動で1ページ目が入る。0をいれても1ページ目のデータが降ってくる。
なので、とりあえず/1に遷移してる。
こういうのはNancy側では書けないのかなぁ?
Get["/ganref/lady/{page}"] = _ =>
{
var url =
string.Format("http://ganref.jp/photo_searches/result/page:{0}/sort:created/direction:desc?keyword=&parent_category=%E4%BA%BA%E7%89%A9&category=%E5%A5%B3%E6%80%A7",
HttpUtility.UrlDecode(_.page)
);
XDocument xml;
using (var sgml = new SgmlReader() { Href = url, IgnoreDtd = true })
{
xml = XDocument.Load(sgml);
}
var ns = xml.Root.Name.Namespace;
var imgroot = xml.Descendants(ns + "div").Where(div => div.FirstAttribute.Value == "thumb140");
var imgUrls = imgroot.Select(xElement => xElement.Descendants(ns + "a").Descendants(ns + "img").Skip(2).First().FirstAttribute.Value).ToList();
return imgUrls.Aggregate("", (current, imgUrl) => current + ("<img src='" + imgUrl + "'/>"));
};
典型的なスクレイピング。
のいえさんのブログを参考にしました。
http://neue.cc/2010/03/02_244.html
短い気がするけど、けっこー試行錯誤した><
linqとxmlのところはもう少し綺麗に書ける気もするなぁ、、、
出来上がったものがこちら
http://antoinette.azurewebsites.net/ganref/lady/