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スクレイピング

SwiftでJSONデータを使いやすくする!Codableの使い方Prev

BeautifulSoup4でid, classを持つDOMを取得して効率化しよう!Next

Related post

  1. テクノロジー

    CSSによるセンタリングの方法と注意点についてのまとめ

    HTMLとかCSSの勉強を始めると、divやsectionなどで作った…

  2. swiftui

    iOSアプリ開発

    初心者でもiOSアプリ開発ができるSwiftUIを触ってみよう

    「アプリ開発って難しそう」「アプリを作ってみたいけど作り方がわからない…

  3. hstack-vstack

    iOSアプリ開発

    SwiftUIでレイアウトを簡単にするHStackとVStackの使い方

    初めてSwiftUIを使ってアプリ開発するとき、まだ慣れていなくてレイ…

  4. テクノロジー

    ReactiveXとは?RxJSの入門と導入手順

    Rx (Reactive Extension)とはここ数年で話題になっ…

  5. iOSアプリ開発

    iOSアプリ初心者が覚えておきたい10のUIクラス

    iOSアプリを開発したいけど、最初は何を知っていたら開発できるのかわか…

  6. iOSアプリ開発

    xcconfigを使って本番とテスト環境を切り替える方法

    iOSアプリを開発していると、本番の環境とテストする環境を切り替えて開…

PAGE TOP