ユーザー投稿型サイトのSEO対策

公開:2020/10/13
更新:2020/10/13
8 min読了の目安(約7600字IDEAアイデア記事

Zennという技術情報共有サービスを運営しています。長期的にZennの流入経路の多くは「検索」になると予想しています。むしろ検索流入が多いサービスであるべきだと考えています。

具体的なソースコードや数式が並ぶ文章は、ソーシャルメディアではあまりシェアされません。ある程度抽象的な内容でないと、読者層が狭く、読み手も労力を必要とするからです。
(具体的な話を盛り込みつつ話題を集める文章を書けるスーパーな方もときどきいますが)

しかし、いざ仕事で問題に直面したとき、自分を助けてくれるのは、たいてい具体的なコードを含む記事や実際に問題に直面した人によるニッチな体験談です。すぐに誰かに届くものではないけれど、後から同じ道を通った人は助かる… そんな先人の知恵がたくさん集まる場所になったらいいなと考えています。

SEOに関する情報収集源

本題に入る前に、僕が参考にしているSEO対策の情報源を紹介しておきます。SEO論みたいなものはググるといくらでもヒットしますが、今ではまったく効果のないテクニックを紹介している記事もあるので注意が必要です(例:metaキーワードは検索順位を上げる効果がある!)。

個人的に以下の2つはとても参考になると考えています。

  1. 検索エンジン最適化(SEO)スターターガイド: Google公式によるガイドです。SEO対策するうえで最低限知っておきたい用語や知識をざっくりと抑えられます。
  2. 海外SEO情報ブログ: 主にGoogleの中の人の発言や、公式の発表をもとにSEOについて考察しているブログです。10年以上継続して運営されているだけあり、考察がとても参考になります。

世界で最も大きいSEO会社Mozのブログも独自の調査を行っていたりして、面白かったりします。ただ、基本的には上の2つだけ目を通せば十分な知識が手に入ると思います。

ちなみにGoogle共同創業者により書かれた論文(1998年)を読むと、Googleの初期のアルゴリズムに触れられて楽しいです。

UGCのSEO対策

ユーザー投稿型(UGC = User Generated Contents)のサービスを作るのは初めてなので、SEO対策には試行錯誤しています。ここからZennで実践していることを書いていきますが、どれも試行錯誤の途中段階です。後になって分かることがあれば追記・修正します。

0. 前提

大前提として、検索上位に表示されるために最も重要なポイントはコンテンツの質です。Googleは2019年に自然言語処理のモデルBERTを採用したと公表しましたが、今後よりコンテンツ自体が検索順位に与える影響は大きくなっていくのだと思います。

ユーザー投稿型サイトの場合、コンテンツの中身をコントロールするのは非常に困難です。サービス運営者ができる積極的なSEO対策というのはあまり無く、どちらかといえば減点を防ぐような対策が中心になります。

1. リンクの悪用を防ぐ

ユーザー投稿型サイトでは、ユーザーが投稿できるリンクにはすべてrel="nofollow"属性を指定するべきです。

<a href="~" rel="nofollow">アンカーテキスト</a>

この属性を指定することで、検索エンジンに対してリンク先を辿らないように指示することができます。SEO業者(や個人)は検索上位表示したいサイトに対して、SEO効果のあるリンクを貼れる場所を常に探しています。rel="nofollow"なしのリンクをいくらでも貼れるサイトがあるとなれば、多くのSEO目的の人が飛びつくでしょう。

もちろん良質かつ関連性の高いページであれば問題ないのですが、密かに詐欺的なページやアダルトサイトなどにリンクされる可能性があります。その場合にrel="nofollow"が指定されていないと、Googleがリンク元まで同類のサイトだと判断してしまうリスクがあります。

ただし、検索エンジンがサイト内の関連するページを辿ってクロールできるように、内部リンクを貼ることは重要だと考えています。そのため、Zennではhttps://zenn.dev/から始まるリンクの場合にはrel="nofollow"がつかないようになっています。

2. 低品質なページをインデックスさせない

ユーザー投稿型のサイトでは、ページ数がどんどん増えていきます。特に公開直後は検索エンジンからの評価が低く、積極的にサイト内をクロールしてはくれません。

※ Googleの場合、クローラー(=Googlebot)がサイト内のページを1つ1つをクロール(巡回)して、インデックス(ページの情報を登録)をします。

Googlebotは信頼できるサイトに対しては、1日に何万〜何十万ページとクロールをしますが、信頼できるか分からないサイトではそこまでのコストをかけません。ZennはGoogleにとってまだ「信頼性できるかどうか分からないサイト」です。そのため、Googleが割いてくれる限られたクロールのバジェットを有効的に使ってもらう必要があります。

そのため、低品質なページには「インデックスしなくていいよ」という指示になるメタタグをつけます。

<meta name="robots" content="noindex" /> 

このメタタグが配置されたページは、検索エンジンのインデックスから外れることになります。

では、具体的に低品質なページとはどのようなものでしょうか。Zennでは「ググったときにヒットされてもノイズになるもの = クリックしてみたらガッカリしてすぐに引き返すページ」という基準で判断しました。例えば、以下のようなページです。

  • まだ投稿が1つもないユーザーページ
  • まだ投稿が1つもないトピック(タグ)ページ
  • ログインユーザー向けのページ(ダッシュボードやアカウント設定など)

この基準は、今後様子を見ながら調整していこうと考えています。

3. 重複してインデックスさせない

内容が同じページを検索エンジンに複数インデックスさせないことも重要です。たとえば、誰かがZennのあるページに対して/example?foo=barというクエリ付きでリンクを貼ったとします。リンク先をクローラーが辿ったとき、/example/example?foo=barが別のページだとみなされてしまう可能性があります。

Googleではある程度は考慮してくれるようですが、ほぼ同内容のページが別々にインデックスされてしまうことは最近でも確認しています

また、ページネーションが存在するページがすべてインデックスされてしまっても困ります。(ページ1〜nまで検索結果に並べばノイズになります。「ページ3から見たい」という検索ユーザーはほとんどいないはずです)

Zennでは、基本的にインデックスしてもらいたいページほぼ全てにcanonical URLを指定しています。

<link rel="canonical" href="URL" />

これにより、複数のURLが存在するページでも、評価を1つのURLにまとめることができます。特に忘れてはいけないのは検索結果ページです。/search?keyword=example/search?keyword=exampl/search?keyword=examなどなど、キーワードの数だけ無限にページができてしまいます。
このようなページはインデックス対象外にするか、canonicalURLを/searchに指定するような対策が必要になります。

4. titleタグを最適化する

これは説明不要のポイントだと思います。titleタグは検索結果のタイトルに直接影響するうえ、ブラウザのタブやブックマークのタイトル等にも表示されるため、ユーザー体験の観点からも重要です。たとえ検索エンジンにインデックスされる必要のないページであっても常に表示しておくべきです。

titleの文字数が一定以上になると切り取られてしまい、ユーザーが内容を把握するのに苦労する可能性があるため、執筆者の方には申し訳ないのですが、タイトルの文字数制限を厳し目に設定しています。執筆者の意図していない部分で切り取られるよりは、制限を設けて執筆者の方になんとか収めてもらった方が良いだろうという判断です。

ただし、現時点では英数字も日本語も同じ1文字として扱っているため、調整が必要だと考えています。たとえば「RangeError: Maximum call stack size exceededエラーが発生したときの対処法」みたいなタイトルだとすぐに文字数が足らなくなってしまいます

また、titleタグが長くなりすぎないように、投稿ページのtitleから最近「Zenn」という文字列を除きました(<title>タイトル|Zenn</title> 👉 <title>タイトル</title>)。それでもGoogleが気を利かせて検索結果に自動で「Zenn」をつけることがあるようですが。

5. SSRする

Zennでは検索エンジンにインデックスしてもらいたいページでSSR(サーバーサイドレンダリング)を行っています。2019年〜Googlebotによるレンダリングは最新のChromiumで行われるようになったため、SEO対策という観点ではSPAでも大きな問題はありません。

ただし、SSRの方が良い部分も未だに残っています。

SPAはインデックスが遅い

SSRだと検索エンジンにすぐにインデックスされますが、SPAだとレンダリングキューに入った後Googlebotのリソースが空くまで完全な状態でインデックスされません。

📄 GooglebotがJavaScriptを処理する仕組み→

無視しても構わない程度の話かもしれませんが、Google Discoverなどに載りづらくなる等のデメリットは考えられます。

SPAはどのようにレンダリングされるかを把握しづらい

SPAだと、どの時点のページ情報がGoogleに「そのページの内容」だと判断されるのかが明確ではありません。たとえば「読み込み中…」という表示が長ければ、そのページの内容は「読み込み中」だと判断される可能性があります。

Googleの公式ドキュメントには以下のように書かれています(公式の日本語の文章が分かりづらかったのでざっくりと意訳しました)。

Crawlers may understand JavaScript, but there are often limitations worth being aware of in how they render. Client-side rendering can work but often not without additional testing and leg-work.
意訳)クローラーはJavaScriptを理解できるが、どのようにレンダリングされるか注意した方が良いという制約がある。クライアントサイド・レンダリングは機能するが、追加のテストや地道な調査が必要

