Thứ Ba, 23 tháng 4, 2019

IronWebScraper Hướng dẫn Quét web trong C #

Đăng Bởi: Admin - tháng 4 23, 2019 - 0 Bình Luận

https://ironsoftware.com/csharp/webscraper/tutorials/webscraping-in-c-sharp/#scroll-helloscraper-our-first-ironwebscraper-sample

Cách quét dữ liệu từ các trang web trong C #

Webscraping chưa bao giờ là một nhiệm vụ đơn giản, không có khung thống trị để sử dụng trong môi trường lập trình C # hoặc .Net.  Iron Web Scraper đã được tạo ra để thay đổi điều này
C # PDF HTML
Ngày 8 tháng 8 năm 2018 bởi Ahmed Aboelmagd

Cách quét dữ liệu từ các trang web trong C #

IronWebscraper là một Thư viện .Net để quét web, trích xuất dữ liệu web và phân tích nội dung web. Đây là một thư viện dễ sử dụng có thể được thêm vào các dự án Microsoft Visual Studio để sử dụng trong phát triển và sản xuất.
IronWebscraper có nhiều tính năng và khả năng độc đáo như kiểm soát các trang, đối tượng, phương tiện được phép và bị cấm, v.v. Nó cũng cho phép quản lý nhiều danh tính, bộ đệm web và nhiều tính năng khác mà chúng tôi sẽ thảo luận trong tài liệu hướng dẫn này.

Khán giả mục tiêu

Hướng dẫn này nhắm đến các nhà phát triển phần mềm với các kỹ năng lập trình cơ bản hoặc nâng cao, những người muốn xây dựng và triển khai các giải pháp cho khả năng cạo nâng cao (quét trang web, thu thập và trích xuất dữ liệu trang web, phân tích nội dung trang web, thu hoạch web).

Kỹ năng cần có

  1. Các nguyên tắc cơ bản cơ bản của lập trình với các kỹ năng sử dụng một trong các ngôn ngữ Lập trình Microsoft như C # hoặc VB.NET
  2. Hiểu biết cơ bản về Công nghệ web (HTML, JavaScript, JQuery, CSS, v.v.) và cách chúng hoạt động
  3. Kiến thức cơ bản về Bộ chọn DOM, XPath, HTML và CSS

Công cụ

  1. Microsoft Visual Studio 2010 trở lên
  2. Tiện ích mở rộng dành cho nhà phát triển web dành cho trình duyệt, chẳng hạn như trình kiểm tra web cho Chrome hoặc Fireorms cho Firefox

Tại sao phải cạo? (Lý do và khái niệm)

Nếu bạn muốn xây dựng một sản phẩm hoặc giải pháp có khả năng:
  1. Trích xuất dữ liệu trang web
  2. So sánh nội dung, giá cả, tính năng, vv từ nhiều trang web
  3. Quét và lưu trữ nội dung trang web
Nếu bạn có một hoặc nhiều lý do từ những điều trên, thì IronWebscraper là một thư viện tuyệt vời để phù hợp với nhu cầu của bạn

Làm thế nào để cài đặt IronWebScraper?

Sau khi bạn tạo một dự án mới (Xem Phụ lục A), bạn có thể thêm thư viện IronWebScraper vào dự án của mình bằng cách tự động chèn thư viện bằng NuGet hoặc cài đặt DLL thủ công.

Cài đặt bằng NuGet

Để thêm thư viện IronWebScraper vào dự án của chúng tôi bằng NuGet, chúng tôi có thể thực hiện bằng giao diện trực quan (Trình quản lý gói NuGet) hoặc bằng lệnh bằng Bảng điều khiển quản lý gói.

Sử dụng Trình quản lý gói NuGet

  1. Sử dụng chuột -> nhấp chuột phải vào tên dự án -> Chọn quản lý Gói NuGet
  2. Từ tab lông mày -> tìm kiếm IronWebScraper -> Cài đặt
  3. Nhấp vào Ok
  4. Và chúng ta đã xong

Sử dụng Bảng điều khiển gói NuGet

  1. Từ các công cụ -> Trình quản lý gói NuGet -> Bảng điều khiển quản lý gói
  2. Chọn dự án thư viện lớp làm dự án mặc định
  3. Chạy lệnh -> Cài đặt gói IronWebScraper

Cài đặt thủ công

  1. Tới www.ironsoftware.com
  2. Nhấp vào IronWebScraper hoặc truy cập Trang của nó trực tiếp bằng URL https://ironsoftware.com/csharp/webscraper
  3. Nhấp vào Tải xuống DLL.
  4. Giải nén tập tin nén
  5. Trong studio trực quan, nhấp chuột phải vào dự án -> thêm -> tham khảo -> duyệt
  6. Chuyển đến thư mục được giải nén -> bin -> chọn Franklin IronWebScraper.
  7. Và thế là xong!

HelloScraper - Mẫu IronWebScraper đầu tiên của chúng tôi

Như thường lệ, chúng tôi sẽ bắt đầu triển khai Ứng dụng Hello Scraper để thực hiện bước đầu tiên bằng cách sử dụng IronWebScraper.
  • Chúng tôi đã tạo một Ứng dụng Bảng điều khiển mới với tên là Iron IronScScetterSample

