Le meilleur guide que j'ai vu pour ce type de questions est le "SOLID Principles of OO Design".
http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
Le plus fondamental de ces principes, et celui qui répond en quelque sorte à votre première question, est le "principe de la responsabilité unique". Ce principe stipule qu'"une classe doit avoir une, et une seule, raison de changer". En d'autres termes, vos classes doivent chacune faire exactement une chose. Si vous avez besoin de changer la façon dont cette chose fonctionne, vous n'avez qu'une seule classe à changer et, avec un peu de chance, un seul endroit pour faire le changement dans cette classe. Dans votre cas, vous voudrez probablement une classe pour récupérer le contenu de l'URL, une autre pour l'analyser dans une sorte de structure de données en mémoire, une autre pour traiter les données (si nécessaire), et une autre (ou d'autres) pour afficher le contenu dans le format que vous souhaitez. Évidemment, vous pouvez vous laisser emporter par les classes, mais il est généralement plus facile de tester un grand nombre de petites classes à opération unique, plutôt qu'une ou deux grandes classes englobantes.
La question sur public vs. protected dépend de la façon dont vous prévoyez d'utiliser ce code. Si votre classe peut être utilisée indépendamment en dehors de votre bibliothèque, vous pouvez envisager de la rendre publique, mais si elle accomplit une tâche spécifique ou liée à vos autres classes, elle peut probablement être protégée. Par exemple, une classe permettant de récupérer du contenu à partir d'une URL est une bonne classe à usage général, vous pouvez donc la rendre publique, mais une classe qui effectue un type spécifique de manipulation de données peut ne pas être utile en dehors de votre bibliothèque, elle peut donc être protégée. Dans l'ensemble, ce n'est pas toujours noir ou blanc, mais en fin de compte, ce n'est généralement pas un gros problème dans les deux cas.