SPAの場合、実際にGooglebotにどのようにレンダリングされるのかをモバイルフレンドリーテストやSearch ConsoleのURL検査を使って確かめることになります。

一方SSRであれば、ソースコードを読み込んで「よしよしちゃんと表示されているな」と確認するだけで済みます。

6. サイトマップを用意する

クローラーはリンクを辿って、サイト内を巡回してくれますが、奥の奥にあるようなページにはたどり着けない可能性があります。そこで、XMLサイトマップを用意してSearch Consoleに登録することで、Googleにページの存在を伝えるようにします。

Zennでは今のところXMLサイトマップに

  • トップページ
  • 投稿ページ
  • トピックページ

などを含めています。ユーザーページは今後追加する予定です。

7. 被リンクを集める

SEO対策で現在でも明らかに効果があるのは被リンクです。外部のサイトから、zenn.devへのリンクを貼ってもらえばもらえるほど、zenn.devの評価は高まります(ただしrel="nofollow"属性がついていない場合に限ります。Qiitaからのリンクは効果がない…!)。

基本的にはサービスをちゃんと運営して、自然と被リンクが増えていくのを待つというのが大方針になります。ただ、以下のような施策が効果を発揮することもあると思います。

  • リンクしてもらいやすいようにメディアキットページを用意する(Zennのメディアキット
  • リリース時にPR TIMESなどでプレスリリースを打ってWebメディアからの被リンクを狙う

Zennではプレスリリースを打っていないため、今のところメディア等からの被リンクがほとんどありません。組織で運営しているのであれば露出を高める施策を行っても良いと思うのですが、現時点ではひとりで開発しているため、基本的にはサービス自体の質の向上に全リソースを割く方針です。

その他検討しているSEO対策

現在は対応していませんが、以下のようなSEO対策も検討しています。

メタデスクリプションを指定する

Zennでは今のところ記事詳細ページにメタデスクリプション(<meta name="description" content="ページの説明">)を指定していません。メタデスクリプションは検索結果のページの説明に採用されたり、されなかったりするものです。

メタデスクリプションは検索順位には直接的な影響はないとされていますが(参考)、検索結果に表示されたときにクリック率が異なってくるため重要です。

問題は、ユーザー投稿型サイトで「投稿の要約」を入力してもらうのはハードルが高いという点です。具体的には、投稿の敷居が高くなったり、こちらの意図していない要約を書かれてしまう可能性があります。

MediumやQiitaでは本文の冒頭をメタデスクリプションにあてているようですが、Zennでは「本文の冒頭=記事の要約」であることは少ないのではないかと考え、メタデスクリプション自体を設定しないことにしています。

ただ、記事数もある程度増えてきたので落ち着いたタイミングで「本文の冒頭をメタデスクリプションにあてる」方式も一度試してみようかとも思っていたりします。理想的には、無敵のディープラーニングで要約を自動生成できると良いんですけどね。

パンくずリストを設置する

パンくずリストはサイト内の構成や、ページ同士の関連性を検索エンジンに伝えるために重要です。たとえば「ホーム > Flutter > 投稿ページ」というパンくずリストを設置すれば、投稿ページがFlutterに関わる内容であることが明確になります。

問題は、1つの投稿に対してトピック(タグ)が複数つけられるのに対して、パンくずは1つしかGoogleに採用されないという点です。

📄 複数のパンくずリストを1つのページに設置することはSEOにおいて問題ないか?

これに対応するアイデアとして

  • ひとつめに指定されたタグをぱんくずリストに採用する(おそらくQiitaはコレ)
  • タグの他にカテゴリーとなるようなもうちょっと大きなグループ分けを行う(ユーザーの手間を増やさないように自動で行うべき)

などが考えられますが、いずれにしても対応はしばらく先になりそうです。


長々と書いてきましたが、見落としている施策があるかもしれません。何か知見のある方がいれば、このページのDiscussionsで教えていただければ嬉しいです!

👇 以前書いていただいたこちらの記事もとても参考になります。
ZennのSEOについて考察してみた