Các bước để tạo mẫu IronWebScraper

  1. Tạo một thư mục và đặt tên cho nó
  2. Sau đó, một lớp mới và đặt tên là
  3. Thêm đoạn mã này vào HelloScraper
    1. public class HelloScraper : WebScraper
    2. {
    3. /// <summary>
    4. /// Override this method initialize your web-scraper.
    5. /// Important tasks will be to Request at least one start url... and set allowed/banned domain or url patterns.
    6. /// </summary>
    7. public override void Init()
    8. {
    9. License.LicenseKey = "LicenseKey"; // Write License Key
    10. this.LoggingLevel = WebScraper.LogLevel.All; // All Events Are Logged
    11. this.Request("https://blog.scrapinghub.com", Parse);
    12. }
    13. /// <summary>
    14. /// Override this method to create the default Response handler for your web scraper.
    15. /// If you have multiple page types, you can add additional similar methods.
    16. /// </summary>
    17. /// <param name="response">The http Response object to parse</param>
    18. public override void Parse(Response response)
    19. {
    20. // set working directory for the project
    21. this.WorkingDirectory = AppSetting.GetAppRoot()+ @"\HelloScraperSample\Output\";
    22. // Loop on all Links
    23. foreach (var title_link in response.Css("h2.entry-title a"))
    24. {
    25. // Read Link Text
    26. string strTitle = title_link.TextContentClean;
    27. // Save Result to File
    28. Scrape(new ScrapedData() { { "Title", strTitle } }, "HelloScraper.Jsonl");
    29. }
    30. // Loop On All Links
    31. if (response.CssExists("div.prev-post > a[href]"))
    32. {
    33. // Get Link URL
    34. var next_page = response.Css("div.prev-post > a[href]")[0].Attributes["href"];
    35. // Scrpae Next URL
    36. this.Request(next_page, Parse);
    37. }
    38. }
    39. }
      
  4. Bây giờ để bắt đầu Scrape Thêm đoạn mã này vào chính
    1. static void Main(string[] args)
    2. {
    3. // Create Object From Hello Scrape class
    4. HelloScraperSample.HelloScraper scrape = new HelloScraperSample.HelloScraper();
    5. // Start Scraping
    6. scrape.Start();
    7. }
      
  5. Kết quả sẽ được lưu trong một tệp có định dạng WebSraper.WorkingDirecty / classname.Json

Tổng quan về mã

Scrape.Start () => kích hoạt logic scrape như sau:
  1. Gọi phương thức init () trước tiên để bắt đầu các biến, thuộc tính cạo và thuộc tính hành vi.,
  2. Như chúng ta có thể thấy nó đặt trang bắt đầu thành Yêu cầu ("https://blog.scrapinghub.com ", Parse) và Parse (Phản hồi phản hồi) được xác định là quá trình được sử dụng để phân tích phản hồi.
  3. Quản lý trang web song song: http và chủ đề, giữ cho tất cả mã của bạn dễ dàng gỡ lỗi và đồng bộ.
  4. Phương thức phân tích bắt đầu sau init () để phân tích trang.
    1. Bạn có thể tìm thấy các phần tử bằng cách sử dụng (bộ chọn Css, Js DOM, XPath)
    2. Các phần tử được chọn được chuyển sang loại ScrapedData, bạn có thể chuyển chúng sang bất kỳ Lớp tùy chỉnh nào như (Sản phẩm, Nhân viên, Tin tức, v.v.)
    3. Các đối tượng được lưu trong một tệp có Định dạng Json trong Thư mục (Thùng bin / Scrape / Lần). Hoặc bạn có thể đặt đường dẫn của tệp làm tham số như chúng ta sẽ thấy sau trong các ví dụ khác.

Các tùy chọn và chức năng của Thư viện IronWebScraper

Bạn có thể tìm thấy tài liệu cập nhật bên trong tệp zip đã được tải xuống bằng phương pháp cài đặt thủ công (Tập tin IronWebScifier Documentation.chm)
Hoặc bạn có thể kiểm tra Tài liệu trực tuyến để cập nhật thư viện lần cuối http://ironsoftware.com/csharp/webscraper/object-reference/
Để bắt đầu sử dụng IronWebscraper trong dự án của bạn, bạn phải kế thừa từ lớp (IronWebScraper.WebScraper) mở rộng thư viện lớp của bạn và thêm chức năng cạo cho nó.
Ngoài ra, bạn phải triển khai các phương thức {init (), Parse (Phản hồi phản hồi)}.
  1. namespace IronWebScraperEngine
  2. {
  3. public class NewsScraper : IronWebScraper.WebScraper
  4. {
  5. public override void Init()
  6. {
  7. throw new NotImplementedException();
  8. }
  9. public override void Parse(Response response)
  10. {
  11. throw new NotImplementedException();
  12. }
  13. }
  14. }
  
Thuộc tính \ chức năngKiểuSự miêu tả
Trong đó ()phương phápđược sử dụng để thiết lập cạp
Phân tích cú pháp (Phản hồi)phương phápĐược sử dụng để thực hiện logic mà bộ cạp sẽ sử dụng và cách nó sẽ xử lý nó. 
Bảng sắp tới chứa danh sách các phương thức và thuộc tính mà Thư viện IronWebScraper đang cung cấp 
LƯU Ý: Có thể triển khai nhiều phương thức cho các hành vi hoặc cấu trúc trang khác nhau
  • BnedUrls
  • Được phép
  • Tên miền bị cấm
Bộ sưu tậpĐược sử dụng để cấm / Cho phép / URL và / hoặc Tên miền 
Ex: BnedUrls.Add ("* .zip", "* .exe", "* .gz", "* .pdf"); 
Chú thích:
  • Bạn có thể sử dụng ký tự đại diện (* và / hoặc?)
  • Bạn có thể sử dụng chuỗi và biểu thức chính quy
  • BnedUrls, allowUrls, BnedDomains, allowDomains
  • BnedUrls.Add ("* .zip", "* .exe", "* .gz", "* .pdf");
  • *? ký tự đại diện bán toàn cầu
  • chuỗi và biểu thức chính quy
  • bạn có thể ghi đè hành vi này bằng cách ghi đè phương thức: công khai ảo bool AcceptUrl (url chuỗi)
ObeyRobotsDotTxtBooleanĐược sử dụng để bật hoặc tắt đọc và làm theo robot.txt chỉ thị của nó hay không
công khai ghi đè bool ObeyRobotsDotTxtForhost (chuỗi máy chủ)phương phápĐược sử dụng để bật hoặc tắt đọc và làm theo robot.txt chỉ thị của nó hoặc không cho miền nhất định
Cạophương pháp
ScrapeUniquephương pháp
ThrottModeBảng liệt kê
EnableWebCache ()phương pháp
EnableWebCache (TimeSpan cacheDuration)phương pháp
MaxHttpConnectionLimitInt
RateLimitPerhostThời gian
OpenConnectionLimitPerhostInt
ObeyRobotsDotTxtBoolean
ThrottModeEnumTùy chọn Enum:
  • ByIpAddress
  • ByDomainhostName
