Форум сайта python.su
Привет.
Возник вопрос.
Усть сайт tender.me.gov.ua, на котором размещен каталог державних закупивель :) (Пошук оголошень -> проведення процедур закупивель)
Жадные чиновники убрали возможность нормального поиска.
Нужно каким-то получить эту таблицу (желательно с возможность предварительно указывать категорию) для последующего поиска в ней по ключевым словам.
Полазив по форуму,я смог зайти на сайт из питона, заавторизироваться, но у меня никак не получается скачивать эту таблицу предложений.
я был бы очень благодарен хотя бы за приблизительное указание, где и что искать.
по ходу, нужно посмотреть какие запросы делает сайт из браузера и как-то их повторить на питоне.но, пока что не выходит.
спасибо :)
Офлайн
Тут в соседних темах это проскакивал, воспользуйтесь поиском по форуму
Офлайн
igor.kaistтак я тут и искал..
Тут в соседних темах это проскакивал, воспользуйтесь поиском по форуму
import cookielib, urllib2, urllib
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
request0 = urllib2.Request('https://tender.me.gov.ua/EDZFrontOffice/', None, {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.8) Gecko/20071008 Firefox/2.0.0.8"})
handle0 = opener.open(request0, urllib.urlencode({'login' : '***','passwd' : '***'}))
data0 = handle0.read()
handle0.close()
request1 = urllib2.Request('https://tender.me.gov.ua/EDZFrontOffice/menu/uk/purchaseStartSearch', None, {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.8) Gecko/20071008 Firefox/2.0.0.8"})
handle1 = opener.open(request1)
data1 = handle1.read()
file('D:/tst.htm', 'w').write(data1)
Офлайн
Для начала посмотрите, куда ведет форма авторизации…
Офлайн
после авторизации, если покопаться в сорсе странички, то можно найти такую строку:
<a href=“#” onclick=“if(typeof jsfcljs == ‘function’){jsfcljs(document.getElementById('nestedView:j_id_id12pc8'),{'nestedView:j_id_id12pc8:j_id_id14pc8:6:j_id_id24pc8':'nestedView:j_id_id12pc8:j_id_id14pc8:6:j_id_id24pc8'},'');}return false” class=“p_ribbon”>Звіти про результати проведення процедур закупівель</a></td>
что, видимо, и есть запросом на создание и возвращение каталога через жаваскрипт. как бы это повторить на питоне? просто, с вебом вообще дела никогда не имел..
Офлайн
Нашел в нете пример, в котором кто-то авторизируется на сайте SecondLife. допилил под себя.
Получилось так:
import urllib2, cookielib, re, urllib
import ClientForm
class SiteParser:
def __init__(self, username, password):
self.username = username
self.password = password
self.url = 'https://tender.me.gov.ua'
self.startSearchUrl= '/EDZFrontOffice/menu/uk/purchaseStartSearch'
## self.req= '/EDZFrontOffice/menu/uk/purchaseStartSearch nestedView%3Afilter_form=nestedView%3Afilter_form&nestedView%3Afilter_form%3Abull=&nestedView%3Afilter_form%3Afilterbranch=15&nestedView%3Afilter_form%3Afiltercode=&nestedView%3Afilter_form%3Aj_id_id34pc8=&nestedView%3Afilter_form%3Aj_id_id41pc8=%D0%A8%D1%83%D0%BA%D0%B0%D1%82%D0%B8&javax.faces.ViewState=j_id3%3Aj_id5'
cookiejar = cookielib.LWPCookieJar()
cookiejar = urllib2.HTTPCookieProcessor(cookiejar)
# debugger = urllib2.HTTPHandler(debuglevel=1)
opener = urllib2.build_opener(cookiejar)
urllib2.install_opener(opener)
def login(self):
response = urllib2.urlopen(self.url)
forms = ClientForm.ParseResponse(response, backwards_compat=False)
# forms[0] is 'GET', forms[1] is 'POST'
form = forms[0]
form['login:login'] = self.username
form['login:password'] = self.password
self.page = urllib2.urlopen(form.click('login:j_id_id254'))
self.page = urllib2.urlopen(self.url + self.startSearchUrl)
# already logged in.
loggedForms = ClientForm.ParseResponse(self.page, backwards_compat=False)
for i in range(len(loggedForms)):
print i, loggedForms[i]
loggedForms[1]['nestedView:filter_form:filterbranch'] = '1', # category of search
self.page = urllib2.urlopen(loggedForms[1].click('nestedView:filter_form:j_id_id41pc8')) # pressing search button
## self.page = urllib.urlopen(self.page.geturl(), 'POST /EDZFrontOffice/menu/uk/purchaseStartSearch nestedView%3Aj_id_id8pc10=nestedView%3Aj_id_id8pc10&nestedView%3Aj_id_id8pc10%3Aj_id_id10pc10=100&nestedView%3Aj_id_id8pc10%3Aj_id_id12pc10=2400&javax.faces.ViewState=j_id3%3Aj_id17&nestedView%3Aj_id_id8pc10%3Anext=nestedView%3Aj_id_id8pc10%3Anext')
## print loggedForm['nestedView:filter_form:j_id_id34pc8']
data = self.page.read()
file('D:/tst.htm', 'w').write(data)
sp = SiteParser('your_login, 'your_password')
sp.login()
Отредактировано (Янв. 26, 2011 10:51:48)
Офлайн
Поюзайте fireBug для firefox или dragonfly в opera и посмотрите какие заголовки, куда и как отправляются
Офлайн
сижу в обнимку с фаербагом и с hhtp live headers..
вчера начал пробовать через запросы делать
import urllib2, cookielib, re, urllib
from httplib2 import Http
import ClientForm
class SiteParser:
def __init__(self, username, password):
self.username = username
self.password = password
self.url = 'https://tender.me.gov.ua'
self.cookiejar = cookielib.LWPCookieJar()
self.cookiejar = urllib2.HTTPCookieProcessor(self.cookiejar)
opener = urllib2.build_opener(self.cookiejar)
urllib2.install_opener(opener)
def login(self):
response = urllib2.urlopen(self.url)
forms = ClientForm.ParseResponse(response, backwards_compat=False)
form = forms[0]
form['login:login'] = self.username
form['login:password'] = self.password
self.page = urllib2.urlopen(form.click('login:j_id_id254'))
self.coockie = str(self.cookiejar.cookiejar).split()[1] + '\r\n'
def navigate(self):
url = 'https://tender.me.gov.ua/EDZFrontOffice/'
headers = {
## 'Content-type': 'application/x-www-form-urlencoded',
## 'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 (.NET CLR 3.5.30729)',
'Cookie': self.coockie,
}
body= ''
http = Http()
response, content = http.request(url, 'POST', headers=headers, body=body)
print response
file('D:/tst1.htm', 'w').write(content)
sp = SiteParser('login@lo.lo', 'pwd') ## - рабочие лог и пароль)если кто захочет попробовать)
sp.login()
sp.navigate()
Офлайн
наткнулся на новые подводные камни.
внезапно :) оказалось, что запросы формируются на основе полученных кук.
тоесть если я логинюсь вручную в браузере.. и подставляю в свой скрипт в хедер полученный куки,
и актуальный запрос - все работает.
а когда я получал куки из скрипт - запрос все равно брал из браузера. поэтому, ничего и не работало)
можно ли как-то решить эту проблему? чтобы на основе полученного куки как-то править запрос?
Офлайн
cyhisoсмотрите исходники страницы, там JavaScript берет куки и на основе них генерирует url'ы?
оказалось, что запросы формируются на основе полученных кук.
Офлайн