.NET에서 ProxyCrawl을 사용하여 Airbnb 페이지를 추출하는 방법

Airbnb 데이터를 추출하기 위해 처음부터 웹 스크레이퍼를 구축하는 것은 쉬운 일이 아닙니다. 원하는 대로 사용할 수 있는 적절한 지식과 도구가 없으면 IP가 차단될 가능성이 큽니다.

그래서 이 프로젝트에서는 ProxyCrawl’s Scraper API 의 도움으로 웹 스크레이퍼를 쉽게 만드는 방법을 알려드리겠습니다. 이 API를 사용하면 회전하는 프록시 위에 구축되므로 대부분의 IP 블록 및 CAPTCHA를 피할 수 있습니다. 또한 규모에 맞게 자동으로 웹을 스크랩하고 완전한 HTML 소스 코드 대신 구문 분석된 콘텐츠를 반환하므로 자체 파서를 구축하는 데 드는 시간과 노력을 절약할 수 있습니다.

우리는 Scraper API를 웹 크롤러에 통합하고 Airbnb 검색 결과에서 구문 분석된 데이터를 검색하는 것이 얼마나 간단한지 보여주기 위해 제가 가장 좋아하는 플랫폼인 Microsoft의 .NET을 사용할 것입니다.

우리가 다룰 내용


  • 사용법ProxyCrawl library for .NET
  • Airbnb의 검색 결과에서 데이터를 추출하는 방법

  • 필요한 것


  • C# 프로그래밍 언어 지식
  • Microsoft Visual Studio의 지식
  • Windows에 설치된 Microsoft Visual Studio

  • ProxyCrawl account Scraper API 사용

  • 코드 설정



    먼저 Microsoft Visual Studio에서 새 C# 콘솔 응용 프로그램 프로젝트를 만듭니다. 아래 샘플 코드를 복사하여 붙여넣을 수 있습니다.

    using System;
    
    namespace ConsoleApp
    {
        class Program
        {
            static void Main(string[] args)
            {
    
            }
        }
    }
    


    ProxyCrawl 서비스에 대해 사용하기 쉬운 라이브러리 래핑 역할을 하는 NuGet 종속성ProxyCrawlAPI (2.0.0)을 활용합니다.

    스크레이퍼 코드



    Airbnb 검색 결과를 스크랩하려면 다음 URL 형식을 사용해야 합니다. https://www.airbnb.com/s/**YOUR PLACE HERE**/homes . 이 예에서는 베이루트에서 장소를 검색합니다. Main 메서드에서 다음 코드를 작성할 수 있습니다.

    using System;
    
    namespace ConsoleApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                var api = new ProxyCrawl.ScraperAPI("YOUR_PROXYCRAWL_TOKEN_HERE");
                api.Get("https://www.airbnb.com/s/Beirut/homes");
                Console.WriteLine(api.Body);
            }
        }
    }
    

    api.Body는 구조화된 AirBnb 검색 항목을 반환합니다. 아래에서 예제 출력을 볼 수 있습니다.

    {
      "residents": [
        {
          "position": 1,
          "title": "Romy's Apartment at The Cube",
          "superHost": true,
          "residentType": "Entire apartment",
          "location": "Horch Tabet",
          "samplePhotoUrl": "https://a0.muscache.com/im/pictures/miso/Hosting-48845122/original/876dcd11-337b-464b-a4a7-b575858ed18f.jpeg?im_w=720",
          "accommodation": {
            "guests": "2 guests",
            "bedrooms": "1 bedroom",
            "beds": "1 bed",
            "baths": "1.5 baths"
          },
          "amenities": [
            "Wifi",
            "Air conditioning",
            "Kitchen",
            "Washer"
          ],
          "rating": "5.0",
          "personReviewed": "10",
          "costs": {
            "PricePerNight": "$67"
          }
        },
        {
          "position": 2,
          "title": "Michele's Apartment at The Cube",
          "superHost": true,
          "residentType": "Entire apartment",
          "location": "El Fil",
          "samplePhotoUrl": "https://a0.muscache.com/im/pictures/f36baf12-17d6-46a0-9b31-2229677ef43b.jpg?im_w=720",
          "accommodation": {
            "guests": "3 guests",
            "bedrooms": "2 bedrooms",
            "beds": "2 beds",
            "baths": "2 baths"
          },
          "amenities": [
            "Wifi",
            "Air conditioning",
            "Kitchen",
            "Washer"
          ],
          "rating": "4.81",
          "personReviewed": "73",
          "costs": {
            "PricePerNight": "$90"
          }
        }
      ],
      "residentsFound": 20
    }
    


    C# 개체를 사용하여 데이터 추출



    JSON으로 작업하는 것은 고통스럽기 때문에 이 예제에서는 C# 개체를 사용합니다. 즉, 다음 클래스를 먼저 만들어 보겠습니다.

    using System;
    
    using Newtonsoft.Json;
    
    namespace ConsoleApp
    {
        class Program
        {
            #region Inner Classes
    
            public class AirBnbScraperResult
            {
                public AirBnbResident[] Residents { get; set; }
            }
    
            public class AirBnbResident
            {
                [JsonProperty("title")]
                public string Title { get; set; }
    
                [JsonProperty("superHost")]
                public bool? SuperHost { get; set; }
    
                [JsonProperty("residentType")]
                public string ResidentType { get; set; }
    
                [JsonProperty("location")]
                public string Location { get; set; }
    
                [JsonProperty("samplePhotoUrl")]
                public string SamplePhotoUrl { get; set; }
    
                [JsonProperty("rating")]
                public decimal? Rating { get; set; }
    
                [JsonProperty("personReviewed")]
                public int? PersonReviewed { get; set; }
    
                [JsonProperty("accommodation")]
                public AirBnbResidentAccommodation Accommodation { get; set; }
    
                [JsonProperty("amenities")]
                public string[] Amenities { get; set; }
    
                [JsonProperty("costs")]
                public AirBnbResidentCost Costs { get; set; }
            }
    
            public class AirBnbResidentAccommodation
            {
                [JsonProperty("guests")]
                public string Guests { get; set; }
    
                [JsonProperty("bedrooms")]
                public string Bedrooms { get; set; }
    
                [JsonProperty("beds")]
                public string Beds { get; set; }
    
                [JsonProperty("baths")]
                public string Baths { get; set; }
            }
    
            public class AirBnbResidentCost
            {
                [JsonProperty("priceCurrency")]
                public string PriceCurrency { get; set; }
    
                [JsonProperty("pricePerNight")]
                public string PricePerNight { get; set; }
            }
    
            #endregion
    
            ...
        }
    }
    


    그런 다음 생성된 개체에서 역직렬화하고 위의 기본 메서드에서 api.Body에서 개체를 탐색합니다.

    using System;
    
    using Newtonsoft.Json;
    
    namespace ConsoleApp
    {
        class Program
        {
            ...
    
            static void Main(string[] args)
            {
                var api = new ProxyCrawl.ScraperAPI("YOUR_PROXYCRAWL_TOKEN_HERE");
                api.Get("https://www.airbnb.com/s/Beirut/homes");
    
                AirBnbScraperResult results = JsonConvert.DeserializeObject<AirBnbScraperResult>(api.Body);
                foreach (var resident in results.Residents)
                {
                    if (resident.SuperHost.HasValue && resident.SuperHost.Value)
                    {
                        Console.WriteLine("{0} <SuperHost>", resident.Title);
                    }
                    else
                    {
                        Console.WriteLine(resident.Title);
                    }
                    Console.WriteLine("Type: {0}", resident.ResidentType);
                    Console.WriteLine("Location: {0}", resident.Location);
                    Console.WriteLine("Photo: {0}", resident.SamplePhotoUrl);
                    Console.WriteLine("Rating: {0}", resident.Rating);
                    Console.WriteLine("Reviewers count: {0}", resident.PersonReviewed);
                    if (resident.Amenities != null && resident.Amenities.Length > 0)
                    {
                        Console.WriteLine("Amenities: {0}", string.Join(", ", resident.Amenities));
                    }
                    if (resident.Accommodation != null)
                    {
                        Console.WriteLine("Amenities");
                        Console.WriteLine("  * Bedrooms: {0}", resident.Accommodation.Bedrooms);
                        Console.WriteLine("  *     Beds: {0}", resident.Accommodation.Beds);
                        Console.WriteLine("  *    Baths: {0}", resident.Accommodation.Baths);
                        Console.WriteLine("  *   Guests: {0}", resident.Accommodation.Guests);
                    }
                    if (resident.Costs != null)
                    {
                        Console.WriteLine("Costs");
                        Console.WriteLine("  * Currency: {0}", resident.Costs.PriceCurrency);
                        Console.WriteLine("  *Per Night: {0}", resident.Costs.PricePerNight);
                    }
    
                    Console.WriteLine();
                }
            }
        }
    }
    


    그리고 아래 스크린샷과 비슷하게 출력됩니다.


    https://github.com/neilrzamora/proxycrawl-airbnb-scraper-dotnet.git에서 전체 소스 코드를 참조하십시오.

    결론



    ProxyCrawl의 .NET 라이브러리를 사용하여 Airbnb에서 데이터를 추출하는 것은 매우 쉽습니다. CAPTCHA를 피하고 구문 분석된 데이터를 얻기 위해 프록시 목록을 컴파일하거나 여러 줄의 코드를 작성할 필요가 없습니다. 단 한 줄의 코드로 Scraper API는 구문 분석 및 프록시를 처리하므로 반환된 데이터에만 집중할 수 있습니다.

    ProxyCrawl은 웹 크롤링 및 스크래핑을 위한 진정한 다목적 플랫폼입니다. 필요에 따라 이 자습서의 예제 코드를 자유롭게 활용하고 확장하십시오.

    좋은 웹페이지 즐겨찾기