今回は、前回試したスクリプトにヘッダー情報を加えたリクエストを投げれる様にしていきます。さらに、ヘッダーを利用する目的や何をセットするのかというところにも触れていきます。
前回記事
目次
- 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スクレイピング