Cómo usar correctamente mecanizar para raspar sitios AJAX

Así que soy bastante nuevo en el web scraping. Existe este sitio que tiene una tabla, los valores de la tabla están controlados por Javascript. Los valores determinarán la dirección de los valores futuros que mi navegador debe solicitar al Javascript. Estas nuevas páginas tienen respuestas JSON con las que el script actualiza la tabla en mi navegador.

Así que quería construir una clase con un método de mecanizado que tome una url y escupe la respuesta del cuerpo, la primera vez que un HTML, luego, la respuesta del cuerpo será JSON, para las iteraciones restantes.

Tengo algo que funciona, pero quiero saber si lo estoy haciendo bien o si hay una mejor manera.

class urlMaintain2:    
    def __init__(self):

        self.first_append = 0
        self.response = ''

    def pageResponse(self,url):
        import mechanize
        import cookielib        

        br = mechanize.Browser()

        #Cookie Jar
        cj = cookielib.LWPCookieJar()
        br.set_cookiejar(cj)

        #Browser options
        br.set_handle_equiv(True)
        br.set_handle_gzip(False)
        br.set_handle_redirect(True)
        br.set_handle_referer(True)
        br.set_handle_robots(False)

        br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)

        br.addheaders = [('User-agent','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16'),
                              ('Accept-Encoding','gzip')]
        if self.first_append == 1:
            br.addheaders.append(['Accept', ' application/json, text/javascript, */*'])
            br.addheaders.append(['Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'])
            br.addheaders.append(['X-Requested-With', 'XMLHttpRequest'])
            br.addheaders.append(['User-agent','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16'])
            br.addheaders.append(['If-Modified-Since', 'Thu, 1 Jan 1970 00:00:00 GMT'])
            cj.add_cookie_header(br)   

        response = br.open(url)
        headers = response.info()

        if headers['Content-Encoding']=='gzip':
            import gzip
            gz = gzip.GzipFile(fileobj=response, mode='rb')
            html = gz.read()
            gz.close()
            headers["Content-type"] = "text/html; charset=utf-8"
            response.set_data(html)
        br.close()
        return response

self.first_append se vuelve positivo después de que los datos se hayan extraído de la página principal html, por lo que br.addheaders.append no se ejecuta la primera vez, ya que no hay JSON en la respuesta del cuerpo, pero todas las otras respuestas del cuerpo son JSON ¿Es esta la forma correcta de hacer esto? ¿Hay alguna forma más eficiente?

self.first_append se vuelve positivo después de que los datos se hayan extraído de la página principal html, por lo que br.addheaders.append no se ejecuta la primera vez, ya que no hay JSON en la respuesta del cuerpo, pero todas las otras respuestas del cuerpo son JSON ¿Es esta la forma correcta de hacer esto? ¿Hay alguna forma más eficiente? ¿Hay otros idiomas / bibliotecas que hacen esto mejor?

Después de un largo período de ejecución recibo este mensaje de error:

File "C:\Users\Donkey\My Documents\Aptana Studio Workspace\UrlMaintain2\src\UrlMaintain2.py", line 55, in pageResponse response = br.open(url) 
File "C:\Python27\lib\mechanize_mechanize.py", line 203, in open return self._mech_open(url, data, timeout=timeout) 
File "C:\Python27\lib\mechanize_mechanize.py", line 230, in _mech_open response = UserAgentBase.open(self, request, data) 
File "C:\Python27\lib\mechanize_opener.py", line 193, in open response = urlopen(self, req, data) 
File "C:\Python27\lib\mechanize_urllib2_fork.py", line 344, in _open '_open', req) File "C:\Python27\lib\mechanize_urllib2_fork.py", line 332, in _call_chain result = func(*args) 
File "C:\Python27\lib\mechanize_urllib2_fork.py", line 1142, in http_open return self.do_open(httplib.HTTPConnection, req) 
File "C:\Python27\lib\mechanize_urllib2_fork.py", line 1118, in do_open raise URLError(err) urllib2.URLError: 

e ha perdido, no estoy seguro de por qué se está generando, pero necesito tener toneladas de iteraciones antes de verlo.

Respuestas a la pregunta(1)

Su respuesta a la pregunta