Kafayı yiyecektim dostlar. Şaka gibi bir durum. Bir veri seti için basit bir scraper yazmam gerekiyordu. "Ne var bunda, Requests ve BeautifulSoup alayım, 10 satırda hallederim" diye düşündüm. Her zamanki gibi.
Python:
import requests
from bs4 import BeautifulSoup
url = "hedef_site.com/veriler"
response = requests.get(url)
Kod çalıştı, hata vermedi. Ama response.url'yi yazdırdığımda gördüğüm şey beni benden aldı. "hedef_site.com/bot-tespit/ben-bir-botum" gibi bir sayfaya yönlendirilmişim! Status code da 200'tü üstelik, yani hata bile yok. İçeriği .text ile yazdırdım, karşımda "Merhaba, görünüşe göre bir botsunuz..." yazan bir sayfa.
Meğerse sorun şuradaymış: Site, requests.get() ile gelen isteklerin header'larını (özellikle User-Agent) analiz ediyormuş. Requests'in default User-Agent'ı "python-requests/x.x.x" şeklinde. Bu da siteye "BEN BOTUM, KOD YAZIYORUM" diye bağırmakla eşdeğer.
StackOverflow'da bile direkt bulamadığım, biraz araştırınca öğrendiğim çözüm basitti. İsteğe gerçek bir tarayıcı gibi görünen header'lar eklemek. Hemen bir headers sözlüğü hazırladım.
Python:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...'
}
response = requests.get(url, headers=headers)
Bu sefer oldu! Site beni gerçek bir kullanıcı sandı ve istediğim verileri gönderdi. Bazen en basit şeyler, en büyük duvar olabiliyor.
Siz de böyle "ben botum" sayfalarına yönlendirildiğiniz oldu mu? User-Agent dışında başka hangi tuzaklara düşmemek için header'lara neler eklemeliyiz? Belki Accept-Language veya Referer da önemlidir? Fikirlerinizi bekliyorum!