[SOLVED] С# Параллельные запросы помощь с синтаксисом.

Dorian_Gray

Client
Регистрация
21.01.2018
Сообщения
227
Благодарностей
339
Баллы
63
В конкурсной статье из 3 конкурса статей описывается использование и приводится пример шаблонов.
В C# столкнулся с проблемой синтаксиса, по этому собственно и создал тему. Для примера использовал шаблон gplusparser2 где из подсписка беруться ссылки в потоки и скачивается изображение, шаблон спустя столько лет работает.

Код:
var tmplist = project.Lists["tmplist"].ToList();
project.Lists["tmplist"].Clear();

var imgdir = project.Directory+"\\img";
if (!System.IO.Directory.Exists(imgdir))
    System.IO.Directory.CreateDirectory(imgdir);

var outlist = new List<string>();
try{
    System.Threading.Tasks.Parallel.ForEach(tmplist, data => {
        var arr = data.Split('|');
        if(arr.Length < 2)
            return;
        string id = data.Split('|')[0];
        string url = data.Split('|')[1];
        var pathtosave = imgdir+"\\"+id+".jpg";
        if(System.IO.File.Exists(pathtosave))
            return;
        byte [] bytes = null;
        var wc = new System.Net.WebClient();
        try{
            bytes = wc.DownloadData(url);
        }catch(System.Net.WebException we){
            project.SendWarningToLog(we.Message);
        }
        finally{
            wc.Dispose();
        }
        if(bytes == null)
            return;
        if(bytes.Length < 512){
            project.SendWarningToLog("small data length: "+bytes.Length.ToString());
            return;
        }
        System.IO.File.WriteAllBytes(pathtosave, bytes);
        outlist.Add(data);
    });
}catch(Exception e){
    throw new Exception(e.Message + "\r\n"+e.StackTrace);
}
А также шаблона ahrefs.com где регексом ищется данные на странице и в зависимости от этого кидаются в список.
Код:
int threads = int.Parse(project.Variables["threads"].Value);

int tries = 5;
int timeout = 60000;
string url = project.Variables["url"].Value;
string filter = project.Variables["filter"].Value;
var path = project.Variables["path"].Value;
int start_page = int.Parse(project.Variables["start_page"].Value);
int nextpage = start_page + threads;
project.Variables["start_page"].Value = nextpage.ToString();

var pages = new List<object>().Select(t => new { Page = default(int), Proxy = default(string) }).ToList();
var proxy_list = project.Lists["proxy_list"];
var proxy_list_cnt = proxy_list.Count;
for(int i=0; i < threads; i++){
    var proxy = "";
    if(proxy_list_cnt > i)
        proxy = proxy_list[i];
    var page = start_page + i;
    pages.Add(new {Page = page, Proxy = proxy});
}

var regex = new System.Text.RegularExpressions.Regex("(?<=<p>[^<]*?\\d+[^<]*?</p>[^<]*?</td>[^<]*?<td>[^<]*?<a[^\"]*?href=\")[^\"]+");
var regex2 = new System.Text.RegularExpressions.Regex("href=\"javascript:\\svoid\\(0\\);\">[^<]*?<span>\\s>");
var regex3 = new System.Text.RegularExpressions.Regex("(?<=href=\"javascript:\\svoid\\(0\\);\">)[\\d,]+(?=</a)");
List<int> emptypages = new List<int>();
List<string> rlist = new List<string>();

int lastpage = 0;
int extracted = 0;

System.Threading.Tasks.Parallel.ForEach(pages, p => {
    int _tries = tries;
    List<string> domains = null;
    var response = "";
    var page = p.Page;
    var proxy = p.Proxy;
    while(_tries-- > 0){
        response = ZennoPoster.HttpGet(url: url+page, proxy: proxy, Encoding:"UTF-8", Timeout: timeout);
        domains = regex.Matches(response).Cast<System.Text.RegularExpressions.Match>().Select(s=>s.Value).Where(s=>s!="").ToList();
        project.SendInfoToLog(domains.Count.ToString(), p.ToString());
        if(domains.Count > 0)
            break;
        new System.Threading.ManualResetEvent(false).WaitOne(2000);
    }
    if(domains.Count <= 0){
        emptypages.Add(page);
        return;
    }
    if(regex2.IsMatch(response)){
            var npage = int.Parse(regex3.Match(response).Value.Replace(",", ""));
            if(npage == page){
                lastpage = page;
                project.SendInfoToLog("endpage", page.ToString());
                rlist.AddRange(domains);
                extracted += domains.Count;
            }
    }
    else{
        rlist.AddRange(domains);
        extracted += domains.Count;
    }
});

