- Регистрация
- 03.05.2016
- Сообщения
- 773
- Благодарностей
- 517
- Баллы
- 93
Написал парсинг под свои задачи, получилось внутри цикла еще 2 цикла, уверен что логика не совсем верная, подскажите как сделать лучше.
C#:
IZennoList lstID = project.Lists["ID"];
string strApiKay = 12345671234567;
string strGroupID = 123213123;
int intAgeStart = 25;
int intAgeFrom = intAgeStart;
int intAgeStep = 6;
int intAgeStop = 49;
//Цикл для смены intAgeFrom intAgeTo
//* не совсем верная логика, т.к. в цикле do while при условиие Count >= 1000 intAgeTo уменьшается на 1, получаем дубли (использую решение: удаление дублей из списка), хочется получить более правильное решение
for (int i = intAgeFrom; i <= intAgeStop-intAgeStep; i+=intAgeStep) {
intAgeFrom = i;
int intAgeTo = intAgeFrom + intAgeStep;
//Делаем гет запрос на массив данных
int intCount;
string strGetHttpArr;
do
{
string strGet = ("https://api.vk.com/method/users.search?count=1000&country=1&sex=2&group_id=" + strGroupID +"&age_from=" + intAgeFrom + "&age_to=" + intAgeTo + "&birth_day=01&birth_month=01&fields=can_write_private_message,followers_count,last_seen&v=5.120&access_token=" + strApiKay);
string strGetHttp = ZennoPoster.HttpGet(strGet, "","UTF-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly);
intCount = int.Parse(Regex.Match(strGetHttp, @"(?<=""count"":).*?(?=,"")").Value);
project.SendInfoToLog("", strGet, true);
project.SendInfoToLog("", strGetHttp, true);
intAgeTo--;
strGetHttpArr = strGetHttp;
} while (intCount >= 1000);
//Добавляем ID по условия can_write_private_message=1 в список
if (Regex.IsMatch(strGetHttpArr, "\\{\"first_name\".*?}"))
foreach (var r in Regex.Matches(strGetHttpArr, "\\{\"first_name\".*?}"))
if (Regex.IsMatch(r.ToString(), "(?<=\"can_write_private_message\":)1.*?(?=,)"))
lstID.Add(Regex.Match(r.ToString(), "(?<=\"id\":).*?(?=,)").Value);
}
//удаляем дубли из списка
List<string> lstDistinct = lstID.Distinct().ToList();
lstID.Clear();
lstID.AddRange(lstDistinct);
project.SendInfoToLog("", "End", true);