Имя: Пароль:
1C
1С v8
гуру. подскажите где почитать про парсинг сайтов в 1с :)
,
0 zladenuw
 
12.11.13
22:19
есть некий сайт. нужно на него залогинится и отправить запрос на поиск артикула. а результат загрузить в тз.
поставил програму fiddler2.
На сайт логинюсь. отправляю пост на поиск. но результат пустой. дайте направление. спасибо
1 Мизантроп
 
12.11.13
22:23
2 vde69
 
модератор
12.11.13
22:24
запросы не обязательно пост, бывает гет и еще есть пара специфических...

давай адрес сайта :)
3 zladenuw
 
12.11.13
22:29
(1) спасиб. буду изучать.
(2) http://shop.armtek.ru/
4 zladenuw
 
12.11.13
22:35
вот это обязательно прописывать. я в этом 0. и пока не понимаю зачем оно нужно

        Соединение.SetRequestHeader("Host", "shop.armtek.ru");
        Соединение.SetRequestHeader("Connection", "Keep-alive");
        Соединение.SetRequestHeader("Content-Length", РазмерФайлаОтправки);
        Соединение.SetRequestHeader("Accept", "application/json, text/javascript, */*; q=0.01");
        Соединение.SetRequestHeader("Origin", "http://shop.armtek.ru";);
        Соединение.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36");
        Соединение.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded; Charset=windows-1251");
        Соединение.SetRequestHeader("Referer", "http://shop.armtek.ru/";);
        Соединение.SetRequestHeader("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
        Соединение.SetRequestHeader("Accept-Encoding", "gzip,deflate,sdch");
5 NIkitos91
 
12.11.13
22:38
(0) Попробуйте имитировать интерактивную работу через IE Application или поле HTML документа (что в принципе одно и то же)
6 zladenuw
 
12.11.13
22:45
да мне вообще суть понять. как и что за чем. а то как новый лес. хз куда иди, что смотреть. всегда старался обходить стороной веб. а тут надо сделать :)
7 vde69
 
модератор
12.11.13
22:45
он использует определение сесии, скорее всего это носок, по этому тебе нужно работать через ОДНО соединение, не прерывая его. Ну и соксы разреши :)
8 zladenuw
 
12.11.13
22:53
(7) так, так и есть в обработке. но при этом если смотреть через фиббер. все равно другой сенд. чем когда через сайт захожу и начинаю поиск. а что такое соксы  ?
9 NIkitos91
 
12.11.13
22:56
(6) В общем мое предложение Вам:)Создаете ком-объект Ie Application. У него есть методы, которые позволят перейти на нужный сайт, обойти dom, заполнить нужное, вызвать методы-обработчики кнопок.
То есть как бы работа будет не на уровне запросов, а на более высоком уровне что-ли:)Более привычно.
10 NIkitos91
 
12.11.13
22:57
(9) Единственный минус - поменяли структуру сайта, полезли ошибки.
11 zladenuw
 
12.11.13
22:57
(9) (10) я понял. но дали вот заготовку и сказали должна взлететь. так что пока вариант номер 1, но буду иметь на заметку
12 Asmody
 
12.11.13
23:00
(11) не надо так (9) делать
13 zladenuw
 
12.11.13
23:01
(12) а как надо делать ? направите ?
14 oleg_km
 
12.11.13
23:08
ну в конце концов, дайте кому-нибудь за деньги. Потом посмотрите как сделано и будете продолжать так же. А так бесполезно выпрашивать на форуме по каплям информацию. Или на инфостарте найдите похожую обработку и посмотрите как сделано. Тогда появятся конкретные вопросы, с ними реально помогут. А так вот с нуля и все подробно рассказать и ночи не хватит
15 zladenuw
 
12.11.13
23:10
(14) да верю что не хватит. по немного но понимаю.
теперь понятно зачем дублировать (4) для каждого сенда.
http://www.phpclub.ru/detail/article/http_request
16 Asmody
 
12.11.13
23:15
(13) HTTPСоединение.post() и не надо ни каких извращений с ИЕ
17 zladenuw
 
12.11.13
23:22
(16) сейчас использую вот так

    Соединение = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
        
        Скрипт= Новый COMОбъект("MSScriptControl.ScriptControl");
        Скрипт.language="javascript";
            
        Скрипт.AddObject("WinHttp", Соединение);
        Скрипт.Eval("WinHttp.Option(2)=1251");
через HTTPСоединение проще ?
18 Asmody
 
12.11.13
23:52
(17) нативнее
19 zladenuw
 
13.11.13
00:03
ответ сервера приходит с такими символами ‹, не копирует даже. как узнать какую кодировку нужно установить ?
20 Asmody
 
13.11.13
00:04
(19) json там приходит в utf-8
21 zladenuw
 
13.11.13
00:09
(20) то получается мне нужно отправить в такой же кодировке ? или как мне получить в нужной. что бы не отображались кракозябры
22 Asmody
 
13.11.13
00:31
(21) на выходе HTTPСоединение.post() получается текстовый файл, который прекрасно открывается самой 1Ской
23 НаборДанных
 
13.11.13
00:41
24 zladenuw
 
13.11.13
00:42
(23) спасибо но не то.
25 zladenuw
 
13.11.13
01:02
сделал вот так

Соединение = Новый HTTPСоединение("shop.armtek.ru");
    параметрыПост = "login=" + СтрЗаменить(Пользователь, "@", "%40") + "&pass=" + Пароль + "+&remember=false";
    ИмяФайлаОтвета = ПолучитьИмяВременногоФайла("txt");
    Соединение.Получить("http://shop.armtek.ru/authorization?";+параметрыПост,ИмяФайлаОтвета);

вернуло такую хрень. {"title":"\u041e\u0448\u0438\u0431\u043a\u0430","body":"","code":"1"}
26 zladenuw
 
13.11.13
01:09
(25) а все разобрался использовал HTTPОтвет
Теперь другая проблема. после авторизации. есть переход на форму где надо выбрать значение. вот как быть с ним ?

сейчас делаю вот так
    параметрыПост = "VKORG=5210";
    HTTPОтвет = Соединение.Получить("http://shop.armtek.ru/setvkorg?";+параметрыПост,ИмяФайлаОтвета);

и ошибка 302. или тут надо по другому ?
27 miron25
 
13.11.13
01:21
(26) Каталог АРАГОНА-это что все артикулы и товар?Может скачать каталог товаров ?
28 zladenuw
 
13.11.13
01:21
{Форма.Форма.Форма(23)}: Ошибка при вызове метода контекста (ОтправитьДляОбработки)
    HTTPОтвет = Соединение.ОтправитьДляОбработки("http://shop.armtek.ru/setvkorg?";+параметрыПост);
по причине:
Неправильный путь к файлу

с какого дуба ? или что нужно передать в httpЗапрос ?
29 zladenuw
 
13.11.13
01:23
(27) качать не надо. нужно пройти авторизацию и получить нужные данные. и выйти.
30 zladenuw
 
13.11.13
01:24
и блин. почему в Сп описан только 2 параметра. если в примере задают 3. это как ?

    Соединение.ОтправитьДляОбработки(ИмяФайлаЗапроса, РесурсНаСервере, ФайлРезультата);
31 Asmody
 
13.11.13
01:25
(28) Обратись к ДенисЧ,  он регулярно тут СП распродает
32 miron25
 
13.11.13
01:27
(31)Я вчера обращался.Говорит закончились на прошлой неделе,а когда завоз не знает.
33 Asmody
 
13.11.13
01:28
(32) Тяжело теперь одинесникам будет, нельзя одинеснику без СП
34 zladenuw
 
13.11.13
01:33
получаю в файле такую штуку.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">;
<html xmlns="http://www.w3.org/1999/xhtml">;
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Armtek - запчасти для грузовых и легковых автомобилей, оборудование для СТО</title>
<link href="/css/main.css" rel="stylesheet" type="text/css" media="screen" />
<link href="/css/shop.ezet.ru.css" rel="stylesheet" type="text/css" media="screen" />
<script type="text/javascript">

это че такое ?
35 miron25
 
13.11.13
01:34
(30)Там пост запрос.И судя по всему как там расположены результаты,да и еще на нескольких могут быть страницах.Что то подсказывает.что не все просто так,изучай dom в 1с,в общем гимор,лучше заплати кому нибудь...Хотя надеюсь,что я ошибаюсь.
36 zladenuw
 
13.11.13
01:34
сделал вот так. намного проще блин :)

Соединение = Новый HTTPСоединение("shop.armtek.ru");
    параметрыПост = "login=" + СтрЗаменить(Пользователь, "@", "%40") + "&pass=" + Пароль + "+&remember=false";
    HTTPОтвет = Соединение.Получить("http://shop.armtek.ru/authorization?";+параметрыПост);
    
    Если HTTPОтвет.КодСостояния <> 200 Тогда
        Сообщить("ошибка");
        Возврат;
    КонецЕсли;    
    параметрыПост = "VKORG=5210";    
    HTTPОтвет = Соединение.ОтправитьДляОбработки("http://shop.armtek.ru/setvkorg?";+параметрыПост,,);
    
    Если HTTPОтвет.КодСостояния <> 200 Тогда
        Сообщить("ошибка");
        Возврат;
    КонецЕсли;
    
    
    ИмяФайлаОтвета = ПолучитьИмяВременногоФайла("txt");
    параметрыПост = "searchQuery=" + Артикул + "&searchType=1";
    
    HTTPОтвет = Соединение.ОтправитьДляОбработки("http://shop.armtek.ru/search?";+параметрыПост,,ИмяФайлаОтвета);
    
    Если HTTPОтвет.КодСостояния <> 200 Тогда
        Сообщить("ошибка");
        Возврат;
    КонецЕсли;
