4

APIを持たない特定のサービスを回避しようとして、Mechanizeを試してみることにしました(通常はurllibを使用します)。

open1回の呼び出しに特定のヘッダーを追加するにはどうすればよいですか?

または、独自のヘッダーを使用してRequestインスタンスを作成し、mechanize.Browserインスタンスに処理させる方法はありますか?

browser = mechanize.Browser()
headers = [
    ('Accept', 'text/javascript, text/html, application/xml, text/xml, */*'),
    ('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8'),
    ('User-Agent', 'Foobar'),
]

browser.addheaders = headers
# log in, do stuff, etc.

# here, for this one browser request, I need to add an AJAX header
browser.open('/a_url_to_ajax_post/', urllib.urlencode({'foo': 'bar'}))

私の回避策は、addheadersリストを一時的に変更することですが、それは醜いです!

browser.addheaders.append(AJAX_HEADER)
browser.open('/admin/discounts', urllib.urlencode(pulled_params))
browser.addheaders.pop()
4

2 に答える 2

7

このようにしてください:

import mechanize
import urllib2

browser = mechanize.Browser()

# setup your header, add anything you want
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1', 'Referer': 'http://whateveritis.com'}
url = "http://google.com"

# wrap the request. You can replace None with the needed data if it's a POST request
request = urllib2.Request(url, None, header)

# here you go
response = browser.open(request)

print response.geturl()
print response.read()
response.close()
于 2012-10-07T02:36:42.977 に答える
2

withPythonステートメントを利用できます。次のようなクラスを作成します。

class ExtraHeaders(object):
    def __init__(self, br, headers):
        self.extra_headers = headers
        self.br = br
    def __enter__(self):
        self.old_headers = self.br.addheaders
        self.br.addheaders = self.extra_headers + [h for h in self.br.addheaders if 
            not reduce(
                lambda accum, ex_h: accum or ex_h[0] == h[0],self.extra_headers,False)]
        return self.br
    def __exit__(self, type, value, traceback):
        self.br.addheaders = self.old_headers

次に、次のように使用します。

with ExtraHeaders(browser, [AJAX_HEADER]):
    browser.open('/admin/discounts', urllib.urlencode(pulled_params))
#requests beyond this point won't have AJAX_HEADER

マルチスレッドを使用している場合、別のスレッドがwithステートメント内にあるときにブラウザーにアクセスするスレッドには、追加のヘッダーも含まれることに注意してください。

于 2013-09-06T22:11:55.653 に答える