Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 20, 2011 18:06:24

cyhiso
От:
Зарегистрирован: 2008-03-15
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

поиск по сайту

Привет.
Возник вопрос.
Усть сайт tender.me.gov.ua, на котором размещен каталог державних закупивель :) (Пошук оголошень -> проведення процедур закупивель)
Жадные чиновники убрали возможность нормального поиска.
Нужно каким-то получить эту таблицу (желательно с возможность предварительно указывать категорию) для последующего поиска в ней по ключевым словам.
Полазив по форуму,я смог зайти на сайт из питона, заавторизироваться, но у меня никак не получается скачивать эту таблицу предложений.
я был бы очень благодарен хотя бы за приблизительное указание, где и что искать.
по ходу, нужно посмотреть какие запросы делает сайт из браузера и как-то их повторить на питоне.но, пока что не выходит.
спасибо :)



Офлайн

#2 Янв. 20, 2011 18:14:24

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

поиск по сайту

Тут в соседних темах это проскакивал, воспользуйтесь поиском по форуму



Офлайн

#3 Янв. 20, 2011 18:16:22

cyhiso
От:
Зарегистрирован: 2008-03-15
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

поиск по сайту

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)
при открытии сохраненной страницы на месте каталога пустота))



Офлайн

#4 Янв. 20, 2011 18:20:11

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

поиск по сайту

Для начала посмотрите, куда ведет форма авторизации…



Офлайн

#5 Янв. 24, 2011 13:33:45

cyhiso
От:
Зарегистрирован: 2008-03-15
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

поиск по сайту

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



Офлайн

#6 Янв. 26, 2011 10:49:38

cyhiso
От:
Зарегистрирован: 2008-03-15
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

поиск по сайту

Нашел в нете пример, в котором кто-то авторизируется на сайте 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()
сейчас получается пройти авторизацию, зайти в начало поиска.. и выбрав категорию - выполнить поиск предложений.
но. остаются следующие вопросы. при попытке перейти на следующую страницу результатов поиска либо при попытке изменить кол-во предложений на страницк (25, 50, 100) аналогичным путем через формы меня постигает неудача. так как искомые формы, насколько я понял - имеют флаг ReadOnly и я никак не могу их поменять.
как быть?
возможно, нужно вообще как-то выдирать POST запросы через http live headers, к примеру, и через них по сайту двигаться (я пробовал, пока не получается)

PS для работы этой поделки требуется модуль ClientFrom (http://wwwsearch.sourceforge.net/old/ClientForm/src/ClientForm-0.2.10.tar.gz)



Отредактировано (Янв. 26, 2011 10:51:48)

Офлайн

#7 Янв. 27, 2011 11:32:59

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

поиск по сайту

Поюзайте fireBug для firefox или dragonfly в opera и посмотрите какие заголовки, куда и как отправляются



Офлайн

#8 Янв. 27, 2011 11:41:40

cyhiso
От:
Зарегистрирован: 2008-03-15
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

поиск по сайту

сижу в обнимку с фаербагом и с 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()
суть в том.. что, выполняя login() - я заполняю форму логина и в ответ получаю куки..
в функции navigate() , пока я использую полученный куки в хедере - я получаю в ответ залогиненную урл..
но чтобы я ни писал в хедерах и в боди еще - все тоже самое..получаю залогиненую урл..видимо, из-за кривизны рук, я не правильно посылаю запрос..
вчера знакомый помогал и написал на php - у него с горем пополам работает.. правда, он логинится вручную, вставляет куки полученное + сегодня пришлось обновить хедеры. вчерашние уже не работали



Офлайн

#9 Янв. 27, 2011 14:02:13

cyhiso
От:
Зарегистрирован: 2008-03-15
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

поиск по сайту

наткнулся на новые подводные камни.
внезапно :) оказалось, что запросы формируются на основе полученных кук.
тоесть если я логинюсь вручную в браузере.. и подставляю в свой скрипт в хедер полученный куки,
и актуальный запрос - все работает.
а когда я получал куки из скрипт - запрос все равно брал из браузера. поэтому, ничего и не работало)
можно ли как-то решить эту проблему? чтобы на основе полученного куки как-то править запрос?



Офлайн

#10 Янв. 27, 2011 18:10:31

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

поиск по сайту

cyhiso
оказалось, что запросы формируются на основе полученных кук.
смотрите исходники страницы, там JavaScript берет куки и на основе них генерирует url'ы?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version