İçindekiler
Kullanma Selenyum veri kazımada oldukça yaygın bir şeydir. Tarayıcıları otomatikleştirir ve engellenmekten kaçınmak için gerçek kullanıcı etkinliklerini simüle etmenize olanak tanır. Özellikle Google gibi dinamik olarak oluşturulan JavaScript sitelerini kazırken faydalıdır. Dahası, temelde gerçek istemcilerin davranışlarını simüle ettiği için her türlü tarama korumasından kaçınmaya yardımcı olur.
Bu makalede, 1000'den fazla sayfadan sonra bile engellenmeden Google Haritalar'dan yerleri ayrıştırabilecek bir kazıyıcı geliştirmenin adım adım öğreticisini göreceksiniz.
Paleti Yapmak İçin Neye İhtiyacımız Var
- Python 3+.
- Chrome tarayıcı yüklü.
- Selenium 3.141.0+ (python paketi).
- Chrome Sürücüsü (işletim sisteminiz için).
- Parsel veya Beautiful Soup gibi HTML'den veri ayıklamak için başka bir kütüphane.
Google Haritalar Çıkarıcısını Oluşturmak için Adım Adım Öğretici
ChromeDriver'ı İndirin ve Kaydedin
Selenium'u Google Chrome ile kullanmak için python kodunu tarayıcıya şu şekilde bağlamanız gerekir ChromeDriver.
Tarayıcı sürümünüze ve işletim sistemi türünüze uygun ChromeDriver sürümünü indirin. Chrome tarayıcınızın sürüm numarasını burada bulabilirsiniz: Chrom -> Menü simgesi (sağ üst köşe) -> Yardım -> Google Chrome Hakkında.
Chromedriver dosyasını arşivden çıkarın ve sisteminizde bir yere kaydedin (daha sonra kullanacağımız yol). Bu eğitim örneğinde, dosyayı proje klasöründe saklıyoruz.
Selenium ve Parsel Paketlerini Yükleme
Aşağıdaki komutları çalıştırarak Selenium ve Parsel paketlerini yükleyin. Parsel'i daha sonra HTML'den içerik ayrıştırırken kullanacağız.
pip install selenium
pip install parsel # to extract data from HTML using XPath or CSS selectors
Webdriver'ı Başlatma ve Başlatma
Webdriver'ı başlatmadan önce önceki adımları uyguladığınızdan ve chromedriver dosyanızın yoluna sahip olduğunuzdan emin olun. Sürücüyü aşağıdaki kodla başlatın. Yeni Chrome penceresinin açıldığını görmelisiniz.
from selenium import webdriver
chromedrive_path = './chromedriver' # use the path to the driver you downloaded from previous steps
driver = webdriver.Chrome(chromedrive_path)
Mac'te aşağıdakileri görebilirsiniz: "chromedriver açılamıyor çünkü geliştirici doğrulanamıyor". Bunun üstesinden gelmek için Finder'da chromedriver'a kontrol-tıklayın, menüden Aç'ı seçin ve ardından görünen iletişim kutusunda Aç'a tıklayın. Açılan terminal pencerelerinde "ChromeDriver başarıyla başlatıldı" yazısını görmelisiniz. Kapatın ve bundan sonra ChromeDriver'ı kodunuzdan başlatabileceksiniz.
Google Haritalar Sayfasını İndirin
Sürücüyü başlattığınızda bazı sayfaları açmaya hazırsınız demektir. Herhangi bir sayfayı açmak için "get" komutunu kullanın.
url = 'https://www.google.com/maps/search/bars+near+NY,+USA/@40.7443439,-74.0197995,13z'
driver.get(url)
Harita Arama İçeriğini Ayrıştırma
Sayfanız açıldığında, tarayıcı pencerenizde python kodunuz tarafından kontrol edilen sayfayı göreceksiniz. ChromeDriver'dan HTML sayfa içeriğini almak için aşağıdaki kodu çalıştırabilirsiniz.
page_content = driver.page_source
HTML içeriğini rahatça görmek için, tarayıcı penceresinin sağ üst köşesindeki Chrome Menüsünü açıp Diğer Araçlar > Geliştirici Araçları'nı seçerek Chrome'da geliştirici konsolunu açın. Şimdi sayfanızın öğelerini görebilmeniz gerekir.
Favori ayrıştırma araçlarınızı kullanarak HTML sayfasındaki içeriği ayrıştırabilirsiniz. Biz kullanacağız Parsel bu eğitimde.
from parsel import Selector
response = Selector(page_content)
Listeler üzerinde yineleme yapın ve her bir yerin verilerini alın.
results = []
for el in response.xpath('//div[contains(@aria-label, "Results for")]/div/div[./a]'):
results.append({
'link': el.xpath('./a/@href').extract_first(''),
'title': el.xpath('./a/@aria-label').extract_first('')
})
print(results)
Google Haritalar yerlerinden çıktı (kısaltılmış).
[
{
'link': 'https://www.google.com/maps/place/Black+Iron+Burger/data=!4m5!3m4!1s0x89c259acf2c7299d:0x149a07481483ce!8m2!3d40.7542649!4d-73.990364?authuser=0&hl=en&rclk=1',
'title': 'Black Iron Burger'
},
{
'link': 'https://www.google.com/maps/place/Fools+Gold+NYC/data=!4m5!3m4!1s0x89c259846e633763:0x69420cb6024065f9!8m2!3d40.723028!4d-73.989794?authuser=0&hl=en&rclk=1',
'title': 'Fools Gold NYC'
},
{
'link': 'https://www.google.com/maps/place/11th+St.+Bar/data=!4m5!3m4!1s0x89c25976492b11ff:0x14f9cacdef3eb7c1!8m2!3d40.7280546!4d-73.9812525?authuser=0&hl=en&rclk=1',
'title': '11th St. Bar'
},
...
]
Çıkarma İşlemi Tamamlandığında Sürücüyü Durdurun
Sürücüyü kazıma işleminden önce ve sonra uygun şekilde başlatmak ve durdurmak önemlidir. Bu, internette gezinmeden önce ve sonra tarayıcınızı açıp kapatmanızla aynıdır. Aşağıdaki kodu çalıştırarak sürücüyü kapatın.
driver.quit()
Sıyırıcının Ölçeklendirilmesi ve Daha Sağlam Hale Getirilmesine İlişkin Sonuç ve Öneriler
Google Haritalar'ın zorlu HTML yapısına rağmen, Selenium ve iyi bir XPath ve CSS seçici bilgisi ile kazıma işleminde oldukça iyi sonuçlar elde edebilirsiniz. Bu tarayıcı emülatörü kullanma yöntemi sizi engellenmekten koruyacaktır. Ancak, uygulamanızı ölçeklendirecekseniz, bazı beklenmedik sorunlardan kaçınmak için proxy kullanmayı da düşünebilirsiniz.
Paralel Çalıştırma
Sürücüleri çoklu işlemde (multithreading değil) çalıştırmak mümkündür ancak her sürücü bir CPU tüketecektir. Yeterli sayıda CPU'ya sahip olduğunuzdan emin olun.
Google Haritaları Kurumsal Ölçekte Kazımanın En İyi Yolu
Google'ı kazımak oldukça zor olabileceğinden, birçok şirket ve büyük kuruluş kendi tarayıcılarını geliştirmek ve sürdürmek için zaman harcamadan milyonlarca sayfayı kazımaya başlamak istiyor.
Google Haritalar'ı kazımaya başlamanın en kolay yolu Outscraper Platform (sonuçları CSV dosyalarında almak için), Outscraper Google Haritalar Yorumları APIveya SDK'lar (koda entegre etmek için).
Google Haritalar Kazımaya Başlamanın En Kolay Yolu
Aşağıdaki komutu çalıştırarak Outscraper'nin SDK'sını yükleyin.
pip install google-services-api
İstemciyi başlatın ve Google'da listeleri arayın veya yer kimliklerini göndererek belirli olanları ayrıştırın.
* API belirtecini (SECRET_API_KEY) şu adresten alabilirsiniz profil sayfası
from outscraper import ApiClient
api_client = ApiClient(api_key='SECRET_API_KEY')
# Search for businesses in specific locations:
result = api_client.google_maps_search('restaurants brooklyn usa', limit=20, language='en')
# Get data of the specific place by id
result = api_client.google_maps_search('ChIJrc9T9fpYwokRdvjYRHT8nI4', language='en')
# Search with many queries (batching)
result = api_client.google_maps_search([
'restaurants brooklyn usa',
'bars brooklyn usa',
], language='en')
print(result)
Sonuç çıktısı (kısaltılmış).
[
[
{
"name": "Colonie",
"full_address": "127 Atlantic Ave, Brooklyn, NY 11201",
"borough": "Brooklyn Heights",
"street": "127 Atlantic Ave",
"city": "Brooklyn",
"postal_code": "11201",
"country_code": "US",
"country": "United States of America",
"us_state": "New York",
"state": "New York",
"plus_code": null,
"latitude": 40.6908464,
"longitude": -73.9958422,
"time_zone": "America/New_York",
"popular_times": null,
"site": "http://www.colonienyc.com/",
"phone": "+1 718-855-7500",
"type": "American restaurant",
"category": "restaurants",
"subtypes": "American restaurant, Cocktail bar, Italian restaurant, Organic restaurant, Restaurant, Wine bar",
"posts": null,
"rating": 4.6,
"reviews": 666,
"reviews_data": null,
"photos_count": 486,
"google_id": "0x89c25a4590b8c863:0xc4a4271f166de1e2",
"place_id": "ChIJY8i4kEVawokR4uFtFh8npMQ",
"reviews_link": "https://search.google.com/local/reviews?placeid=ChIJY8i4kEVawokR4uFtFh8npMQ&q=restaurants+brooklyn+usa&authuser=0&hl=en&gl=US",
"reviews_id": "-4277250731621359134",
"photo": "https://lh5.googleusercontent.com/p/AF1QipN_Ani32z-7b9XD182oeXKgQ-DIhLcgL09gyMZf=w800-h500-k-no",
"street_view": "https://lh5.googleusercontent.com/p/AF1QipN_Ani32z-7b9XD182oeXKgQ-DIhLcgL09gyMZf=w1600-h1000-k-no",
"working_hours_old_format": "Monday: 5\\u20139:30PM | Tuesday: Closed | Wednesday: Closed | Thursday: 5\\u20139:30PM | Friday: 5\\u20139:30PM | Saturday: 11AM\\u20133PM,5\\u20139:30PM | Sunday: 11AM\\u20133PM,5\\u20139:30PM",
"working_hours": {
"Monday": "5\\u20139:30PM",
"Tuesday": "Closed",
"Wednesday": "Closed",
"Thursday": "5\\u20139:30PM",
"Friday": "5\\u20139:30PM",
"Saturday": "11AM\\u20133PM,5\\u20139:30PM",
"Sunday": "11AM\\u20133PM,5\\u20139:30PM"
},
"business_status": "OPERATIONAL",
},
"reserving_table_link": "https://resy.com/cities/ny/colonie",
"booking_appointment_link": "https://resy.com/cities/ny/colonie",
"owner_id": "114275131377272904229",
"verified": true,
"owner_title": "Colonie",
"owner_link": "https://www.google.com/maps/contrib/114275131377272904229",
"location_link": "https://www.google.com/maps/place/Colonie/@40.6908464,-73.9958422,14z/data=!4m8!1m2!2m1!1sColonie!3m4!1s0x89c25a4590b8c863:0xc4a4271f166de1e2!8m2!3d40.6908464!4d-73.9958422"
...
},
...
]
]
Ekstra: Google Yorumları Kazımaya Başlamanın En Kolay Yolu
Aşağıdaki kodu çalıştırarak incelemeleri çıkarabilirsiniz (python paketini yüklediğinizi ve istemciyi başlattığınızı varsayıyoruz).
# Get reviews of the specific place by id
result = api_client.google_maps_reviews('ChIJrc9T9fpYwokRdvjYRHT8nI4', reviewsLimit=20, language='en')
# Get reviews for places found by search query
result = api_client.google_maps_reviews('Memphis Seoul brooklyn usa', reviewsLimit=20, limit=500, language='en')
# Get only new reviews during last 24 hours
from datetime import datetime, timedelta
yesterday_timestamp = int((datetime.now() - timedelta(1)).timestamp())
result = api_client.google_maps_reviews(
'ChIJrc9T9fpYwokRdvjYRHT8nI4', sort='newest', cutoff=yesterday_timestamp, reviewsLimit=100, language='en')
Sonuç çıktısı (kısaltılmış).
{
"name": "Memphis Seoul",
"address": "569 Lincoln Pl, Brooklyn, NY 11238, \\u0421\\u043f\\u043e\\u043b\\u0443\\u0447\\u0435\\u043d\\u0456 \\u0428\\u0442\\u0430\\u0442\\u0438",
"address_street": "569 Lincoln Pl",
"owner_id": "100347822687163365487",
"owner_link": "https://www.google.com/maps/contrib/100347822687163365487",
...
"reviews_data": [
{
"google_id": "0x89c25bb5950fc305:0x330a88bf1482581d",
"autor_link": "https://www.google.com/maps/contrib/112314095435657473333?hl=en-US",
"autor_name": "Eliott Levy",
"autor_id": "112314095435657473333",
"review_text": "Very good local comfort fusion food ! \\nKimchi coleslaw !! Such an amazing idea !",
"review_link": "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s112314095435657473333!2s0x0:0x330a88bf1482581d?hl=en-US",
"review_rating": 5,
"review_timestamp": 1560692128,
"review_datetime_utc": "06/16/2019 13:35:28",
"review_likes": null
},
{
"google_id": "0x89c25bb5950fc305:0x330a88bf1482581d",
"autor_link": "https://www.google.com/maps/contrib/106144075337788507031?hl=en-US",
"autor_name": "fenwar1",
"autor_id": "106144075337788507031",
"review_text": "Great wings with several kinds of hot sauce. The mac and cheese ramen is excellent.\\nUPDATE:\\nReturned later to try the meatloaf slider, a thick meaty slice topped with slaw and a fantastic sauce- delicious. \\nConsider me a regular.\\ud83d\\udc4d",
"review_link": "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s106144075337788507031!2s0x0:0x330a88bf1482581d?hl=en-US",
"review_rating": 5,
"review_timestamp": 1571100055,
"review_datetime_utc": "10/15/2019 00:40:55",
"review_likes": null
},
...
]
}
SSS
SIKÇA SORULAN SORULAR
Outscraper'nin SDK'sı sayesinde Python Selenium ile Google Maps verilerini kazımak mümkün. Neler yapabileceğinizi görmek için Outscraper Google Maps Places API belgelerine göz atın.
Python ve Selenium kullanarak, Google Haritalar'dan veri kazıma işlemini otomatikleştirmek mümkündür. Outscraper şunları sunar Google Maps Places API ve SDK'lar bu görevi basitleştirir.
Python ve Selenium kullanarak Google Maps kazıma işlemini otomatikleştirmek mümkündür. Outscraper Google Maps Places API ve SDK'lar bunu en kolay şekilde yapmanızı sağlar.
0 Yorum