Как правильно использовать mechanize для парсинга сайтов AJAXPython

Программы на Python
Anonymous
Как правильно использовать mechanize для парсинга сайтов AJAX

Сообщение Anonymous »

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

Поэтому я хотел создать класс с методом механизации, который принимает 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:
Я как бы растерялся, не знаю, почему он создается, но мне нужно пройти массу итераций, прежде чем я его увижу.

Подробнее здесь: https://stackoverflow.com/questions/641 ... ajax-sites

Вернуться в «Python»