В общем по факту меня интересует аплод фотографии на https://m.ok.ru/dk?st.cmd=userAddPhoto&st.msel=on&_prevCmd=userAllPhotos JS выключил парсим и получаем вот такие POST DATA Как видим по мимо самого файла, там передается ещё 2 переменные fr.posted=set и button_load=Загрузить фото Вот собственно сами элементы страницы Ну и вопрос, как это всё всё передать с помощью requests response = driver.request('POST', URL, headers=headers, data=data, files=files) Так как files передает только одну переменную, то есть сам файл, другие переменные он просто не видит. За совет тыщу рублей) спасибо.
Code: form_data = {'field1':'value1','field2':'value2'} driver.request('POST', URL, headers=headers, data=form_data, files=files) ?
Нет, это же QUERY STRING ну то есть другой тип передачи данных. Согласен, похоже как будто переменные из той колонки, но передаются они как мультипарт дата. Довольно странно.
Не понял. Я говорил про метод POST и передачу данных (как будто из полей формы) в качестве аргумета метода request. RTFM тут upd. Аналогичный вопрос тут. Все input`ы с типом hidden надо запихнуть в payload (я назвал словарь form_data) Может быть я неверно понял вопрос? А при отключенном JavaScript, Selenium не парсит DOM-дерево? (то есть невозможно получить доступ через метод по поиску по id ?
Если передать их в data, то получится немного другой тип данных. Тут эти переменные передаются как будто часть файла (мультипарт дата). Может я конечно что-то не понимаю, но на парсинге это выглядит именно так. При отключенном JS делал скрин. Всё нормально ищется.
Хорошо, тогда вроде как всё без изменений (извращение конечно, но надо пробовать): Code: POST a Multipart-Encoded File Requests makes it simple to upload Multipart-encoded files: url = 'http://httpbin.org/post' files = {'file': open('report.xls', 'rb'), 'key1': 'value1', 'key2' : 'value2'} r = requests.post(url, files=files) Может попробовать сделать: Code: driver.find_element_by_id("field_file").send_keys(os.getcwd()+"/image.png") submit = driver.find_element_by_id("upload_photo_btn") submit.click() Или тут уже как раз (для клика) и нужен отключенный JS ?
Да нет, когда передаешь в files какие-то другие переменные, не содержащие сам файл, их видимо сам модуль requests отсекает. При том, в сам files можно передавать бесчисленное множество файлов, в одном запросе. Что касается кликнуть, там же откроется файловый менеджер, которым управлять не получается. Нативно к нему доступа нет. В Firefox 17.0 ещё как-то было реализовано, но в других версиях уже нет. Так-с, ну с переменными я разобрался. Code: files = {'fr.posted': (None, 'set'), 'fr.file': ('1.png', open('1.png', 'rb')), 'button_load': (None, 'Загрузить фото')} Да, таким методом всё работает. По всей видимости для переменных которые передаются в мутильтипарт для модуля requests нужно указывать отсутствующий тип данных.