1 место ZennoPoster: Кладезь безграничных идей и возможностей. Часть 2 (JSON + API + POST/GET)

  • Автор темы Автор темы lexone
  • Дата начала Дата начала

lexone

Client
Регистрация
12.10.2012
Сообщения
420
Реакции
726
Баллы
93
Приветствую всех!
В этот раз решил обойтись длинным монологом, СРАЗУ ПЕРЕЙДЕМ К ДЕЛУ :bi:


211yjt7v.png



Когда я был дорвейщиком , то планировал смастерить этот шаблон на зенки... да все руки не доходили.

Парсить мы будет по слову "Скачать" . Сразу со страницы твиттера мне перехотелось

https://twitter.com/search?q=скачать&src=typd

Api твиттера на поиск тоже не поддавалось (а я то думал, что у дропбокса самое идиотское... наивный :bq: ), но гугл как всегда спешит на помощь :ea: ||| После нудного получасового перебора всех сайтов.. я был вымотан, НО ДОВОЛЕН !!!

HTML:
Развернуть Свернуть Копировать
https://www.twilert.com/twilerts/preview?query=%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C

Теперь все кандидаты в сборе.. (a-parser, зенка, источник инфы) - Пора приступать :dh:

Наша задача:

  1. Спарсить из этой кучи-малы только текст твиттов
  2. Отобрать твитты, которые имеют: (не менее 20 символов && но не больше 55 символов).
  3. Почистить их от мусора
Код:
Развернуть Свернуть Копировать
var contentfinal = project.Lists["contentfinal"]; // обозначим список "contentfinal "
var list = project.Lists["list"];   // обозначим список "list"
string regex = project.Variables["regex2"].Value; // регулярка
string text = project.Variables["nomer2"].Value; // текст
var reg = new System.Text.RegularExpressions.Regex(regex, System.Text.RegularExpressions.RegexOptions.None);
foreach (var match in reg.Matches(text))
{
    list.Add(match.ToString());   // добавляем в цикле все значения в список
}
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < list.Count; i++)  // цикл на Replace, кол-во символов
    {
        // читаем строку из списка
        var str = list[i];
        var output = System.Text.RegularExpressions.Regex.Replace(str,@"http://.+", "");  // первая замена
        var next = System.Text.RegularExpressions.Regex.Replace(output,@"[^\w\d\s]", ""); // вторая замена
        // проверяем на кол-во символов
        if (next.Length > 20 &&  next.Length < 55)
            contentfinal.Add(next); //добавляем результаты в "contentfinal" (список)
     }
}

Далее настраиваем A-parser и его взаимодействия с ЗенноПостером :

1) Создадим пресет "test" и поставим в него формат запроса "!$query"

tgdwpwbh.pv2_556725c43ac8a.png
2) Зарегаем яндекс аккаунтов, чтобы парсить директ
3) Установим прокси
4) Создадим post запрос на API

"parser" : "SE::Yandex;Direct:Frequency", - (парсер частотки) - http://a-parser.com/wiki/se-yandex-direct-frequency/
"password" : "", - пароль от учетки а-парсера
"preset" : "test", - прессет, где я указал антикапчу и юзать прокси / не юзать + формат запроса и и полученного результат.
"threads" : 4, - кол-во потоков.
"queries" : - наши запросы



e0xyvm5y.kqb_556726b241b95.png