if(lastpage > 0)
    project.Variables["last_page"].Value = lastpage.ToString();

System.IO.File.WriteAllText(path+".page", project.Variables["start_page"].Value);

project.Variables["extracted_cnt"].Value = (int.Parse(project.Variables["extracted_cnt"].Value)+extracted).ToString();
if(rlist.Count > 0)
    System.IO.File.AppendAllLines(path+".txt", rlist);

var emptypstr = "";
if(emptypages.Count > 0){
    emptypstr = "empty pages: "+string.Join(", ", emptypages.Select(s=>s.ToString()).ToArray())
                +"\r\nfirst empty page: "+emptypages.Min()+"\r\n";
}
if(lastpage > 0)
    emptypstr += "endpage: "+ lastpage.ToString()+"\r\n";
if(emptypstr != ""){
    emptypstr += "lastpage: "+ nextpage.ToString()+"\r\n";
    project.SendWarningToLog(emptypstr, true);
}
if(emptypages.Count > 0){
    int emin = emptypages.Min();
    if(lastpage != emin)
        throw new Exception("first empty page is not last page: "+emin.ToString()+" "+lastpage.ToString());
}
Подскажите, как сделать так чтобы использовало список с линками в виде https://vk.com/idтутid как в первом выражении и искало regex
Код:
(?<=<div\ class="profile_time_lv">).*?(?=</div>)
и если его найдет кидало следующее значение найденное следующим regex
Код:
(?<=<h2\ class="page_name">).*?(?=</h2>)
в Good если не найдет в Bad
 
Последнее редактирование:

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63

Dorian_Gray

Client
Регистрация
21.01.2018
Сообщения
227
Благодарностей
339
Баллы
63
(?<=<div\ class="profile_time_lv">).*?(?=</div>) если нашли что то 1 регексом на странице выполняем 2 регекс (?<=<h2\ class="page_name">).*?(?=</h2>) и значение 2 регекс кидаем в список Good ,
если 1 регексом ничего не нашли все равно выполняем 2 регекс, но теперь значение найденное 2 регекс кидаем в Bad
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Код:
var vkUrls = project.Lists["VkUrlList"];
int potoki = 10;//количество потоков
int c = vkUrls.Count;
Parallel.For(0, c, new ParallelOptions { MaxDegreeOfParallelism = potoki }, x =>     
{
    string url = string.Empty;
    lock(SyncObjects.ListSyncer)
    {
        url = vkUrls[0];
        vkUrls.RemoveAt(0);
    }
  string res = string.Empty;
    for(int i = 0; i < 3; i++)       
    {
               
       res = ZennoPoster.HttpGet(       
            url,         
            "",//proxy         
            "UTF-8",       
            ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody,       
            50000,       
            "",       
            project.Profile.UserAgent,       
            true,         
            3       
            );
           
               
        if(!string.IsNullOrEmpty(res))       
        {                     
            break;   
        }
               
    }


    string rgxres1 = new Regex(@"(?<=<div\ class=""profile_time_lv"">).*?(?=</div>)").Match(res).Value;
    string rgxres2 = new Regex(@"(?<=<h2\ class=""page_name"">).*?(?=</h2>)").Match(res).Value;

    lock(SyncObjects.ListSyncer)
    {
        if(string.IsNullOrEmpty(rgxres1))
        {
            project.Lists["Bad"].Add(rgxres2);
        }
        else
        {
            project.Lists["Good"].Add(rgxres2);
        }
    }
});
 
Последнее редактирование:
  • Спасибо
Реакции: dio-dev и Dorian_Gray

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Код выше подправил. В проекте нужно добавить - Директивы using и общий код - (на нижней панели, где списки добавляются) и дописать туда using System.Threading.Tasks;

и создать три списка - VkUrlList, Good, Bad.
 
  • Спасибо
Реакции: Dorian_Gray

photograph

Client
Регистрация
04.09.2015
Сообщения
11
Благодарностей
4
Баллы
3
почему в список пустые строки попадают?
 
Последнее редактирование:

Valery_Sh

Новичок
Регистрация
07.04.2019
Сообщения
3
Благодарностей
0
Баллы
1
Код выше подправил. В проекте нужно добавить - Директивы using и общий код - (на нижней панели, где списки добавляются) и дописать туда using System.Threading.Tasks;

и создать три списка - VkUrlList, Good, Bad.
Здравствуйте, нужна ваша помощь в создании сниппета
 

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