SetSiteSpecificCrawlRateLimit (chuỗi hostName, TimeSpan crawlRate)phương pháp
Danh tínhBộ sưu tậpMột danh sách của httpIdentity () sẽ được sử dụng để tìm nạp tài nguyên web. 

Mỗi danh tính có thể có một địa chỉ IP proxy khác nhau, Tác nhân người dùng, tiêu đề http, cookie liên tục, tên người dùng và mật khẩu. 
Cách thực hành tốt nhất là tạo Danh tính trong Phương thức WebScraper.Init của bạn và Thêm chúng vào Danh sách WebScraper.Identities này.
Thư mục làm việcchuỗiThiết lập thư mục làm việc sẽ được sử dụng cho tất cả các dữ liệu liên quan đến scrape sẽ được lưu trữ vào đĩa.

Các mẫu và thực hành trong thế giới thực

Quét một trang web phim trực tuyến

Hãy bắt đầu một ví dụ khác từ một trang web thế giới thực. Chúng tôi sẽ chọn để cạo một trang web phim.
Chúng ta hãy thêm một lớp mới và đặt tên nó là Phim MovieScetter ':
Bây giờ chúng ta hãy xem trên trang web mà chúng tôi sẽ cạo:
Đây là một phần của HTML trang chủ mà chúng tôi thấy trên trang web:
  1. <div id="movie-featured" class="movies-list movies-list-full tab-pane in fade active">
  2. <div data-movie-id="20746" class="ml-item">
  3. <a href="https://website.com/film/king-arthur-legend-of-the-sword-20746/">
  4. <span class="mli-quality">CAM</span>
  5. <img data-original="https://img.gocdn.online/2017/05/16/poster/2116d6719c710eabe83b377463230fbe-king-arthur-legend-of-the-sword.jpg"
  6. class="lazy thumb mli-thumb" alt="King Arthur: Legend of the Sword"
  7. src="https://img.gocdn.online/2017/05/16/poster/2116d6719c710eabe83b377463230fbe-king-arthur-legend-of-the-sword.jpg"
  8. style="display: inline-block;">
  9. <span class="mli-info"><h2>King Arthur: Legend of the Sword</h2></span>
  10. </a>
  11. </div>
  12. <div data-movie-id="20724" class="ml-item">
  13. <a href="https://website.com/film/snatched-20724/" >
  14. <span class="mli-quality">CAM</span>
  15. <img data-original="https://img.gocdn.online/2017/05/16/poster/5ef66403dc331009bdb5aa37cfe819ba-snatched.jpg"
  16. class="lazy thumb mli-thumb" alt="Snatched"
  17. src="https://img.gocdn.online/2017/05/16/poster/5ef66403dc331009bdb5aa37cfe819ba-snatched.jpg"
  18. style="display: inline-block;">
  19. <span class="mli-info"><h2>Snatched</h2></span>
  20. </a>
  21. </div>
  22. </div>
HTML
Như chúng ta có thể thấy, chúng ta có ID phim, Tiêu đề và Liên kết đến Trang chi tiết.
Hãy bắt đầu cạo bộ dữ liệu này:
  1. public class MovieScraper : WebScraper
  2. {
  3. public override void Init()
  4. {
  5. License.LicenseKey = "LicenseKey";
  6. this.LoggingLevel = WebScraper.LogLevel.All;
  7. this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
  8. this.Request("www.website.com", Parse);
  9. }
  10. public override void Parse(Response response)
  11. {
  12. foreach (var Divs in response.Css("#movie-featured > div"))
  13. {
  14. if (Divs.Attributes["class"] != "clearfix")
  15. {
  16. var MovieId = Divs.GetAttribute("data-movie-id");
  17. var link = Divs.Css("a")[0];
  18. var MovieTitle = link.TextContentClean;
  19. Scrape(new ScrapedData() { { "MovieId", MovieId }, { "MovieTitle", MovieTitle } }, "Movie.Jsonl");
  20. }
  21. }
  22. }
  23. }
  
Có gì mới trong mã này?
Thuộc tính Work Directory được sử dụng để đặt thư mục làm việc chính cho tất cả các dữ liệu bị loại bỏ và các tệp liên quan.
Hãy làm nhiều hơn nữa.
Điều gì sẽ xảy ra nếu chúng ta cần xây dựng các đối tượng được gõ sẽ giữ dữ liệu bị loại bỏ trong các đối tượng được định dạng?
Hãy thực hiện một lớp phim sẽ chứa dữ liệu được định dạng của chúng tôi:
  1. public class Movie
  2. {
  3. public int Id { get; set; }
  4. public string Title { get; set; }
  5. public string URL { get; set; }
  6. }
  
Bây giờ chúng tôi sẽ cập nhật mã của chúng tôi:
  1. public class MovieScraper : WebScraper
  2. {
  3. public override void Init()
  4. {
  5. License.LicenseKey = "LicenseKey";
  6. this.LoggingLevel = WebScraper.LogLevel.All;
  7. this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
  8. this.Request("https://website.com/", Parse);
  9. }
  10. public override void Parse(Response response)
  11. {
  12. foreach (var Divs in response.Css("#movie-featured > div"))
  13. {
  14. if (Divs.Attributes["class"] != "clearfix")
  15. {
  16. var movie = new Movie();
  17. movie.Id = Convert.ToInt32( Divs.GetAttribute("data-movie-id"));
  18. var link = Divs.Css("a")[0];
  19. movie.Title = link.TextContentClean;
  20. movie.URL = link.Attributes["href"];
  21. Scrape(movie, "Movie.Jsonl");
  22. }
  23. }
  24. }
  25. }
  
Có gì mới?
  1. Chúng tôi triển khai Lớp phim để giữ dữ liệu bị loại bỏ
  2. Chúng tôi chuyển các đối tượng phim cho Phương thức Scrape và nó hiểu định dạng của chúng tôi và lưu ở định dạng được xác định như chúng ta có thể thấy ở đây:
Hãy bắt đầu cạo một trang chi tiết hơn.
Trang phim trông như thế này:
  1. <div class="mvi-content">
  2. <div class="thumb mvic-thumb"
  3. style="background-image: url(https://img.gocdn.online/2017/04/28/poster/5a08e94ba02118f22dc30f298c603210-guardians-of-the-galaxy-vol-2.jpg);"></div>
  4. <div class="mvic-desc">
  5. <h3>Guardians of the Galaxy Vol. 2</h3>
  6. <div class="desc">
  7. Set to the backdrop of Awesome Mixtape #2, Marvel's Guardians of the Galaxy Vol. 2 continues the team's adventures as they travel throughout the cosmos to help Peter Quill learn more about his true parentage.
  8. </div>
  9. <div class="mvic-info">
  10. <div class="mvici-left">
  11. <p>
  12. <strong>Genre: </strong>
  13. <a href="https://Domain/genre/action/" title="Action">Action</a>,
  14. <a href="https://Domain/genre/adventure/" title="Adventure">Adventure</a>,
  15. <a href="https://Domain/genre/sci-fi/" title="Sci-Fi">Sci-Fi</a>
  16. </p>
  17. <p>
  18. <strong>Actor: </strong>
  19. <a target="_blank" href="https://Domain/actor/chris-pratt" title="Chris Pratt">Chris Pratt</a>,
  20. <a target="_blank" href="https://Domain/actor/-zoe-saldana" title="Zoe Saldana">Zoe Saldana</a>,
  21. <a target="_blank" href="https://Domain/actor/-dave-bautista-" title="Dave Bautista">Dave Bautista</a>
  22. </p>
  23. <p>
  24. <strong>Director: </strong>
  25. <a href="#" title="James Gunn">James Gunn</a>
  26. </p>
  27. <p>
  28. <strong>Country: </strong>
  29. <a href="https://Domain/country/us" title="United States">United States</a>
  30. </p>
  31. </div>
  32. <div class="mvici-right">
  33. <p><strong>Duration:</strong> 136 min</p>
  34. <p><strong>Quality:</strong> <span class="quality">CAM</span></p>
  35. <p><strong>Release:</strong> 2017</p>
  36. <p><strong>IMDb:</strong> 8.3</p>
  37. </div>
  38. <div class="clearfix"></div>
  39. </div>
  40. <div class="clearfix"></div>
  41. </div>
  42. <div class="clearfix"></div>
  43. </div>
HTML
Chúng tôi có thể mở rộng lớp phim của mình với các thuộc tính mới (Mô tả, Thể loại, Diễn viên, Đạo diễn, Quốc gia, Thời lượng, Điểm IMDB) nhưng chúng tôi sẽ chỉ sử dụng (Mô tả, Thể loại, Diễn viên) cho mẫu của chúng tôi.
  1. public class Movie
  2. {
  3. public int Id { get; set; }
  4. public string Title { get; set; }
  5. public string URL { get; set; }
  6. public string Description { get; set; }
  7. public List<string> Genre { get; set; }
  8. public List<string> Actor { get; set; }
  9. }
  
Bây giờ chúng tôi sẽ điều hướng đến trang Chi tiết để cạo nó.
IronWebScraper cho phép bạn thêm nhiều hơn vào chức năng cạo để cạo các loại định dạng trang khác nhau
Như chúng ta có thể thấy ở đây:
  1. public class MovieScraper : WebScraper
  2. {
  3. public override void Init()
  4. {
  5. License.LicenseKey = "LicenseKey";
  6. this.LoggingLevel = WebScraper.LogLevel.All;
  7. this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
  8. this.Request("https://domain/", Parse);
  9. }
  10. public override void Parse(Response response)
  11. {
  12. foreach (var Divs in response.Css("#movie-featured > div"))
  13. {
  14. if (Divs.Attributes["class"] != "clearfix")
  15. {
  16. var movie = new Movie();
  17. movie.Id = Convert.ToInt32( Divs.GetAttribute("data-movie-id"));
  18. var link = Divs.Css("a")[0];
  19. movie.Title = link.TextContentClean;
  20. movie.URL = link.Attributes["href"];
  21. this.Request(movie.URL, ParseDetails, new MetaData() { { "movie", movie } });// to scrap Detailed Page
  22. }
  23. }
  24. }
  25. public void ParseDetails(Response response)
  26. {
  27. var movie = response.MetaData.Get<Movie>("movie");
  28. var Div = response.Css("div.mvic-desc")[0];
  29. movie.Description = Div.Css("div.desc")[0].TextContentClean;
  30. foreach(var Genre in Div.Css("div > p > a"))
  31. {
  32. movie.Genre.Add(Genre.TextContentClean);
  33. }
  34. foreach (var Actor in Div.Css("div > p:nth-child(2) > a"))
  35. {
  36. movie.Actor.Add(Actor.TextContentClean);
  37. }
  38. Scrape(movie, "Movie.Jsonl");
  39. }
  40. }
  
Có gì mới?
  1. Chúng tôi có thể thêm các chức năng cạo (ParseDetails) để cạo các trang chi tiết
  2. Chúng tôi đã chuyển chức năng Scrape tạo tệp của chúng tôi sang chức năng mới
  3. Chúng tôi đã sử dụng tính năng IronWebScraper (MetaData) để chuyển đối tượng phim của mình sang chức năng cạo mới
  4. Chúng tôi đã quét trang và lưu dữ liệu đối tượng phim của mình vào một tệp

Nội dung cạo từ một trang web mua sắm

Chúng tôi chọn một trang web mua sắm để cạo nội dung từ nó
Như bạn có thể thấy từ hình ảnh, chúng tôi có một thanh bên trái chứa các liên kết cho các danh mục sản phẩm của trang web
Vì vậy, bước đầu tiên của chúng tôi là điều tra HTML của trang web và lên kế hoạch về cách chúng tôi muốn cạo nó.
Các danh mục trang web thời trang có các danh mục phụ (Nam, Nữ, Trẻ em)
  1. <li class="menu-item" data-id="">
  2. <a href="https://domain.com/fashion-by-/" class="main-category">
  3. <i class="cat-icon osh-font-fashion"></i> <span class="nav-subTxt">FASHION </span> <i class="osh-font-light-arrow-left"></i><i class="osh-font-light-arrow-right"></i>
  4. </a> <div class="navLayerWrapper" style="width: 633px; display: none;"><div class="submenu"><div class="column"><div class="categories"><a class="category" href="https://domain.com/fashion-by-/?sort=newest&amp;dir=desc&amp;viewType=gridView3">New Arrivals !</a> </div><div class="categories"><a class="category" href="https://domain.com/men-fashion/">Men</a> <a class="subcategory" href="https://domain.com/mens-shoes/">Shoes</a> <a class="subcategory" href="https://domain.com/mens-clothing/">Clothing</a> <a class="subcategory" href="https://domain.com/mens-accessories/">Accessories</a> </div><div class="categories"><a class="category" href="https://domain.com/women-fashion/">Women</a> <a class="subcategory" href="https://domain.com/womens-shoes/">Shoes</a> <a class="subcategory" href="https://domain.com/womens-clothing/">Clothing</a> <a class="subcategory" href="https://domain.com/womens-accessories/">Accessories</a> </div><div class="categories"><a class="category" href="https://domain.com/girls-boys-fashion/">Kids</a> <a class="subcategory" href="https://domain.com/boys-fashion/">Boys</a> <a class="subcategory" href="https://domain.com/girls/">Girls</a> </div><div class="categories"><a class="category" href="https://domain.com/maternity-clothes/">Maternity Clothes</a> </div></div><div class="column"><div class="categories"> <span class="category defaultCursor">Men Best Sellers</span> <a class="subcategory" href="https://domain.com/mens-casual-shoes/">Casual Shoes</a> <a class="subcategory" href="https://domain.com/mens-sneakers/">Sneakers</a> <a class="subcategory" href="https://domain.com/mens-t-shirts/">T-shirts</a> <a class="subcategory" href="https://domain.com/mens-polos/">Polos</a> </div><div class="categories"> <span class="category defaultCursor">Women Best Sellers</span> <a class="subcategory" href="https://domain.com/womens-sandals/">Sandals</a> <a class="subcategory" href="https://domain.com/womens-sneakers/">Sneakers</a> <a class="subcategory" href="https://domain.com/women-dresses/">Dresses</a> <a class="subcategory" href="https://domain.com/women-tops/">Tops</a> </div><div class="categories"><a class="category" href="https://domain.com/womens-curvy-clothing/">Women's Curvy Clothing</a> </div><div class="categories"><a class="category" href="https://domain.com/fashion-bundles/v/">Fashion Bundles</a> </div><div class="categories"><a class="category" href="https://domain.com/hijab-fashion/">Hijab Fashion</a> </div></div><div class="column"><div class="categories"><a class="category" href="https://domain.com/brands/fashion-by-/">SEE ALL BRANDS</a> <a class="subcategory" href="https://domain.com/adidas/">Adidas</a> <a class="subcategory" href="https://domain.com/converse/">Converse</a> <a class="subcategory" href="https://domain.com/ravin/">Ravin</a> <a class="subcategory" href="https://domain.com/dejavu/">Dejavu</a> <a class="subcategory" href="https://domain.com/agu/">Agu</a> <a class="subcategory" href="https://domain.com/activ/">Activ</a> <a class="subcategory" href="https://domain.com/oxford--bellini--tie-house--milano/">Tie House</a> <a class="subcategory" href="https://domain.com/shoe-room/">Shoe Room</a> <a class="subcategory" href="https://domain.com/town-team/">Town Team</a> </div></div></div></div>
  5. </li>
HTML
Hãy lập một dự án
  1. Tạo Ứng dụng Bảng điều khiển mới hoặc Thêm thư mục mới cho mẫu mới của chúng tôi với tên là Mua sắmSiteSampleSample
  2. Thêm lớp mới với tên gọi Mua sắm
  3. Bước đầu tiên sẽ là cạo các danh mục trang web và các danh mục phụ của nó
Hãy tạo một mô hình danh mục:
  1. public class Category
  2. {
  3. /// <summary>
  4. /// Gets or sets the name.
  5. /// </summary>
  6. /// <value>
  7. /// The name.
  8. /// </value>
  9. public string Name { get; set; }
  10. /// <summary>
  11. /// Gets or sets the URL.
  12. /// </summary>
  13. /// <value>
  14. /// The URL.
  15. /// </value>
  16. public string URL { get; set; }
  17. /// <summary>
  18. /// Gets or sets the sub categories.
  19. /// </summary>
  20. /// <value>
  21. /// The sub categories.
  22. /// </value>
  23. public List<Category> SubCategories { get; set; }
  24. }
  
  1. Bây giờ hãy xây dựng logic scrape của chúng tôi
    1. public class ShoppingScraper : WebScraper
    2. {
    3. /// <summary>
    4. /// Override this method initialize your web-scraper.
    5. /// Important tasks will be to Request at least one start url... and set allowed/banned domain or url patterns.
    6. /// </summary>
    7. public override void Init()
    8. {
    9. License.LicenseKey = "LicenseKey";
    10. this.LoggingLevel = WebScraper.LogLevel.All;
    11. this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\";
    12. this.Request("www.webSite.com", Parse);
    13. }
    14. /// <summary>
    15. /// Override this method to create the default Response handler for your web scraper.
    16. /// If you have multiple page types, you can add additional similar methods.
    17. /// </summary>
    18. /// <param name="response">The http Response object to parse</param>
    19. public override void Parse(Response response)
    20. {
    21. var categoryList = new List<Category>();
    22. foreach (var Links in response.Css("#menuFixed > ul > li > a "))
    23. {
    24. var cat = new Category();
    25. cat.URL = Links.Attributes["href"];
    26. cat.Name = Links.InnerText;
    27. categoryList.Add(cat);
    28. }
    29. Scrape(categoryList, "Shopping.Jsonl");
    30. }
    31. }
      
Nạo các liên kết từ menu
Hãy cập nhật mã của chúng tôi để cạo các Danh mục chính và tất cả các liên kết phụ của nó
  1. public override void Parse(Response response)
  2. {
  3. // List of Categories Links (Root)
  4. var categoryList = new List<Category>();
  5. foreach (var li in response.Css("#menuFixed > ul > li"))
  6. {
  7. // List Of Main Links
  8. foreach (var Links in li.Css("a"))
  9. {
  10. var cat = new Category();
  11. cat.URL = Links.Attributes["href"];
  12. cat.Name = Links.InnerText;
  13. cat.SubCategories = new List<Category>();
  14. // List of Sub Catgories Links
  15. foreach (var subCategory in li.Css("a[class=subcategory]"))
  16. {
  17. var subcat = new Category();
  18. subcat.URL = Links.Attributes["href"];
  19. subcat.Name = Links.InnerText;
  20. // Check If Link Exist Before
  21. if (cat.SubCategories.Find(c=>c.Name== subcat.Name && c.URL == subcat.URL) == null)
  22. {
  23. // Add Sublinks
  24. cat.SubCategories.Add(subcat);
  25. }
  26. }
  27. // Add Categories
  28. categoryList.Add(cat);
  29. }
  30. }
  31. Scrape(categoryList, "Shopping.Jsonl");
  32. }
  
Bây giờ chúng tôi có các liên kết đến tất cả các danh mục trang web, hãy bắt đầu cạo các sản phẩm trong mỗi danh mục
Hãy điều hướng đến bất kỳ danh mục và kiểm tra nội dung.
Hãy xem mã của nó
  1. <section class="products">
  2. <div class="sku -gallery -validate-size " data-sku="AG249FA0T2PSGNAFAMZ" ft-product-sizes="41,42,43,44,45" ft-product-color="Multicolour">
  3. <a class="link" href="http://www.WebSite.com/agu-bundle-of-2-sneakers-black-navy-blue-653884.html">
  4. <div class="image-wrapper default-state">
  5. <img class="lazy image -loaded" alt="Bundle Of 2 Sneakers - Black &amp;amp; Navy Blue" data-image-vertical="1" width="210" height="262" src="https://static.WebSite.com/p/agu-6208-488356-1-catalog_grid_3.jpg" data-sku="AG249FA0T2PSGNAFAMZ" data-src="https://static.WebSite.com/p/agu-6208-488356-1-catalog_grid_3.jpg" data-placeholder="placeholder_m_1.jpg"><noscript>&lt;img src="https://static.WebSite.com/p/agu-6208-488356-1-catalog_grid_3.jpg" width="210" height="262" class="image" /&gt;</noscript>
  6. </div> <h2 class="title">
  7. <span class="brand ">Agu&nbsp;</span>
  8. <span class="name" dir="ltr">Bundle Of 2 Sneakers - Black &amp; Navy Blue</span>
  9. </h2><div class="price-container clearfix">
  10. <span class="price-box">
  11. <span class="price">
  12. <span data-currency-iso="EGP">EGP</span>
  13. <span dir="ltr" data-price="299">299</span>
  14. </span> <span class="price -old -no-special"></span>
  15. </span>
  16. </div><div class="rating-stars"><div class="stars-container"><div class="stars" style="width: 62%"></div></div> <div class="total-ratings">(30)</div> </div> <span class="shop-first-logo-container"><img src="http://www.WebSite.com/images/local/logos/shop_first/ShoppingSite/logo_normal.png" data-src="http://www.WebSite.com/images/local/logos/shop_first/ShoppingSite/logo_normal.png" class="lazy shop-first-logo-img -mbxs -loaded"> </span>
  17. <span class="osh-icon -ShoppingSite-local shop_local--logo -block -mbs -mts"></span>
  18. <div class="list -sizes" data-selected-sku="">
  19. <span class="js-link sku-size" data-href="http://www.WebSite.com/agu-bundle-of-2-sneakers-black-navy-blue-653884.html?size=41">41</span> <span class="js-link sku-size" data-href="http://www.WebSite.com/agu-bundle-of-2-sneakers-black-navy-blue-653884.html?size=42">42</span>
  20. <span class="js-link sku-size" data-href="http://www.WebSite.com/agu-bundle-of-2-sneakers-black-navy-blue-653884.html?size=43">43</span> <span class="js-link sku-size" data-href="http://www.WebSite.com/agu-bundle-of-2-sneakers-black-navy-blue-653884.html?size=44">44</span>
  21. <span class="js-link sku-size" data-href="http://www.WebSite.com/agu-bundle-of-2-sneakers-black-navy-blue-653884.html?size=45">45</span>
  22. </div>
  23. </a>
  24. </div>
  25. <div class="sku -gallery -validate-size " data-sku="LE047FA01SRK4NAFAMZ" ft-product-sizes="110,115,120,125,130,135" ft-product-color="Black">
  26. <a class="link" href="http://www.WebSite.com/leather-shop-genuine-leather-belt-black-712030.html">
  27. <div class="image-wrapper default-state"><img class="lazy image -loaded" alt="Genuine Leather Belt - Black" data-image-vertical="1" width="210" height="262" src="https://static.WebSite.com/p/leather-shop-1831-030217-1-catalog_grid_3.jpg" data-sku="LE047FA01SRK4NAFAMZ" data-src="https://static.WebSite.com/p/leather-shop-1831-030217-1-catalog_grid_3.jpg" data-placeholder="placeholder_m_1.jpg"><noscript>&lt;img src="https://static.WebSite.com/p/leather-shop-1831-030217-1-catalog_grid_3.jpg" width="210" height="262" class="image" /&gt;</noscript></div>
  28. <h2 class="title"><span class="brand ">Leather Shop&nbsp;</span> <span class="name" dir="ltr">Genuine Leather Belt - Black</span></h2><div class="price-container clearfix">
  29. <span class="sale-flag-percent">-29%</span> <span class="price-box"> <span class="price"><span data-currency-iso="EGP">EGP</span> <span dir="ltr" data-price="96">96</span> </span> <span class="price -old "><span data-currency-iso="EGP">EGP</span> <span dir="ltr" data-price="135">135</span> </span> </span>
  30. </div><div class="rating-stars"><div class="stars-container"><div class="stars" style="width: 100%"></div></div> <div class="total-ratings">(1)</div> </div>
  31. <span class="osh-icon -ShoppingSite-local shop_local--logo -block -mbs -mts"></span> <div class="list -sizes" data-selected-sku="">
  32. <span class="js-link sku-size" data-href="http://www.WebSite.com/leather-shop-genuine-leather-belt-black-712030.html?size=110">110</span> <span class="js-link sku-size" data-href="http://www.WebSite.com/leather-shop-genuine-leather-belt-black-712030.html?size=115">115</span>
  33. <span class="js-link sku-size" data-href="http://www.WebSite.com/leather-shop-genuine-leather-belt-black-712030.html?size=120">120</span> <span class="js-link sku-size" data-href="http://www.WebSite.com/leather-shop-genuine-leather-belt-black-712030.html?size=125">125</span> <span class="js-link sku-size" data-href="http://www.WebSite.com/leather-shop-genuine-leather-belt-black-712030.html?size=130">130</span>
  34. <span class="js-link sku-size" data-href="http://www.WebSite.com/leather-shop-genuine-leather-belt-black-712030.html?size=135">135</span>
  35. </div>
  36. </a>
  37. </div>
  38. </section>
HTML
Hãy xây dựng mô hình sản phẩm của chúng tôi cho nội dung này.
  1. public class Product
  2. {
  3. /// <summary>
  4. /// Gets or sets the name.
  5. /// </summary>
  6. /// <value>
  7. /// The name.
  8. /// </value>
  9. public string Name { get; set; }
  10. /// <summary>
  11. /// Gets or sets the price.
  12. /// </summary>
  13. /// <value>
  14. /// The price.
  15. /// </value>
  16. public string Price { get; set; }
  17. /// <summary>
  18. /// Gets or sets the image.
  19. /// </summary>
  20. /// <value>
  21. /// The image.
  22. /// </value>
  23. public string Image { get; set; }
  24. }
  
Để cạo các trang danh mục, chúng tôi thêm một phương pháp cạo mới:
  1. public void ParseCatgory(Response response)
  2. {
  3. // List of Products Links (Root)
  4. var productList = new List<Product>();
  5. foreach (var Links in response.Css("body > main > section.osh-content > section.products > div > a"))
  6. {
  7. var product = new Product();
  8. product.Name = Links.InnerText;
  9. product.Image = Links.Css("div.image-wrapper.default-state > img")[0].Attributes["src"];
  10. productList.Add(product);
  11. }
  12. Scrape(productList, "Products.Jsonl");
  13. }
  

Các tính năng Webscraping nâng cao

Tính năng httpIdentity:

Một số hệ thống trang web yêu cầu người dùng phải đăng nhập để xem nội dung; trong trường hợp này, chúng ta có thể sử dụng một HTTPIdentity: -
  1. HttpIdentity id = new HttpIdentity();
  2. id.NetworkUsername = "username";
  3. id.NetworkPassword = "pwd";
  4. Identities.Add(id);
  
Một trong những tính năng ấn tượng và mạnh mẽ nhất trong IronWebScraper, là khả năng sử dụng hàng ngàn thông tin độc đáo (thông tin người dùng và / hoặc công cụ trình duyệt) để giả mạo hoặc cạo trang web bằng nhiều phiên đăng nhập.
  1. public override void Init()
  2. {
  3. License.LicenseKey = " LicenseKey ";
  4. this.LoggingLevel = WebScraper.LogLevel.All;
  5. this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\";
  6. var proxies = "IP-Proxy1: 8080,IP-Proxy2: 8081".Split(',');
  7. foreach (var UA in IronWebScraper.CommonUserAgents.ChromeDesktopUserAgents)
  8. {
  9. foreach (var proxy in proxies)
  10. {
  11. Identities.Add(new HttpIdentity()
  12. {
  13. UserAgent = UA,
  14. UseCookies = true,
  15. Proxy = proxy
  16. });
  17. }
  18. }
  19. this.Request("http://www.Website.com", Parse);
  20. }
  
Bạn có nhiều thuộc tính để cung cấp cho bạn các hành vi khác nhau, do đó, ngăn chặn các trang web chặn bạn.
Một số thuộc tính sau: -
  • NetworkDomain : Tên miền mạng được sử dụng để xác thực người dùng. Hỗ trợ các mạng Windows, NTLM, Keroberos, Linux, BSD và Mac OS X. Phải được sử dụng với (NetworkUsername và NetworkPassword)
  • NetworkUsername : Tên người dùng mạng / http sẽ được sử dụng để xác thực người dùng. Hỗ trợ các mạng http, Windows, NTLM, Kerberos, Linux, mạng BSD và Mac OS.
  • NetworkPassword : Mật khẩu mạng / http được sử dụng để xác thực người dùng. Hỗ trợ các mạng http, Windows, NTLM, Keroberos, Linux, mạng BSD và Mac OS.
  • Proxy : để đặt cài đặt proxy
  • UserAgent : để đặt công cụ trình duyệt (máy tính để bàn chrome, điện thoại di động chrome, máy tính bảng chrome, IE và Firefox, v.v.)
  • HttpRequestHeaders : cho các giá trị tiêu đề tùy chỉnh sẽ được sử dụng với danh tính này và nó chấp nhận đối tượng từ điển (Từ điển <chuỗi, chuỗi>)
  • UseCookies : bật / tắt bằng cookie