[ более подробно по работе с api: http://a-parser.com/wiki/user-api/ ]​

Как видим в примере, нам вместо этих слов нужно подставить спарсенные слова с твиттера.

Для этого делаем сл.шаги:​

s68b8m0j.png


В ответе мы получаем:

HTML:
Развернуть Свернуть Копировать
{"success":1,"data":{"resultString":"\"!Скачать nfs carbon na windovs xp 3\": 0\n\"!Скачать сервер 152 с нужными плагинами для майнкрафт\": 0\n\"!Скачать все серии губка боб через торрент рус\": 0\n\"!Trolhappy скачать для в вконтакте смайлы\": 0\n","logs":{"1":{"1":[[0,1432825525,"Parser SE::Yandex::Direct::Frequency::0 parse query \"!Скачать nfs carbon na windovs xp 3\""],[0,1432825525,"Wait for proxy"],[0,1432825525,"Use proxy socks://91.214.71.16:7103"],[0,1432825525,"GET(1): https://direct.yandex.com/public?cmd=ajaxGetSuggestion&csrf_token=&geo=225&get_stat=1&promo=spros&srcPhrases=%22!%D0%A1%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C%20nfs%20carbon%20na%20windovs%20xp%203%22 - 200 OK (0.11 KB)"],[0,1432825525,"Parse response: 1"],[3,1432825525,1],[0,1432825527,"Thread complete work"]]},"0":{"1":[[0,1432825525,"Parser SE::Yandex::Direct::Frequency::0 parse query \"!Скачать сервер 152 с нужными плагинами для майнкрафт\""],[0,1432825525,"Wait for proxy"],[0,1432825525,"Use proxy http://185.31.160.178:7073"],[0,1432825526,"GET(1): https://direct.yandex.com/public?cmd=ajaxGetSuggestion&csrf_token=&geo=225&get_stat=1&promo=spros&srcPhrases=%22!%D0%A1%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%20152%20%D1%81%20%D0%BD%D1%83%D0%B6%D0%BD%D1%8B%D0%BC%D0%B8%20%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%20%D0%B4%D0%BB%D1%8F%20%D0%BC%D0%B0%D0%B9%D0%BD%D0%BA%D1%80%D0%B0%D1%84%D1%82%22 - 200 OK (0.16 KB)"],[0,1432825526,"Parse response: 1"],[3,1432825526,1],[0,1432825527,"Thread complete work"]]},"3":{"1":[[0,1432825525,"Parser SE::Yandex::Direct::Frequency::0 parse query \"!Скачать все серии губка боб через торрент рус\""],[0,1432825525,"Wait for proxy"],[0,1432825525,"Use proxy http://62.76.75.165:7142"],[0,1432825527,"GET(1): https://direct.yandex.com/public?cmd=ajaxGetSuggestion&csrf_token=&geo=225&get_stat=1&promo=spros&srcPhrases=%22!%D0%A1%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C%20%D0%B2%D1%81%D0%B5%20%D1%81%D0%B5%D1%80%D0%B8%D0%B8%20%D0%B3%D1%83%D0%B1%D0%BA%D0%B0%20%D0%B1%D0%BE%D0%B1%20%D1%87%D0%B5%D1%80%D0%B5%D0%B7%20%D1%82%D0%BE%D1%80%D1%80%D0%B5%D0%BD%D1%82%20%D1%80%D1%83%D1%81%22 - 200 OK (0.15 KB)"],[0,1432825527,"Parse response: 1"],[3,1432825527,1],[0,1432825527,"Thread complete work"]]},"2":{"1":[[0,1432825525,"Parser SE::Yandex::Direct::Frequency::0 parse query \"!Trolhappy скачать для в вконтакте смайлы\""],[0,1432825525,"Wait for proxy"],[0,1432825525,"Use proxy http://94.142.142.52:7272"],[0,1432825527,"GET(1): https://direct.yandex.com/public?cmd=ajaxGetSuggestion&csrf_token=&geo=225&get_stat=1&promo=spros&srcPhrases=%22!Trolhappy%20%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C%20%D0%B4%D0%BB%D1%8F%20%D0%B2%20%D0%B2%D0%BA%D0%BE%D0%BD%D1%82%D0%B0%D0%BA%D1%82%D0%B5%20%D1%81%D0%BC%D0%B0%D0%B9%D0%BB%D1%8B%22 - 200 OK (0.14 KB)"],[0,1432825527,"Parse response: 1"],[3,1432825527,1],[0,1432825527,"Thread complete work"]]}}}}


После обработки:

HTML:
Развернуть Свернуть Копировать
"!Скачать nfs carbon na windovs xp 3": 0
"!Скачать сервер 152 с нужными плагинами для майнкрафт": 0
"!Скачать все серии губка боб через торрент рус": 0
"!Trolhappy скачать для в вконтакте смайлы": 0


ИТОГО:
1) Запускаем а-парсер на серваке
2) Закцикливаем парсер на 10 попыток (раз в 6 сек)
3) Ставим шаблон на планировщик "1 запуск - раз в минуту"


