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 müşterilerin 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.
ChromeDriver'ın tarayıcı sürümünüze ve işletim sistemi türünüze uyan 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 selenium yükleyin
pip install parsel #, XPath veya CSS seçicileri kullanarak HTML'den veri ayıklamak için
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 kod ile başlatın. Yeni Chrome penceresinin açıldığını görmelisiniz.
from selenium import webdriver
chromedrive_path = './chromedriver' # önceki adımlarda indirdiğiniz sürücünün yolunu kullanın
driver = webdriver.Chrome(chromedrive_path)
Mac'te aşağıdakileri görebilirsiniz: "geliştirici doğrulanamadığı için chromedriver açılamıyor". Bunun üstesinden gelmek için Finder'da chromedriver'a kontrol-tıklayın, menüden Aç'ı seçin ve ardından görüntülenen iletişim kutusunda Aç'a tıklayın. Açılan terminal pencerelerinde "ChromeDriver başarıyla başlatıldı" ifadesini 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 Seçici
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(sonuçlar)
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',
'başlık': 'Siyah Demir 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',
'başlık': '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',
'başlık': '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 çalıştırmak ve durdurmak önemlidir. Bu, internette gezinmeden önce ve sonra tarayıcınızı açıp kapatmanızla aynı şeydir. 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), 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')
# Belirli konumlardaki işletmeleri arayın:
result = api_client.google_maps_search('restaurants brooklyn usa', limit=20, language='en')
# Belirli bir yerin verilerini kimliğe göre al
result = api_client.google_maps_search('ChIJrc9T9fpYwokRdvjYRHT8nI4', language='en')
# Çok sayıda sorgu ile arama (batching)
result = api_client.google_maps_search([
"restoranlar brooklyn usa",
"barlar brooklyn usa",
], language='en')
print(sonuç)
Sonuç çıktısı (kısaltılmış).
[
[
{
"İsim": "Colonie",
"tam_adres": "127 Atlantic Ave, Brooklyn, NY 11201",
"Borough": "Brooklyn Heights",
"sokak": "127 Atlantic Ave",
"Şehir": "Brooklyn",
"posta_kodu": "11201",
"ülke_kodu": "ABD",
"ülke": "Amerika Birleşik Devletleri",
"us_state": "New York",
"Eyalet": "New York",
"plus_code": null,
"Enlem": 40.6908464,
"Boylam": -73.9958422,
"time_zone": "Amerika/New_York",
"popular_times": null,
"site": "http://www.colonienyc.com/",
"Telefon": "+1 718-855-7500",
"tip": "Amerikan restoranı",
"kategori": "restoranlar",
"alt türler": "Amerikan restoranı, Kokteyl barı, İtalyan restoranı, Organik Ürünler Restoranı, Restoran, Şarap barı",
"gönderiler": null,
"rating": 4.6,
"yorumlar": 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",
"fotoğraf": "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": "Pazartesi: 5\\u20139:30pm | Salı: Kapalı | Çarşamba: Kapalı | Perşembe: 17:30 | Cuma: 5\\u20139:30pm | Cumartesi: Saat 11:00, 17:00, 30:00 Pazar: Saat 11:00, 17:00, 30:00",
"working_hours": {
"Pazartesi": "5\\u20139:30PM",
"Salı": "Kapalı",
"Çarşamba": "Kapalı",
"Perşembe": "5\\u20139:30PM",
"Cuma": "5\\u20139:30PM",
"Cumartesi": "11AM\\u20133PM,5\\u20139:30PM",
"Pazar": "11AM\\u20133PM,5\\u20139:30PM"
},
"business_status": "OPERASYONEL",
},
"reserving_table_link": "https://resy.com/cities/ny/colonie",
"booking_appointment_link": "https://resy.com/cities/ny/colonie",
"owner_id": "114275131377272904229",
"doğrulandı": doğru,
"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).
# Belirli bir yerin yorumlarını kimliğe göre al
result = api_client.google_maps_reviews('ChIJrc9T9fpYwokRdvjYRHT8nI4', reviewsLimit=20, language='en')
# Arama sorgusu ile bulunan yerler için yorumları alın
result = api_client.google_maps_reviews('Memphis Seoul brooklyn usa', reviewsLimit=20, limit=500, language='en')
# Yalnızca son 24 saat içindeki yeni yorumları alın
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ış).
{
"İsim": "Memphis Seoul",
"Adres": "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": "Çok iyi yerel konfor füzyon gıda! \\nKimchi lahana salatası!! Harika bir fikir!",
"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": "Birkaç çeşit acı sos ile harika kanatlar. Mac ve peynirli ramen mükemmel.\\nUPDATE:\\nDaha sonra köfte kaydırıcısını denemek için geri döndü, lahana salatası ve harika bir sosla doldurulmuş kalın etli bir dilim - lezzetli. \\nBeni müdavimlerinden biri olarak düşünün.\\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
},
...
]
}
0 Yorumlar