Twitter ユーザーの誕生日を取得
Twitter では誕生日を設定できます。誕生日を設定すると、広告のターゲティングに活用されるとのこと。誕生日は「年」と「月日」ごとに公開範囲を設定でき、誕生日当日のユーザーのプロフィールページには、風船が飛ぶ機能があります。
誕生日の取得
さて、誕生日は Twitter API で取得できないため、スクレイピングするしかありません。誕生日を全体に公開しているユーザーであれば、サインインすることなく(Twitter の利用規約に従うことなく)誕生日を取得できます。
HTML
スクレイピングのため、Twitter の出力する HTML に大きく依存しますが、2015/10/19 時点では、次のような HTML です。
<div class="ProfileHeaderCard-birthdate "> | |
<span class="Icon Icon–balloon Icon–medium"></span> | |
<span class="ProfileHeaderCard-birthdateText u-dir" dir="ltr"><span class="js-tooltip" title="公開"> 誕生日 January 11 | |
</span> | |
</span> |
C# & HtmlAgilityPack でスクレイピング
C# とスクレイピングに便利かもしれない HtmlAgilityPack で取得してみます。HtmlAgilityPack は NuGet でインストールします。
スクリーンネームから誕生日部分のテキストを取得するメソッドはこんな感じ。@class=""ProfileHeaderCard-birthdateText u-dir""
のように class 属性の部分は完全一致しないと取得できないんですね。
static public async Task<string> GetBathDate(string screenName) | |
{ | |
// ユーザープロフィールページの HTML 取得 | |
string html; | |
using (var client = new WebClient() { Encoding = Encoding.UTF8 }) | |
{ | |
html = await client.DownloadStringTaskAsync("https://twitter.com/" + screenName); | |
} | |
// <span class="ProfileHeaderCard-birthdateText u-dir" dir="ltr"> 直下の <span> のテキスト値取得 | |
var doc = new HtmlAgilityPack.HtmlDocument(); | |
doc.LoadHtml(html); | |
var spans = doc.DocumentNode.SelectNodes(@"//span[@class=""ProfileHeaderCard-birthdateText u-dir""]/span"); | |
return spans?.First().InnerText; | |
} |
メソッドの呼び出しはこんな感じです。
static void Main(string[] args) | |
{ | |
var birthDate = GetBathDate("5zj").Result?.Trim(); | |
Console.WriteLine(birthDate); | |
// birthDate の例: | |
// "誕生日 1990年7月7日" | |
// "誕生日 July 07" | |
// "誕生日 1990" | |
// 英語の場合: | |
// "Born on July 7, 1990" | |
// "Born on July 07" | |
// DateTime 型に変換 | |
DateTime d; | |
if (DateTime.TryParse(birthDate.Replace("誕生日", "").Trim(), out d)) | |
{ | |
Console.WriteLine(d); | |
} | |
} |
以上です。