Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

гуру. подскажите где почитать про парсинг сайтов в 1с :)

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

давай адрес сайта :)
   zladenuw
 
3 - 12.11.13 - 22:29
(1) спасиб. буду изучать.
(2) http://shop.armtek.ru/
   zladenuw
 
4 - 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");
   NIkitos91
 
5 - 12.11.13 - 22:38
(0) Попробуйте имитировать интерактивную работу через IE Application или поле HTML документа (что в принципе одно и то же)
   zladenuw
 
6 - 12.11.13 - 22:45
да мне вообще суть понять. как и что за чем. а то как новый лес. хз куда иди, что смотреть. всегда старался обходить стороной веб. а тут надо сделать :)
   vde69
 
Модератор
7 - 12.11.13 - 22:45
он использует определение сесии, скорее всего это носок, по этому тебе нужно работать через ОДНО соединение, не прерывая его. Ну и соксы разреши :)
   zladenuw
 
8 - 12.11.13 - 22:53
(7) так, так и есть в обработке. но при этом если смотреть через фиббер. все равно другой сенд. чем когда через сайт захожу и начинаю поиск. а что такое соксы  ?
   NIkitos91
 
9 - 12.11.13 - 22:56
(6) В общем мое предложение Вам:)Создаете ком-объект Ie Application. У него есть методы, которые позволят перейти на нужный сайт, обойти dom, заполнить нужное, вызвать методы-обработчики кнопок.
То есть как бы работа будет не на уровне запросов, а на более высоком уровне что-ли:)Более привычно.
   NIkitos91
 
10 - 12.11.13 - 22:57
(9) Единственный минус - поменяли структуру сайта, полезли ошибки.
   zladenuw
 
11 - 12.11.13 - 22:57
(9) (10) я понял. но дали вот заготовку и сказали должна взлететь. так что пока вариант номер 1, но буду иметь на заметку
   Asmody
 
12 - 12.11.13 - 23:00
(11) не надо так (9) делать
   zladenuw
 
13 - 12.11.13 - 23:01
(12) а как надо делать ? направите ?
   oleg_km
 
14 - 12.11.13 - 23:08
ну в конце концов, дайте кому-нибудь за деньги. Потом посмотрите как сделано и будете продолжать так же. А так бесполезно выпрашивать на форуме по каплям информацию. Или на инфостарте найдите похожую обработку и посмотрите как сделано. Тогда появятся конкретные вопросы, с ними реально помогут. А так вот с нуля и все подробно рассказать и ночи не хватит
   zladenuw
 
15 - 12.11.13 - 23:10
(14) да верю что не хватит. по немного но понимаю.
теперь понятно зачем дублировать (4) для каждого сенда.
http://www.phpclub.ru/detail/article/http_request
   Asmody
 
16 - 12.11.13 - 23:15
(13) HTTPСоединение.post() и не надо ни каких извращений с ИЕ
   zladenuw
 
17 - 12.11.13 - 23:22
(16) сейчас использую вот так
    Соединение = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
        
        Скрипт= Новый COMОбъект("MSScriptControl.ScriptControl");
        Скрипт.language="javascript";
            
        Скрипт.AddObject("WinHttp", Соединение);
        Скрипт.Eval("WinHttp.Option(2)=1251");
через HTTPСоединение проще ?
   Asmody
 
18 - 12.11.13 - 23:52
(17) нативнее
   zladenuw
 
19 - 13.11.13 - 00:03
ответ сервера приходит с такими символами ‹, не копирует даже. как узнать какую кодировку нужно установить ?
   Asmody
 
20 - 13.11.13 - 00:04
(19) json там приходит в utf-8
   zladenuw
 
21 - 13.11.13 - 00:09
(20) то получается мне нужно отправить в такой же кодировке ? или как мне получить в нужной. что бы не отображались кракозябры
   Asmody
 
22 - 13.11.13 - 00:31
(21) на выходе HTTPСоединение.post() получается текстовый файл, который прекрасно открывается самой 1Ской
   НаборДанных
 
23 - 13.11.13 - 00:41
   zladenuw
 
24 - 13.11.13 - 00:42
(23) спасибо но не то.
   zladenuw
 
25 - 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"}
   zladenuw
 
26 - 13.11.13 - 01:09
(25) а все разобрался использовал HTTPОтвет
Теперь другая проблема. после авторизации. есть переход на форму где надо выбрать значение. вот как быть с ним ?

сейчас делаю вот так

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

и ошибка 302. или тут надо по другому ?
   miron25
 
27 - 13.11.13 - 01:21
(26) Каталог АРАГОНА-это что все артикулы и товар?Может скачать каталог товаров ?
   zladenuw
 
28 - 13.11.13 - 01:21
{Форма.Форма.Форма(23)}: Ошибка при вызове метода контекста (ОтправитьДляОбработки)

    HTTPОтвет = Соединение.ОтправитьДляОбработки("http://shop.armtek.ru/setvkorg?";+параметрыПост);
по причине:
Неправильный путь к файлу

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

    Соединение.ОтправитьДляОбработки(ИмяФайлаЗапроса, РесурсНаСервере, ФайлРезультата);
 
 
   Asmody
 
31 - 13.11.13 - 01:25
(28) Обратись к ДенисЧ,  он регулярно тут СП распродает
   miron25
 
32 - 13.11.13 - 01:27
(31)Я вчера обращался.Говорит закончились на прошлой неделе,а когда завоз не знает.
   Asmody
 
33 - 13.11.13 - 01:28
(32) Тяжело теперь одинесникам будет, нельзя одинеснику без СП
   zladenuw
 
34 - 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">

это че такое ?
   miron25
 
35 - 13.11.13 - 01:34
(30)Там пост запрос.И судя по всему как там расположены результаты,да и еще на нескольких могут быть страницах.Что то подсказывает.что не все просто так,изучай dom в 1с,в общем гимор,лучше заплати кому нибудь...Хотя надеюсь,что я ошибаюсь.
   zladenuw
 
36 - 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 Тогда
        Сообщить("ошибка");
        Возврат;
    КонецЕсли;
Или что то не так делаю ?
   miron25
 
37 - 13.11.13 - 01:35
(34)Это скрипты и подключаемые каскадные таблицы.
   zladenuw
 
38 - 13.11.13 - 01:36
а зачем они мне :).
правильно ли я понимаю что если код 200. то все ок или нет ?
   miron25
 
39 - 13.11.13 - 01:36
(36)Да подключиться,то не проблема.Результат получить и вытащить оттуда в ТЗ,вот где загадка.
   zladenuw
 
40 - 13.11.13 - 01:38
я несколько часов назад и это не умел. и это было для меня загадка.
такс как мне понять. что передавать для поиска ? нужно править  заголовки ? или нет ?
   miron25
 
41 - 13.11.13 - 01:38
(38)Советую скачать каталог xls у них на сайте...и делай с ним что хошь.
   Asmody
 
42 - 13.11.13 - 01:38
(34) Это html, старина,  просто html...
   zladenuw
 
43 - 13.11.13 - 01:39
(41) еще раз читай (29)
   zladenuw
 
44 - 13.11.13 - 01:39
(42) ясно. значит мой пост ушел хз куда.
   miron25
 
45 - 13.11.13 - 01:40
(43)Читал ...но советую..
   zladenuw
 
46 - 13.11.13 - 01:41
(45) надо программно зайти, найти, получить, выйти :)
   miron25
 
47 - 13.11.13 - 01:43
Тут один тоже задавал,недавно задачу похожую такую..Но в ветке много было людей...а он так и ждал помощи.Что то наверно и здесь так будет.
   Asmody
 
48 - 13.11.13 - 01:43
Имей ввиду,  тебе из кук понадобится ci_session и session_id если есть. Куки можно в HTTPОтвет посмотреть
   zladenuw
 
49 - 13.11.13 - 01:44
так я прощу подсказки,а не готового решения. может я делаю что не так.
   zladenuw
 
50 - 13.11.13 - 01:44
(48) да видел я их там. нужно их в постзапрос добавлять ?
   zladenuw
 
51 - 13.11.13 - 01:59
правильно ли я делаю 2 пост к серверу сайта ? мне нужно туда передать значение.
   badboychik
 
52 - 13.11.13 - 02:30
можно в Firebug посмотреть что передается при отправке данных, когда вручную все вводишь
   zladenuw
 
53 - 13.11.13 - 02:39
(52) так фидлером смотрел. да сейчас разбираюсь. оказывается. я даже не проходил авторизацию на сайте. так что читаю как правильно сделать
   zladenuw
 
54 - 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,,ИмяФайлаОтвета);
   badboychik
 
55 - 13.11.13 - 02:45
зачем тебе вообще 1С ? пиши на JavaScript в консоли Firebug-а, с помощью jQuery можно делать POST и GET одной строчкой, а ты херней многоэтажной страдаешь
   zladenuw
 
56 - 13.11.13 - 02:53
Для работы Firebug 1.4 требуется Firefox 3.0 или выше. у меня нету файр фокса.
да мне вообще понять что за чем. надо через 1с. или покажи как это проще без 1с. буду пробывать
   badboychik
 
57 - 13.11.13 - 03:08
че то я про ффокс не понял, на дворе 26-я версия, какая 3.0? ты вменяемый вообще?
(56)
$.post( "mysite.ru/ajax/test.php", function( data ) {
    $( ".result" ).html( data );// результат выводим в документ

});

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


        Попытка
            Соединение = Новый HTTPСоединение(ПараметрыСтроки.Хост,,,,,10);
//            Соединение = Новый HTTPСоединение(ПараметрыСтроки.Хост, <Порт>, <Пользователь>, <Пароль>, <Прокси>, <Таймаут>, <ЗащищенноеСоединение>); 

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

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

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


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.