Python Mechanize-如何在单个.open()调用中添加头?
我试图绕过没有API的特定服务,并决定尝试Mechanize(我通常使用urllib) 如何为一个Python Mechanize-如何在单个.open()调用中添加头?,python,mechanize,Python,Mechanize,我试图绕过没有API的特定服务,并决定尝试Mechanize(我通常使用urllib) 如何为一个open调用添加特定的标题 或者有没有一种方法可以用自己的头构造一个请求实例,然后让我的mechanize.Browserinstance处理它 browser = mechanize.Browser() headers = [ ('Accept', 'text/javascript, text/html, application/xml, text/xml, */*'), ('Co
open
调用添加特定的标题
或者有没有一种方法可以用自己的头构造一个请求实例,然后让我的mechanize.Browser
instance处理它
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()
这样做:
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()
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
您可以使用python
with
语句。制作一个这样的类:
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()
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语句中时,访问浏览器的任何线程也将具有额外的头