Форум сайта python.su
есть страница, на странице есть кнопка по нажатию которой ajax генерит ссылку, т.е. в исходном коде страницы ссылки нет, по ссылке фотография.
вопрос как возможно получить ссылку?
получилось осуществить это с помощью селениум, но во-первых непонятно почему надо выставлять ожидание до того как страница загрузится вручную(ибо похоже бывают проблемы с угадыванием этого времени), затем алгоритм такой, что открывается браузер, нажимается ссылка, в фф почему то открывается новое окно, потом я перехожу на это новое окно(с ссылкой на картинку) и получаю адрес текущей страницы, которая и является ссылкой на картинку, затем передаю это дело в urllib и сохраняю на диск.
не нравится, то, что браузер открывается закрывается на каждый запрос, нельзя ли его как то спрятать, + мне кажется что как то это всё медленно происходит.
но если всё это нельзя исправить, то можно ли запускать в несколько потоков код? или хотя бы запустить N одинаковых скриптов сразу, или скомпилировать и запустить несколько инстансов экзешника? т.е. не будет ли пробелм к обращению к одному и тому же браузеру или с селениумом?
Офлайн
Проще посмотреть что происходит по нажатию кнопки и сделать тоже самое на Python. Хорошо бы на страничку глянуть.
Selenium это медленно и по этому только для тяжелых случаев. У меня несколько одинаковых скриптов работало одновременно на Linux без проблем.
Офлайн
romisну а как вы это делали?
У меня несколько одинаковых скриптов работало одновременно на Linux без проблем.
romis
Проще посмотреть что происходит по нажатию кнопки и сделать тоже самое на Python.
Офлайн
>ну а как вы это делали?
Запускал из разных папок.
Если выдрать image_id из исходного кода страницы то можно получить несколько ссылок так
import urllib import urllib2 image_id = '1_219406272' post_url = 'http://a6e.qjtv.e.s35.hideme.ru/al_photos.php' header = { 'User-Agent' : 'Mozilla/4.0 (Windows; MSIE 6.0; Windows NT 5.0)', 'Accept' : 'text/html', 'Keep-Alive' : '115', 'Connection' : 'keep-alive', 'Accept-Charset' : 'windows-1251,utf-8;q=0.7,*;q=0.7', 'X-Requested-With' : 'XMLHttpRequest', 'Referer' : 'http://a6e.qjtv.e.s35.hideme.ru/durov?z=albums1'} post_data = urllib.urlencode({ 'act' : 'show', 'al' : '1', 'list' : 'photos1', 'module' : 'profile', 'photo' : image_id }) req = urllib2.Request(post_url, post_data, header) res = urllib2.urlopen(req, timeout=50).read().replace('\/', '/').split(image_id)[1].split('"id"')[0] f = open('test.html', 'w') f.write(res) f.close()
Офлайн
дело в том, что как я понял по вашему коду в test.html будет не распарсенный список ссылок на изображение это я и так могу получить, но мне надо получить самую большую фотографию, которая обычно имеет префикс w_, но не всегда и чем это определяется непонятно(видимо тем что в разное время были разные стандарты) и поэтому по кнопке “загрузить оригинал на диск” выдает разные типы ссылок в общем случае.
мне как бы надо сэмулировать нажатие на эту кнопку, только я не знаю можно ли это сделать без браузера.
Офлайн
При нажатии на кнопку происходит примерно то что в коде выше, осталось выбрать ссылку и скачать файл. Как выбрать ссылку не знаю. Возможно придется поковырять JavaScript. Я использую Firefox+Firebug для “посмотреть что делает браузер”.
Selenium нажмет на кнопку легко но скрыть окно браузера врядли удастся.
Офлайн
А использовать vk_api возможности нету? Было бы очень удобно http://vk.com/developers.php?oid=-1&p=photos.getById
Офлайн
А использовать vk_api возможности нету?нет такой возможности нету, т.к. надо логиниться.
Я использую Firefox+Firebug для “посмотреть что делает браузер”.не очень понятно, что вы под этим имеете ввиду и как это можно сэмулировать на питоне.
Отредактировано mrgloom (Авг. 8, 2012 15:29:24)
Офлайн
Браузер же что то отправляет что то получает. Все это можно подсмотреть и реализовать на питоне.
По поводу использования selenium без окна браузера есть возможнось уменьшить размер окна до нуля set_window_size(0, 0)
Офлайн
возможен вариант(при использовании селениума), когда браузер не успел загрузить страницу?
или там “оно само” ждет сколько нужно до загрузки?
теоретически ведь можно и селениум с использованием прокси пускать в несколько потоков?
еще вопрос, нужно получить дату загрузки фото,а там это тоже походу через ajax.preload делается.
т.е. через xpath походу это нельзя выцепить, можно наверно через регулярные выражения.
Офлайн