На выходе получаем более +- 50к кеев в сутки по слову "скачать" с прочеканной частоткой".

Многие меня спросят.. ДЫК ЭТО МОЖНО И НА ЗЕНКИ СДЕЛАТЬ!!!?
А ответ на вопрос (почему мы вообще подключили А-парсер?) ждите в 3 части моей статьи по а-парсеру :dz:

[это был только разогрев]....


Скачать шаблон: https://yadi.sk/d/JL6_DLJQgvj8p




zr2l10v6.png


1) Идем сюда - http://json2csharp.com/
2) Вставляем наш JSON - http://pastebin.com/xvAZynYL
3) Получаем структурированный класс на разбор JSON

HTML:
Развернуть Свернуть Копировать
public class LastSeen
{
    public int time { get; set; }
    public int platform { get; set; }
}

public class Response
{
    public int uid { get; set; }
    public string first_name { get; set; }
    public string last_name { get; set; }
    public int online { get; set; }
    public string home_phone { get; set; }
    public string facebook { get; set; }
    public string facebook_name { get; set; }
    public string instagram { get; set; }
    public LastSeen last_seen { get; set; }
    public string online_app { get; set; }
    public int? online_mobile { get; set; }
    public string twitter { get; set; }
    public string skype { get; set; }
    public int? hidden { get; set; }
    public string livejournal { get; set; }
}

public class RootObject
{
    public List<Response> response { get; set; }
}

4) Выкидываем ненужные параметры и обворачиваем все в namespace JSOND (для подключение нашего класса из общего кода в using)

Код:
Развернуть Свернуть Копировать
namespace JSOND
{

public class Response
{
    public int uid { get; set; }
    public string first_name { get; set; }
    public string last_name { get; set; }
    public int online { get; set; }
}

public class RootObject
{
    public List<Response> response { get; set; }
}


}

5) Подключаем библиотеку Newtonsoft.Json.dll (скачать)


LmG7aypsNWwJml.jpg


7) Прописываем код из пункта "4", в новую фичу зеннопостера - "ОБЩИЙ КОД" . Она позволяет нам переносить все классы кода , заменяя прежние костыли (генераций dll с нашими классами в Devel Studio).

+ Добавляем в USING

using Newtonsoft.Json;
using JSOND;

8-) Добавляем этот код в c# сниппет

Код:
Развернуть Свернуть Копировать
string json = project.Variables["json"].Value;  // тут наш json
var table = project.Tables["table"]; // Имя таблицы
RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);

//перебираем все елементы обьекта
for (int i = 0; i < obj.response.Count; i++)
{
    //формируем строку
    string str = String.Format("{0};{1};{2};{3}", obj.response[i].uid, obj.response[i].first_name, obj.response[i].last_name, obj.response[i].online);
    //{0};{1};{2};{3}  и obj.response[i].uid, obj.response[i].first_name, obj.response[i].last_name, obj.response[i].online  можно менять (это наш рабочий черновик)
    table.AddRow(str);
    //пишем в таблицу строку
}

return 1;


s68b8m0j.png

Как итог, все данные записались в таблицу. Кто хорошо знаком с c# .. может сразу Replace-ом заменить 1/0 - (оффлайн , онлайн). И дальнейшие манипуляции.

Кто еще не работает с новым зеннопостером, то ему подойдет этот вариант разбора JSON.
 