Или что то не так делаю ?
37 miron25
 
13.11.13
01:35
(34)Это скрипты и подключаемые каскадные таблицы.
38 zladenuw
 
13.11.13
01:36
а зачем они мне :).
правильно ли я понимаю что если код 200. то все ок или нет ?
39 miron25
 
13.11.13
01:36
(36)Да подключиться,то не проблема.Результат получить и вытащить оттуда в ТЗ,вот где загадка.
40 zladenuw
 
13.11.13
01:38
я несколько часов назад и это не умел. и это было для меня загадка.
такс как мне понять. что передавать для поиска ? нужно править  заголовки ? или нет ?
41 miron25
 
13.11.13
01:38
(38)Советую скачать каталог xls у них на сайте...и делай с ним что хошь.
42 Asmody
 
13.11.13
01:38
(34) Это html, старина,  просто html...
43 zladenuw
 
13.11.13
01:39
(41) еще раз читай (29)
44 zladenuw
 
13.11.13
01:39
(42) ясно. значит мой пост ушел хз куда.
45 miron25
 
13.11.13
01:40
(43)Читал ...но советую..
46 zladenuw
 
13.11.13
01:41
(45) надо программно зайти, найти, получить, выйти :)
47 miron25
 
13.11.13
01:43
Тут один тоже задавал,недавно задачу похожую такую..Но в ветке много было людей...а он так и ждал помощи.Что то наверно и здесь так будет.
48 Asmody
 
13.11.13
01:43
Имей ввиду,  тебе из кук понадобится ci_session и session_id если есть. Куки можно в HTTPОтвет посмотреть
49 zladenuw
 
13.11.13
01:44
так я прощу подсказки,а не готового решения. может я делаю что не так.
50 zladenuw
 
13.11.13
01:44
(48) да видел я их там. нужно их в постзапрос добавлять ?
51 zladenuw
 
13.11.13
01:59
правильно ли я делаю 2 пост к серверу сайта ? мне нужно туда передать значение.
52 badboychik
 
13.11.13
02:30
можно в Firebug посмотреть что передается при отправке данных, когда вручную все вводишь
53 zladenuw
 
13.11.13
02:39
(52) так фидлером смотрел. да сейчас разбираюсь. оказывается. я даже не проходил авторизацию на сайте. так что читаю как правильно сделать
54 zladenuw
 
13.11.13
02:43
вот так правильно писать POST  запрос к серверу ?

    Соединение = Новый HTTPСоединение("shop.armtek.ru");
    ИмяФайлаОтвета = ПолучитьИмяВременногоФайла("txt");
    параметрыПост = "login=" + СтрЗаменить(Пользователь, "@", "%40") + "&pass=" + Пароль + "+&remember=false";
    ЗаголовокНТТР = новый Соответствие();
    РазмерФайлаОтправки = XMLСтрока(СтрДлина(параметрыПост));    
    ЗаголовокНТТР.Вставить("Host", "shop.armtek.ru");
    ЗаголовокНТТР.Вставить("Connection", "Keep-alive");
    ЗаголовокНТТР.Вставить("Content-Length", РазмерФайлаОтправки);
    ЗаголовокНТТР.Вставить("Accept", "application/json, text/javascript, */*; q=0.01");
    ЗаголовокНТТР.Вставить("Origin", "http://shop.armtek.ru";);
    ЗаголовокНТТР.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36");
    ЗаголовокНТТР.Вставить("Content-Type", "application/x-www-form-urlencoded; Charset=windows-1251");
    ЗаголовокНТТР.Вставить("Referer", "http://shop.armtek.ru";);
    ЗаголовокНТТР.Вставить("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
    ЗаголовокНТТР.Вставить("Accept-Encoding", "gzip,deflate,sdch");
    
    authorization = Новый HTTPЗапрос("http://shop.armtek.ru/authorization?";,ЗаголовокНТТР);
    authorization.УстановитьТелоИзСтроки(параметрыПост,КодировкаТекста.UTF8);
    HTTPОтвет = Соединение.ОтправитьДляОбработки(authorization,,ИмяФайлаОтвета);
55 badboychik
 
13.11.13
02:45
зачем тебе вообще 1С ? пиши на JavaScript в консоли Firebug-а, с помощью jQuery можно делать POST и GET одной строчкой, а ты херней многоэтажной страдаешь
56 zladenuw
 
13.11.13
02:53
Для работы Firebug 1.4 требуется Firefox 3.0 или выше. у меня нету файр фокса.
да мне вообще понять что за чем. надо через 1с. или покажи как это проще без 1с. буду пробывать
57 badboychik
 
13.11.13
03:08
че то я про ффокс не понял, на дворе 26-я версия, какая 3.0? ты вменяемый вообще?
(56)
$.post( "mysite.ru/ajax/test.php", function( data ) {
    $( ".result" ).html( data ); // результат выводим в документ
});

вот и всё
58 zladenuw
 
13.11.13
03:10
(57) я про то что. что я этим не пользовался вообще.
и куда мне этот код ?  :)
59 badboychik
 
