آیا تا کنون اطلاعاتی را از چند وبسایت کپیبرداری و ذخیره کردهاید؟ احتمالا پس از آن به جمع آوری سریعتر اطلاعات درباره یک موضوع از همه یا برخی وبسایتها نیز اندیشیدهاید! دادهها مانند دریایی وسیع هستند و جمعآوری همه آنها با روش دستی امکان پذیر نیست؛ اما یکی از بهترین روشها برای دستیابی سریع و وسیع به اطلاعات مورد نیازتان وب اسکرپینگ (Web Scraping) است که در ادامه به بررسی آن، کاربردها و مزایایش میپردازیم.
وب اسکرپینگ چیست؟
وب اسکرپینگ که از آن با عنوان جستجو گر دادهها نیز یاد میشود، در زبان فارسی معنی خراش دادن وب را میدهد. کپیبرداری و ذخیره دستی اطلاعات که حتمی تا کنون انجام دادهاید یک نمونه بسیار کوچک و ساده از وب اسکرپینگ است. به طور کلی به استخراج دادههای مورد نیاز از تمام یا برخی از وبسایتها به صورت خودکار با کمک روشهای کامپیوتری و نرمافزارها، وب اسکرپینگ گفته میشود.سی شارپ (و به طور کلی دات نت)، تمامیابزارها و کتابخانههای لازم برای پیادهسازی وب اِسکرِپینگ را فراهم و به شما کمک میکند تا به سرعت پروژه Scraper خود را پیادهسازی و دادههای مورد نظر را جمعآوری کنید.
امروزه، شرکتهای زیادی هستند که از مزایای دادههای جمعآوری شده از وب، بهره میگیرند. سی شارپ، یکی از مناسبترین زبانهای برنامهنویسی برای پیاده سازی Web Scraping است.
تنظیم و راهاندازی محیط برنامه نویسی وب اسکرپینگ با سی شارپ
گام اول : نصب کتابخانه Html Agility Pack و افزونه CSS Selector مربوط به آن
dotnet add package HtmlAgilityPack
dotnet add package HtmlAgilityPack.CssSelectors
نکته مهم : صدور دادهها در قالب CSV با CsvHelper
dotnet add package CsvHelper
گام دوم : استخراج داده از عناصر HTML
using HtmlAgilityPack;
using CsvHelper;
using System.Globalization;
namespace HinasoWebScraper
{
public class Program
{
// defining a custom class to store the scraped data
public class PokemonProduct
{
public string? Url { get; set; }
public string? Image { get; set; }
public string? Name { get; set; }
public string? Price { get; set; }
}
public static void Main()
{
// creating the list that will keep the scraped data
var pokemonProducts = new List<PokemonProduct>();
// creating the HAP object
var web = new HtmlWeb();
// visiting the target web page
var document = web.Load("https://scrapeme.live/shop/");
// getting the list of HTML product nodes
var productHTMLElements = document.DocumentNode.QuerySelectorAll("li.product");
// iterating over the list of product HTML elements
foreach (var productHTMLElement in productHTMLElements)
{
// scraping logic
var url = HtmlEntity.DeEntitize(productHTMLElement.QuerySelector("a").Attributes["href"].Value);
var image = HtmlEntity.DeEntitize(productHTMLElement.QuerySelector("img").Attributes["src"].Value);
var name = HtmlEntity.DeEntitize(productHTMLElement.QuerySelector("h2").InnerText);
var price = HtmlEntity.DeEntitize(productHTMLElement.QuerySelector(".price").InnerText);
var pokemonProduct = new PokemonProduct() { Url = url, Image = image, Name = name, Price = price };
pokemonProducts.Add(pokemonProduct);
}
// crating the CSV output file
using (var writer = new StreamWriter("pokemon-products.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
// populating the CSV file
csv.WriteRecords(pokemonProducts);
}
}
}
}