Номер конкурса статей
  1. Третий конкурс статей
Тема статьи
  1. Парсинг

Вложения

  • os2wl2q5.png
    os2wl2q5.png
    479,8 KB · Просмотры: 1 179
Последнее редактирование:
Изначально я не планировал этот пункт в моей конкурсной статье.. Думал, что всем все понятно про post запрос еще с первой статьи (C# Sharp vs WebBrowser).
НО!!! как оказалось, многие не до конца разобрались...

Давайте начнем


За пример будет взят сервис фрихостинга - http://www.webservis.ru/registr.phtml .

Почему?

1) Рега не сложная (идеальный подопытный)!
2) Есть своя фишка (капча наоборот ) - обойдем это c# сниппетом .
3) Быстро кидает подтверждение на почту ( хорошо работает с mail.ru) .



Скачать шаблон можно тут.
 
Формат запроса в апарсере не верно задан. Вместо такой конструкции
Код:
Развернуть Свернуть Копировать
"!$query"
на до использовать конструктор результатов: есть спец функция "Add ! before each word", которая подставляет "!" перед каждым словом.
 
Формат запроса в апарсере не верно задан. Вместо такой конструкции
Код:
Развернуть Свернуть Копировать
"!$query"
на до использовать конструктор результатов: есть спец функция "Add ! before each word", которая подставляет "!" перед каждым словом.

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

Там будет:

  • Парсим 100к ключевых слов через гугл
  • Извлекаем из серпа гугла ссылки * из пункта 1
  • Через сторонний сервис парсим чистенькие статьи по ссылкам из пункта 2
  • Определяем релевантность статьи к запросу через API мегаиндекса (ее оптимизация)
А от куда возьмем кеи для парсинаг? Догадайтесь сами :D
 
работа с джейсоном
тоже самое без сторонних либ (System.Web.Extentions есть у всех)
C#:
Развернуть Свернуть Копировать
var json = project.Variables["json"].Value;
var keys = "first_name,last_name,online".Split(',');
var djson = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<dynamic>(json);
return string.Join("\r\n", ((IEnumerable<dynamic>)djson["response"]).Select(d=>string.Join(";", keys.Select(k=>d[k]))));
для выбора других параметров нужно поменять только 2-ую строчку
 
Последнее редактирование:
работа с джейсоном
тоже самое без сторонних либ (System.Web.Extentions есть у всех)
Код:
Развернуть Свернуть Копировать
var json = project.Variables["json"].Value;
var keys = "first_name,last_name,online".Split(',');
var djson = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<dynamic>(json);
return string.Join("\r\n", ((IEnumerable<dynamic>)djson["response"]).Select(d=>string.Join(";", keys.Select(k=>d[k]))));

Тоже отличный вариант :ay:

Я больше хотел продемонстрировать новые возможности "общего кода"))
 
Я больше хотел продемонстрировать новые возможности "общего кода"))
Самой удачно демонстрацией оwn кода будет какая нибудь минипрожка записаная в классы, реализованая в кубике и зашифрованая в подпроект )))
 
Самой удачно демонстрацией оwn кода будет какая нибудь минипрожка записаная в классы, реализованая в кубике и зашифрованая в подпроект )))
Это уже оставим 7make . Я доверяю такой важный бета-тест только ему :D
 
up: подправил некоторые картинки (а то ФШ криво сохранил).
 
работа с джейсоном
тоже самое без сторонних либ (System.Web.Extentions есть у всех)
Код:
Развернуть Свернуть Копировать
var json = project.Variables["json"].Value;
var keys = "first_name,last_name,online".Split(',');
var djson = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<dynamic>(json);
return string.Join("\r\n", ((IEnumerable<dynamic>)djson["response"]).Select(d=>string.Join(";", keys.Select(k=>d[k]))));
для выбора других параметров нужно поменять только 2-ую строчку
Прописал using System.Web.Extentions;
Но у меня вываливается ошибка при исполнении кода:
2015-05-29_13-33-15.jpg


