芋の独り言

当ブログへのアクセスは当ブログのプライバシーポリシーに同意したものとみなします.

【Python3】requestsとmechanizeの対応表

aiohttpで並列クローリングは,並列処理について基礎からPythonでのやり方に関して知っていないと使いこなせません. 現に私は理解できず使うのを今は断念...

まぁ,同時に複数アクセスなら並列でなくともできます. 簡単なことです. コマンドプロンプトもしくはIDLEを複数起動し,クローリングモジュールを使ったスクリプトを各々で実行すればいいだけです. しかし,クローリングモジュールで定番のrequestsでソレをやると, エラーが出ます.同時アクセスは出来ません. ここでmechanizeなのですが,このモジュールではそういったエラーは発生しませんでした. たまたまかもしれませんが... 今までrequestsで書いていたものをmechanizeで書き直したほうがイイかな~と思い, その際に役立つメモとして, 何が対応・書き換えられるのかを以下に書いていこうと思います. 完全一致ではないですがね~

 
import requests
import mechanize
セッションの開始

session = requests.session()

br = mechanize.Browser()
ニコニコ動画などへのログイン

session.post(
    'login_url', 
    data={
        'mail_tel':'mail',
        'password':'password'
    })

br.open('login_url', timeout=10)
br["mail_tel"] = 'mail'
br["password"] = 'password'
br.submit()
セッション後,別ページへクローリングし,
スクレイピングモジュールBeautifulSoupに渡すもの

session.get('url', timeout=(3.0, 7.5)).text # もしくはsession.get('url', timeout=(3.0, 7.5)).content

br.open('url', timeout=10)
br.response().read()
URLへポストする

headers = {'content-type': 'application/json'}
res=session.post(
    'url',
    data=post_data, # Pythonの辞書型データ
    headers=headers
    )   

br.open(mechanize.Request(
    'url'+"?_format=json",
    data=post_data # Pythonの辞書型データ
    ), timeout=10)
エラー処理

try:
    res = session.get('url', timeout=(3.0, 7.5)).content
except requests.exceptions.SSLError:
    pass
except requests.exceptions.ConnectionError:
    pass
except requests.exceptions.Timeout:
    pass

import sys,socket
if sys.version_info.major < 3:
    from urllib2 import HTTPError, URLError
else:
    from urllib.error import HTTPError, URLError

try:
    br.open("url", timeout=10)
    res = br.response().read()
    pass
except (URLError,HTTPError,socket.timeout):
    pass

得たHTMLテキストデータ(infoという変数に入れたとする)は


from bs4 import BeautifulSoup as bs
soup = bs(info,'html.parser')

というようにしてBeautifulSoupに渡します.

また,多くのWebサイトでは”robot.txt”というクローリングの規約みたいなものがあり, mechanizeはそれがあった際にデフォルトではアクセスせずにエラーError 403: b'request disallowed by robots.txt'を発生させます. 基本的にこれに従ったほうが良いのですが, どうしてもクローリングしたいというときはbr = mechanize.Browser()の直後に


br.set_handle_robots(False)
br.addheaders = [('User-Agent', 'jp'), ('Accept', '*/*')]

を実行します. 以上によって”robot.txt”を無視するようになり(requestsだと最初から無視状態),アクセスが可能になります. 私的利用で公開は絶対しないという場合以外はしないのが賢明です.

あと,クローリングする際は


from time import sleep

# クローリング処理
sleep(1)

といったように一アクセスするごとに最低数秒は間を開けるようにしておいたほうがイイですね.

参考

など