スクレイピングでヘッダー情報を付与する方法とその目的

今回は、前回試したスクリプトにヘッダー情報を加えたリクエストを投げれる様にしていきます。さらに、ヘッダーを利用する目的や何をセットするのかというところにも触れていきます。

前回記事

Pythonスクレイピングの導入と利用の注意ポイント

目次

  • Pythonでリクエストにヘッダーを付与する
  • ヘッダーを設定する目的
  • ヘッダーの種類
  • まとめ

Pythonでリクエストにヘッダーを付与する

前回、利用したスクリプトは以下のものでした。

from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.error import URLError, HTTPError

try:
    html = urlopen("https://weather.yahoo.co.jp/weather")
    bsObj = BeautifulSoup(html, "html.parser")
    
    print("\[h1\] " + bsObj.h1.text)
    print("\[h2\] " + bsObj.h2.text)
    # print(bsObj.html)
except HTTPError as e:
    print (e)
except URLError as e:
    print ("The server could not found.")
else:
    print ("It worked.")

実行した結果は、以下の様なものです

$ python3 scraping.py
\[h1\] 全国の天気
\[h2\] 全国概況
It worked.
しかし、urlopenを使った時のデフォルトのヘッダーは以下の様なものになっています。
Accept-Encoding: identity
User-Agent: Python-utillib/3.6

これでは少々不自然ですね。今回は、このヘッダー部分を設定するスクリプトを作成していきます。

1. requestsモジュールをインストールする

前回、ある特定のページデータを取ってくるのにurlopenという関数を使いました。今回は、リクエストにヘッダーを付与したいのでurlopenではなくrequestsモジュールを利用していきます。
pip3を使ってインストールします。
$ python3
Python 3.6.0 (default, Oct  8 2018, 21:45:07)
\[GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.11.45.2)\] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from requests
  File "<stdin>", line 1
    from requests
                ^
SyntaxError: invalid syntax
>>> exit()

$ pip3 install requests

無事、インストールできたか確認します。エラーが発生しなければインストール成功です。

$ python3
Python 3.6.0 (default, Oct  8 2018, 21:45:07)
\[GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.11.45.2)\] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from requests
>>> exit()

2. ヘッダーを付与する

先ほどインストールしたrequestsモジュールを読み込んでヘッダーをセットします。ヘッダーデータはChrome Inspectorのネットワークタブなどから確認できます。
from bs4 import BeautifulSoup
import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10\_13\_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,\*/\*;q=0.8",
}
url = "https://weather.yahoo.co.jp/weather"

/\* make session and request \*/
session = requests.Session()
req = session.get(url, headers=headers)
bsObj = BeautifulSoup(req.text, "html.parser")

/\* get h1 and h2 dom texts \*/
print("\[h1\] " + bsObj.h1.text)
print("\[h2\] " + bsObj.h2.text)
# print(bsObj.html)

print ("It worked.")

上記のスクリプトを実行してみます。

$ python3 scraping.script
\[h1\] 全国の天気
\[h2\] 全国概況
It worked.

すると、前回同様の結果を取得できると思います。これで、ヘッダーを付与したリクエストでページデータ取得ができました。

ヘッダーを設定する目的

ヘッダーを設定する目的は、「端末やリージョンごとの異なる結果を取得する」「人間らしい振る舞いをする」などが挙げられます。

リクエストを受け取るサーバー側は、不自然なヘッダーのリクエストがきたら怪しいリクエストだと認識して必要に応じてブロックするなどの処理をします。悪意のあるリクエストがきた時、それを全てを処理していたらサーバーを攻撃されてしまう恐れがあるためです。

ヘッダーの種類

基本的なヘッダーとして以下の様なものが挙げられます。これらは、どのブラウザでも基本的に設定されている値です。

`Headers: Host, Connection, Accept, User-Agent, Referrer, Accept-Encoding, Accept-Language`  

まとめ

今回は、スクレイピングスクリプトにヘッダーを付与する方法を紹介しました。スクレイピングで悪意のあるリクエストを送ることはダメですが、スクレイピングする上でヘッダーを設定することは重要です。正しい容量・用法を守った上で利用してみてください。

今回は、こちらの本を参考にしています。
PythonによるWebスクレイピング