Inserito gestione parallela tramite service

- Inserito il servizio di Crawler che gestisce la coda dei link
- Test inserendo un unico link di partenza e 9 thread paralleli
- Problema che scarica più colte alcuni file.
- DA RIVEDERE ABILITAZIONE DEL LINK per evitare doppioni

ToDo:
- Aggiungere gestione parallela
- Aggiungere analisi di quanto downloadato per estrarre altri link e proseguire con lo skraping
- Aumentare i log in modo da tenere traccia di quanto succede
- Animare la UI in modo da far capire cosa succede
This commit is contained in:
CSiCoAlm committed 2025-12-26 20:19:02 +01:00
1 parent 3033880fd9
commit e8f18a173b
3 files changed
+66 -34

No files matched your search

+20
View File
@@ -6,6 +6,7 @@ using System.Runtime.Remoting.Messaging;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using A69WD.Service;
namespace A69WD.Net {
public class cLink_A69 : iLink {
@@ -70,7 +71,26 @@ namespace A69WD.Net {
return false;
}
}
public static bool InsertStartLink(Service_Crawler service) {
//int i = 1;
//try {
// foreach (string cat in categorie) {
// string url = LinkIdxBase.Replace("{Categoria}", cat).Replace("{ID}", i.ToString());
// string name = string.Format("_A69_{0}_{1}.html", cat, i.ToString("0000"));
// service.EnqueueUrl(new cLink_A69(url, name));
// }
// return true;
//} catch (Exception ex) {
// Logger.Error("Errore inserendo A69 Start Link - " + ex.Message);
// return false;
//}
string url = LinkIdxBase.Replace("{Categoria}", "trio").Replace("{ID}", "1");
string name = "_A69_trio_0001.html";
service.EnqueueUrl(new cLink_A69(url, name));
return true;
}
}//class cLink_A69
+20 -23
View File
@@ -7,6 +7,8 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using A69WD.Net;
using A69WD.Site;
@@ -17,10 +19,10 @@ namespace A69WD.Service {
private Thread _workerThread;
// Coda thread-safe di URL da scaricare
private readonly BlockingCollection<string> _urlQueue = new BlockingCollection<string>(new ConcurrentQueue<string>());
private readonly BlockingCollection<iLink> _urlQueue = new BlockingCollection<iLink>(new ConcurrentQueue<iLink>());
// Semaforo per limitare il numero massimo di download simultanei
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1);
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(99);
// Contatori
private int _inCorso = 0;
@@ -28,7 +30,7 @@ namespace A69WD.Service {
private int _errori = 0;
// HttpClient autenticato (fornito da AuthService)
private HttpClient _client;
private iSiteType _site;
public Service_Crawler(Label lblInCorso) {
@@ -42,10 +44,10 @@ namespace A69WD.Service {
// Riferimenti ai controlli UI per aggiornare i contatori e la progress bar
private readonly Label _lblInCorso;
private readonly Label _lblCompletati;
private readonly Label _lblDaFare;
private readonly Label _lblErrori;
private readonly ProgressBar _progressBar;
//private readonly Label _lblCompletati;
//private readonly Label _lblDaFare;
//private readonly Label _lblErrori;
//private readonly ProgressBar _progressBar;
@@ -54,8 +56,8 @@ namespace A69WD.Service {
/// <summary>
/// Avvia il thread worker che consuma la coda di URL.
/// </summary>
public void StartWorker(HttpClient client) {
_client = client;
public void StartWorker(iSiteType site) {
_site = site;
_workerThread = new Thread(ProcessQueue) { IsBackground = true };
_workerThread.Start();
}
@@ -70,8 +72,8 @@ namespace A69WD.Service {
/// <summary>
/// Aggiunge un URL alla coda FIFO.
/// </summary>
public void EnqueueUrl(string url) {
_urlQueue.Add(url);
public void EnqueueUrl(iLink link) {
_urlQueue.Add(link);
UpdateCounters();
}
@@ -79,28 +81,23 @@ namespace A69WD.Service {
/// Thread worker: consuma la coda ed avvia task di download.
/// </summary>
private void ProcessQueue() {
foreach (var url in _urlQueue.GetConsumingEnumerable()) {
foreach (iLink link in _urlQueue.GetConsumingEnumerable()) {
Logger.Information("ProcessQueue: Start url " + link.FileName);
Task.Run(async () => {
Interlocked.Increment(ref _inCorso);
UpdateCounters();
await _semaphore.WaitAsync();
try {
// Scarica contenuto della pagina
var html = await _client.GetStringAsync(url);
Interlocked.Increment(ref _completati);
// Salvo il file downloadato
System.IO.StreamWriter sw = new System.IO.StreamWriter("A69_Idx_altro_" + _completati.ToString("000") + ".html", false, Encoding.UTF8);
sw.Write(html);
Logger.Information($"Scaricato {url} ({html.Length} bytes)");
List<iLink> urls = await _site.CrawlPageAsync(link);
Logger.Information("ProcessQueue: end url " + link.FileName + " - URL trovati: " + urls.Count.ToString("000"));
foreach (iLink url in urls) { _urlQueue.Add(url); }
} catch (Exception ex) {
Interlocked.Increment(ref _errori);
Logger.Error($"Errore su {url}: {ex.Message}");
Logger.Error($"Errore su {link}: {ex.Message}");
} finally {
Interlocked.Decrement(ref _inCorso);
Interlocked.Increment(ref _completati);
_semaphore.Release();
UpdateCounters();
}
+26 -11
View File
@@ -82,20 +82,31 @@ namespace A69WD {
// i++;
// }
// Inserisco i link iniziali sulla coda dei download:
if (!cLink_A69.InsertStartLink(_urlQueue)) {
// // Inserisco i link iniziali sulla coda dei download:
// if (!cLink_A69.InsertStartLink(_urlQueue)) {
// lblST.Text = "Inserimento A69 start link fault.";
// return;
// }
// lblST.Text = "In coda vi sono: " + _urlQueue.Count.ToString() + " url.";
//
// // Test estrazione link dal primo indice:
// iLink link = new cLink_A69("https://www.annunci69.it/racconti-erotici/racconti_lista.php?genere=altro&pagina=1", "Idx_altro_1.html");
// Logger.Information("Start url " + link.FileName);
// List<iLink> urls = await siteA69.CrawlPageAsync(link);
// Logger.Information(" end url " + link.FileName + " - URL trovati: " + urls.Count.ToString("000"));
// foreach (iLink url in urls) { _urlQueue.Add(url); }
// lblST.Text = "In coda vi sono: " + _urlQueue.Count.ToString() + " url.";
// Preparo il servizio
service = new Service_Crawler(lblST);
// Inserisco i link iniziali nella coda
if (!cLink_A69.InsertStartLink(service)) {
lblST.Text = "Inserimento A69 start link fault.";
return;
}
lblST.Text = "In coda vi sono: " + _urlQueue.Count.ToString() + " url.";
// Test estrazione link dal primo indice:
iLink link = new cLink_A69("https://www.annunci69.it/racconti-erotici/racconti_lista.php?genere=altro&pagina=1", "Idx_altro_1.html");
Logger.Information("Start url " + link.FileName);
List<iLink> urls = await siteA69.CrawlPageAsync(link);
Logger.Information(" end url " + link.FileName + " - URL trovati: " + urls.Count.ToString("000"));
foreach (iLink url in urls) { _urlQueue.Add(url); }
lblST.Text = "In coda vi sono: " + _urlQueue.Count.ToString() + " url.";
// avvio il servizio
service.StartWorker(siteA69);
}
@@ -114,6 +125,10 @@ namespace A69WD {
private void btnClose_Click(object sender, EventArgs e) {
//if (engine.Stop()) this.Close();
// fermo il servizio
if (service != null) service.StopWorker();
this.Close();
}