Пробовал добавлять и ссылки из GAC на System.Web.Extentions и System.Web (хотя не уверен, что это было необходимо).
Вылетает такая же ошибка. В чем косяк?
 
System.Web.Extentions
lexone а что в этих кеях такого класного?)
я это тот же пустухов я софтом за день по 2 ляма чекал на частотку
Очень много попадается интересных экземпляров, которые снимаются с ТДС и опять идут в твиттер на повторную индексацию..
+ парсю еще саму ссылку дора и граблю все кеи (за недельку до 100к можно насобирать).

Прописал using System.Web.Extentions;
Но у меня вываливается ошибка при исполнении кода:
Посмотреть вложение 8477

Пробовал добавлять и ссылки из GAC на System.Web.Extentions и System.Web (хотя не уверен, что это было необходимо).
Вылетает такая же ошибка. В чем косяк?

Как тут добавляй http://joxi.ru/LmG7aypsNWwJml.jpg , только System.Web.Extentions.
 
У меня такой папки нет.
И файла System.Web.Extentions.dll нет в директории Зенки (прошерстил поиском).
Билд: 5.4.3.0. Неужели несовместимо с моей версией? :(
у него демо , потому и нет , создай директорию.
 
из GAC добавлять + using System.Web.Extentions;
Пробовал уже:
Прописал using System.Web.Extentions;
Но у меня вываливается ошибка при исполнении кода:
Посмотреть вложение 8477

Пробовал добавлять и ссылки из GAC на System.Web.Extentions и System.Web (хотя не уверен, что это было необходимо).
Вылетает такая же ошибка. В чем косяк?

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

Там будет:

  • Парсим 100к ключевых слов через гугл
  • Извлекаем из серпа гугла ссылки * из пункта 1
  • Через сторонний сервис парсим чистенькие статьи по ссылкам из пункта 2
  • Определяем релевантность статьи к запросу через API мегаиндекса (ее оптимизация)
А от куда возьмем кеи для парсинаг? Догадайтесь сами :D
ждал эту часть или уже не ждать до 4 конкурса?
 
  • Спасибо
Реакции: LightWood
работа с джейсоном
тоже самое без сторонних либ (System.Web.Extentions есть у всех)
C#:
Развернуть Свернуть Копировать
var json = project.Variables["json"].Value;
var keys = "first_name,last_name,online".Split(',');
var djson = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<dynamic>(json);
return string.Join("\r\n", ((IEnumerable<dynamic>)djson["response"]).Select(d=>string.Join(";", keys.Select(k=>d[k]))));
для выбора других параметров нужно поменять только 2-ую строчку
Прописал using System.Web.Extentions;
Но у меня вываливается ошибка при исполнении кода:
Посмотреть вложение 8477

Пробовал добавлять и ссылки из GAC на System.Web.Extentions и System.Web (хотя не уверен, что это было необходимо).
Вылетает такая же ошибка. В чем косяк?
из GAC добавлять + using System.Web.Extentions;
Возвращаясь к теме:
В чем моя ошибка, почему не работает?
error.jpg
 
оставь только system.web (или отпиши мне по контактам.. в тимке глянем).
 
Реализация понятна, не понятно зачем нужны эти ключевики из Твиттера?
Если просто нужны НЧ ключи для дорвея, то сейчас все скрипты их сами генерируют.
А если дорвей самописный, то собрать ключи проще средствами инструментов Гугла, Яндекса, да и софта полно где это можно сделать за 5 минут.
 
Чет не получается у меня json в таблицу перевести.
Вроде делаю все как надо а вот такая ошибка
Тип Время Сообщение
15:06:01 Компиляция кода Ошибка в действии "CS0246" "The type or namespace name 'RootObject' could not be found (are you missing a using directive or an assembly reference?)". [Строка: 2; Cтолбец: 48]

Скиньте пожалуйста рабочий проект с json
 
Последнее редактирование:

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)