IronWebScraper chạy cạp bằng cách sử dụng danh tính ngẫu nhiên. Nếu chúng ta cần xác định việc sử dụng một danh tính cụ thể để phân tích một trang, chúng ta có thể làm như vậy.
  1. public override void Init()
  2. {
  3. License.LicenseKey = " LicenseKey ";
  4. this.LoggingLevel = WebScraper.LogLevel.All;
  5. this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\";
  6. HttpIdentity identity = new HttpIdentity();
  7. identity.NetworkUsername = "username";
  8. identity.NetworkPassword = "pwd";
  9. Identities.Add(id);
  10. this.Request("http://www.Website.com", Parse, identity);
  11. }
  

Kích hoạt tính năng Web Cache:

Tính năng này được sử dụng để lưu các trang được yêu cầu. Nó thường được sử dụng trong các giai đoạn phát triển và thử nghiệm; cho phép các nhà phát triển lưu trữ các trang cần thiết để sử dụng lại sau khi cập nhật mã. Điều này cho phép bạn thực thi mã của mình trên các trang được lưu trong bộ nhớ cache sau khi khởi động lại bộ quét Web và không cần kết nối với trang web trực tiếp mỗi lần (phát lại hành động).
Bạn có thể sử dụng nó trong Phương thức init ()
EnableWebCache ();
HOẶC LÀ
EnableWebCache (Hết hạn Timespan);
Nó sẽ lưu dữ liệu được lưu trong bộ nhớ cache của bạn vào thư mục WebCache trong thư mục thư mục làm việc
  1. public override void Init()
  2. {
  3. License.LicenseKey = " LicenseKey ";
  4. this.LoggingLevel = WebScraper.LogLevel.All;
  5. this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\";
  6. EnableWebCache(new TimeSpan(1,30,30));
  7. this.Request("http://www.WebSite.com", Parse);
  8. }
  
IronWebScraper cũng có các tính năng cho phép công cụ của bạn tiếp tục quét sau khi khởi động lại mã bằng cách đặt tên quy trình khởi động động cơ bằng cách sử dụng Bắt đầu (CrawlID)
  1. static void Main(string[] args)
  2. {
  3. // Create Object From Scraper class
  4. EngineScraper scrape = new EngineScraper();
  5. // Start Scraping
  6. scrape.Start("enginestate");
  7. }
  
Yêu cầu thực hiện và phản hồi sẽ được lưu trong thư mục SavingState bên trong thư mục làm việc.

Điều tiết

Chúng tôi có thể kiểm soát số lượng kết nối tối thiểu và tối đa và tốc độ kết nối cho mỗi tên miền.
  1. public override void Init()
  2. {
  3. License.LicenseKey = "LicenseKey";
  4. this.LoggingLevel = WebScraper.LogLevel.All;
  5. this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\";
  6. // Gets or sets the total number of allowed open HTTP requests (threads)
  7. this.MaxHttpConnectionLimit = 80;
  8. // Gets or sets minimum polite delay (pause)between request to a given domain or IP address.
  9. this.RateLimitPerHost = TimeSpan.FromMilliseconds(50);
  10. // Gets or sets the allowed number of concurrent HTTP requests (threads) per hostname
  11. // or IP address. This helps protect hosts against too many requests.
  12. this.OpenConnectionLimitPerHost = 25;
  13. this.ObeyRobotsDotTxt = false;
  14. // Makes the WebSraper intelligently throttle requests not only by hostname, but
  15. // also by host servers' IP addresses. This is polite in-case multiple scraped domains
  16. // are hosted on the same machine.
  17. this.ThrottleMode = Throttle.ByDomainHostName;
  18. this.Request("https://www.Website.com", Parse);
  19. }
  
Đặc tính tiết lưu
  • MaxHttpConnectionLimit
    tổng số yêu cầu (luồng) mở được phép
  • RateLimitPerhost
    trì hoãn hoặc tạm dừng lịch sự tối thiểu (tính bằng mili giây) giữa yêu cầu đến một tên miền hoặc địa chỉ IP nhất định
  • OpenConnectionLimitPerhost
    cho phép số lượng yêu cầu HTTP đồng thời (luồng)
  • ThrottleMode
    Làm cho WebSraper yêu cầu một cách thông minh ga không chỉ bởi tên máy, mà còn bởi địa chỉ IP máy chủ lưu trữ. Đây là lịch sự trong trường hợp nhiều tên miền bị loại bỏ được lưu trữ trên cùng một máy.

ruột thừa

Làm thế nào để tạo một ứng dụng Windows Form?

Chúng ta nên sử dụng Visual Studio 2013 hoặc cao hơn cho việc này.
Thực hiện theo các bước sau để tạo Dự án Windows Forms mới:
  1. Phòng thu hình ảnh mở
  2. Tệp -> Mới -> Dự án
  3. Từ Mẫu, Chọn ngôn ngữ lập trình (Visual C # hoặc VB) -> Windows -> Ứng dụng Windows Forms
Tên dự án : IronScraperSample 
location : chọn một vị trí trên Đĩa cứng của bạn

Làm thế nào để tạo một ứng dụng biểu mẫu web?

Bạn nên sử dụng Visual Studio 2013 hoặc cao hơn cho việc này.
Làm theo các bước để tạo Dự án biểu mẫu web Asp.NET mới
  1. Mở Visual Studio
  2. Tệp -> Mới -> Dự án
  3. Từ Mẫu Chọn ngôn ngữ lập trình (Visual C # hoặc VB) -> Web -> Ứng dụng web ASP.NET (.NET Framework).
Tên dự án : IronScraperSample 
location : chọn vị trí từ Đĩa cứng của bạn
  1. Từ mẫu ASP.NET của bạn
    1. Chọn mẫu trống
    2. Kiểm tra biểu mẫu web
  2. Bây giờ Dự án mẫu ASP.NET Web cơ bản của bạn đã được tạo
Nhấn vào đây để tải về dự án mã poroject mẫu đầy đủ hướng dẫn.

Phản Hồi Độc Giả

Một số lưu ý khi bình luận

Mọi bình luận sai nội quy sẽ bị xóa mà không cần báo trước (xem nội quy)

Bấm Thông báo cho tôi bên dưới khung bình luận để nhận thông báo khi admin trả lời

Để bình luận một đoạn code, hãy mã hóa code trước nhé