13.11.13
03:23
(58) ну смотри где нужная инфа на странице лежит и дергай ее обращаясь к блокам по нужному селектору CSS. Читай доки http://jquery-docs.ru/Selectors/
Когда все будет выбираться в консоли, вставишь скрипт в html-страницу на форме и будешь его вызывать одной кнопкой. А 1С в топку для такой задачи
60 zladenuw
 
13.11.13
03:27
(59) так вот именно что надо через 1с. так как она вызывается с обработки которая в свою очередь дергаю с десяток обработок парсингов сайтов. и выводит результат в тз. по найденным артикулом с разных сайтов. вот такие дела
61 vde69
 
модератор
13.11.13
08:11
может так проще?


        Попытка
            Соединение = Новый HTTPСоединение(ПараметрыСтроки.Хост,,,,,10);
//            Соединение = Новый HTTPСоединение(ПараметрыСтроки.Хост, <Порт>, <Пользователь>, <Пароль>, <Прокси>, <Таймаут>, <ЗащищенноеСоединение>);
        Исключение
            Сообщить("Не удалось установить соединение с сервером"
                + Символы.ПС + ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
            Возврат;
        КонецПопытки;
        
        Запрос = Новый HTTPЗапрос(ПараметрыСтроки.ПутьНаСервере, ПараметрыЗапроса) ;
        Попытка
            Если Площадка.ТипЗапросаСпискаТендеров = Перечисления.ТипыЗапросовHTTP.POST Тогда
                ПутьДляСохранения = ПолучитьИмяВременногоФайла();    
                Ответ = Соединение.ОтправитьДляОбработки(Запрос, ПутьДляСохранения);
            ИначеЕсли Площадка.ТипЗапросаСпискаТендеров = Перечисления.ТипыЗапросовHTTP.GET Тогда
                Ответ = Соединение.Получить(Запрос, ПутьДляСохранения);
            Иначе
                Сообщить("Не определен метод запроса HTTP"
                    + Символы.ПС + ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
                Возврат;
            
            КонецЕсли;
        Исключение
            Сообщить("Ошибка при получении файла с сервера"                                              
                + Символы.ПС + ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
            Возврат;
        КонецПопытки;
        
        ЧтениеHTML = Новый ЧтениеHTML;
        ЧтениеHTML.ОткрытьФайл(ПутьДляСохранения, СокрЛП(Площадка.Кодировка));
        ПостроительDOM = Новый ПостроительDOM();
        мДок = ПостроительDOM.Прочитать(ЧтениеHTML);
        ТекущийПуть = "";
        
        Обработчики = Новый Соответствие;
        Для Каждого эл из Площадка.ОбработчикиСписка Цикл
            Обработчики.Вставить(эл.Тег, эл.Обработчик);
        КонецЦикла;
62 badboychik
 
13.11.13
09:02
(60) скачай библиотеку от 1С - "Internet Connection Library" для работы с веб-ресурсами, там по крайней мере есть готовые методы  для выполнения пост/гет запросов и обработки результата в JSON, не надо писать свои велосипеды
63 zladenuw
 
13.11.13
10:32
(62) спасиб гляну.
(61) буду пробовать.
Я так и не понял что надо запихывать в нттпЗапрос
64 zladenuw
 
13.11.13
12:09
(61)
Запрос = Новый HTTPЗапрос(ПараметрыСтроки.ПутьНаСервере, ПараметрыЗапроса) ;

А что мне передавать в ПараметрыСтроки.ПутьНаСервере и ПараметрыЗапроса.

В параметрызапроса, заголовки ?