Как правильно использовать механизацию для очистки AJAX-сайтов - PullRequest
3 голосов
/ 21 июня 2011

Так что я довольно новичок в веб-поиске.Есть этот сайт, на котором есть таблица, значения таблицы контролируются Javascript.Значения будут определять адрес будущих значений, которые мой браузер запрашивает у Javascript.На этих новых страницах есть ответы в формате JSON, с помощью которых скрипт обновляет таблицу в моем браузере.

Поэтому я хотел создать класс с помощью метода Mechanize, который принимает URL-адрес и выдает ответ тела в первый раз, когдаHTML, после этого ответом тела будет JSON, для оставшихся итераций.

У меня есть кое-что, что работает, но я хочу знать, правильно ли я это делаю или есть лучший способ.

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 становится положительным после того, как данные извлечены из html главной страницы, поэтому br.addheaders.append не запускается с первого раза, поскольку в ответе тела отсутствует JSON, но все остальныеответы тела - JSON.Это правильный способ сделать это?Есть ли более эффективный способ?

self.first_append становится положительным после того, как данные были извлечены из главной страницы html, поэтому br.addheaders.append не запускается с первого раза, так как нет JSONв ответе тела, но все остальные ответы тела являются JSON.Это правильный способ сделать это?Есть ли более эффективный способ?Существуют ли другие языки / библиотеки, которые делают это лучше?

После длительного периода работы я получаю это сообщение об ошибке:

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: 

Это как-то потеряло меня, не знаю, почемугенерируется, но мне нужно иметь массу итераций, прежде чем я это увижу.

1 Ответ

7 голосов
/ 21 июня 2011

Из mechanize faq"Mechanize не предоставляет никакой поддержки JavaScript", затем он уточняет ваши варианты (выбор не велик).

Если у вас что-то работает, то замечательно, но использование селенового вебдрайвера - гораздо лучшее решение для очистки сайтов ajax, чем механизация

...