- Регистрация
- 21.01.2018
- Сообщения
- 227
- Благодарностей
- 339
- Баллы
- 63
В конкурсной статье из 3 конкурса статей описывается использование и приводится пример шаблонов.
В C# столкнулся с проблемой синтаксиса, по этому собственно и создал тему. Для примера использовал шаблон gplusparser2 где из подсписка беруться ссылки в потоки и скачивается изображение, шаблон спустя столько лет работает.
А также шаблона ahrefs.com где регексом ищется данные на странице и в зависимости от этого кидаются в список.
Подскажите, как сделать так чтобы использовало список с линками в виде https://vk.com/idтутid как в первом выражении и искало regex
и если его найдет кидало следующее значение найденное следующим regex
в Good если не найдет в Bad
В 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);
}
Код:
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());
}
Код:
(?<=<div\ class="profile_time_lv">).*?(?=</div>)
Код:
(?<=<h2\ class="page_name">).*?(?=</h2>)
Последнее редактирование: