読者です 読者をやめる 読者になる 読者になる

人生リアルタイムアタック

当面はPython学習帳

urllib.request.build_opener に User-agent を指定する

Pythonで要ログインのサービスをスクレイピングをする際にはbuild_openerを利用するが、User-agentも指定する必要があるケースがある。

通常のbuild_opener

# coding: utf-8
import http.cookiejar
import yaml
from bs4 import BeautifulSoup
from urllib import parse, request


def main():
    # yaml
    conf = yaml.load(open('conf.yaml').read())

    # login
    opener = request.build_opener(request.HTTPCookieProcessor(http.cookiejar.CookieJar()))
    post = {
        'username': conf['username'],
        'password': conf['password']
    }
    query = urllib.parse.urlencode(post).encode('utf-8')
    opener.open(conf['login_url'], query)

    # 以下スクレイピング処理など...
    soup = BeautifulSoup(opener.open(conf['scrap_url']).read().decode('utf-8'), 'html.parser')

もしUser-agentの指定が必要な場合には以下のようにするとよい。

# coding: utf-8
import http.cookiejar
import yaml
from bs4 import BeautifulSoup
from urllib import parse, request


def main():
    # yaml
    conf = yaml.load(open('conf.yaml').read())

    # login
    opener = request.build_opener(request.HTTPCookieProcessor(http.cookiejar.CookieJar()))
    opener.addheaders = [('User-agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36')]
    post = {
        'username': conf['username'],
        'password': conf['password']
    }
    query = urllib.parse.urlencode(post).encode('utf-8')
    opener.open(conf['login_url'], query)

    # 以下スクレイピング処理など...
    soup = BeautifulSoup(opener.open(conf['scrap_url']).read().decode('utf-8'), 'html.parser')

解説

urllib.request.build_opener()で作成したインスタンスOpenDirectorオブジェクト と呼ばれるものであり、urllib.request.urlopen()と引数、返り値が一緒である。*1 加えて、addheaders()でOpenDirectorインスタンスにヘッダーを指定できるので、こちらを利用してUser-agentを指定すればよい。

公式にも以下のURLに例が載っているので、こちらを参考にすると他の用途も掲載されている。 http://docs.python.jp/3.4/library/urllib.request.html#examples

*1:urlopen()はグローバルな OpenerDirector の open() メソッドを呼び出しているにすぎない。