En son haber başlıklarını toplamak, haber trendlerini izlemek ve mevcut konularda duygu analizi yapmak için Google Haberler'i kazımak paha biçilmez bir araç olduğunu kanıtlıyor. Bu makalede, Python aracılığıyla Google News'i kazıma sürecinde size rehberlik edeceğiz. Sayfa içeriğini elde etmek için bir requests kütüphanesi kullanacağız; HTML belgelerini ayrıştırmak ve gerekli verileri çıkarmak için lxml. Bu eğitimin sonunda, haber başlıklarını ve ilgili bağlantılarını Google Haberler'den yapılandırılmış JSON biçimine nasıl çıkaracağınızı öğreneceksiniz.
Başlamadan önce, sisteminizde Python'un kurulu olduğundan emin olun. Aşağıdaki komutları çalıştırarak gerekli kütüphaneleri yükleyebilirsiniz:
pip install requests
pip install lxml
Bu kütüphaneler HTTP istekleri yapmamızı ve web sayfasının HTML içeriğini ayrıştırmamızı sağlayacaktır.
Aşağıdaki URL'deki Google Haberler sayfasını kazıyacağız:
URL = "https://news.google.com/topics/CAAqKggKIiRDQkFTRlFvSUwyMHZNRGRqTVhZU0JXVnVMVWRDR2dKSlRpZ0FQAQ?hl=en-US&gl=US&ceid=US%3Aen"
Bu sayfa, her biri bir ana başlığa ve ilgili makalelere sahip birden fazla haber öğesi içerir. Bu öğeler için XPath yapısı aşağıdaki gibidir:
Google Haberler'in HTML yapısı farklı sayfalar arasında tutarlı kalır ve belirtilen XPath öğelerinin evrensel olarak uygulanabilir olmasını sağlar.
Google News sayfasının içeriğini requests kütüphanesini kullanarak getirerek başlayacağız. İşte sayfa içeriğini getirmek için kod:
import requests
url = "https://news.google.com/topics/CAAqKggKIiRDQkFTRlFvSUwyMHZNRGRqTVhZU0JXVnVMVWRDR2dKSlRpZ0FQAQ?hl=en-US&gl=US&ceid=US%3Aen"
response = requests.get(url)
if response.status_code == 200:
page_content = response.content
else:
print(f"Failed to retrieve the page. Status code: {response.status_code}")
Bu kod, Google Haberler URL'sine bir GET isteği gönderir ve sayfanın HTML içeriğini page_content değişkeninde saklar.
HTML içeriği elimizdeyken, sayfayı ayrıştırmak ve haber başlıklarını ve bağlantılarını çıkarmak için lxml kullanabiliriz.
from lxml import html
# HTML içeriğini ayrıştırma
parser = html.fromstring(page_content)
Google Haberler, makalelerini belirli kapsayıcılar içinde düzenler. Önce bu kapsayıcıları XPath'lerini kullanarak ayıklayacağız ve ardından tek tek haber başlıklarını ve bağlantılarını ayıklamak için bunları yineleyeceğiz.
Ana haber makaleleri aşağıdaki XPath altında yer almaktadır:
main_news_elements = parser.xpath('//c-wiz[@jsrenderer="ARwRbe"]')
Şimdi ilk 10 geçerli öğe arasında döngü yapabilir ve başlıkları ve bağlantıları çıkarabiliriz:
news_data = []
for element in main_news_elements[:10]:
title = element.xpath('.//c-wiz/div/article/a/text()')[0]
link = "https://news.google.com" + element.xpath('.//c-wiz/div/article/a/@href')[0][1:]
# Listeye eklemeden önce verilerin var olduğundan emin olun
if title and link:
news_data.append({
"main_title": title,
"main_link": link,
})
Ana haber öğesi, ilgili haberlerin bulunduğu alt bölümlere sahiptir. Bunları benzer bir yaklaşım kullanarak çıkarabiliriz:
related_articles = []
related_news_elements = element.xpath('.//c-wiz/div/div/article')
for related_element in related_news_elements:
related_title = related_element.xpath('.//a/text()')[0]
related_link = "https://news.google.com" + related_element.xpath('.//a/@href')[0][1:]
related_articles.append({"title": related_title, "link": related_link})
news_data.append({
"main_title": title,
"main_link": link,
"related_articles": related_articles
})
Verileri çıkardıktan sonra, daha sonra kullanmak üzere bir JSON dosyasına kaydedebiliriz.
import json
with open('google_news_data.json', 'w') as f:
json.dump(news_data, f, indent=4)
Bu kod, kazınan tüm haber başlıklarını ve ilgili bağlantılarını içeren google_news_data.json adlı bir dosya oluşturacaktır.
Özellikle Google Haberler gibi yüksek trafikli sitelerden büyük miktarda veri kazırken, IP engelleme veya hız sınırlaması gibi sorunlarla karşılaşabilirsiniz. Bundan kaçınmak için proxy'leri kullanabilirsiniz. Proxy'ler, isteklerinizi farklı IP adresleri üzerinden yönlendirmenize olanak tanıyarak web sitesinin kazıma faaliyetlerinizi tespit etmesini ve engellemesini zorlaştırır.
Bu eğitim için requests.get çağrısını değiştirerek bir proxy kullanabilirsiniz:
proxies = {
"http": "http://your_proxy_ip:port",
"https": "https://your_proxy_ip:port",
}
response = requests.get(url, proxies=proxies)
Proxy rotasyonunu yöneten bir hizmet sağlayıcıyla çalışıyorsanız, yalnızca isteklerinizdeki hizmeti yapılandırmanız gerekir. Sağlayıcı, rotasyon ve IP havuzu yönetimini kendi tarafında halledecektir.
Bazen web siteleri, isteğin bir tarayıcıdan geldiğini tanımlayan kullanıcı aracısı dizesi gibi uygun başlıklara sahip olmayan istekleri engelleyebilir. Tespit edilmekten kaçınmak için başlıklarınızı özelleştirebilirsiniz:
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
'sec-ch-ua-arch': '"x86"',
'sec-ch-ua-bitness': '"64"',
'sec-ch-ua-full-version-list': '"Not)A;Brand";v="99.0.0.0", "Google Chrome";v="127.0.6533.72", "Chromium";v="127.0.6533.72"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-model': '""',
'sec-ch-ua-platform': '"Linux"',
'sec-ch-ua-platform-version': '"6.5.0"',
'sec-ch-ua-wow64': '?0',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
}
response = requests.get(url, headers=headers)
İşte tüm adımları birleştiren tam kod:
import requests
import urllib3
from lxml import html
import json
urllib3.disable_warnings()
# URL ve başlıklar
url = "https://news.google.com/topics/CAAqKggKIiRDQkFTRlFvSUwyMHZNRGRqTVhZU0JXVnVMVWRDR2dKSlRpZ0FQAQ?hl=en-US&gl=US&ceid=US%3Aen"
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
'sec-ch-ua-arch': '"x86"',
'sec-ch-ua-bitness': '"64"',
'sec-ch-ua-full-version-list': '"Not)A;Brand";v="99.0.0.0", "Google Chrome";v="127.0.6533.72", "Chromium";v="127.0.6533.72"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-model': '""',
'sec-ch-ua-platform': '"Linux"',
'sec-ch-ua-platform-version': '"6.5.0"',
'sec-ch-ua-wow64': '?0',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
}
# Proxy yapılandırması (proxy ayrıntılarınızla değiştirin)
proxy = 'ip:port'
proxies = {
"http": f"http://{proxy}",
"https": f"https://{proxy}",
}
# Sayfa içeriğini belirtilen başlıklar ve proxy'lerle getirme
response = requests.get(url, headers=headers, proxies=proxies, verify=False)
# İsteğin başarılı olup olmadığını kontrol edin
if response.status_code == 200:
page_content = response.content
else:
print(f"Failed to retrieve the page. Status code: {response.status_code}")
exit()
# HTML içeriğini lxml kullanarak ayrıştırma
parser = html.fromstring(page_content)
# Ana haberleri ve ilgili makaleleri çıkarın
main_news_elements = parser.xpath('//*[@id="i10-panel"]/c-wiz/c-wiz')
# Çıkarılan haber verilerini saklamak için bir liste başlatın
news_data = []
# Her ana haber öğesi arasında döngü
for element in main_news_elements[:10]:
# Ana haber başlığını ve bağlantısını çıkarın
title = element.xpath('.//c-wiz/div/article/a/text()')
link = element.xpath('.//c-wiz/div/article/a/@href')
# Bu ana haberle ilgili makaleleri saklamak için bir liste başlatın
related_articles = []
# Aynı blok içindeki ilgili haber öğelerini ayıklayın
related_news_elements = element.xpath('.//c-wiz/div/div/article')
# İlgili her haber öğesi arasında döngü oluşturun ve başlığı ve bağlantıyı çıkarın
for related_element in related_news_elements:
related_title = related_element.xpath('.//a/text()')[0]
related_link = "https://news.google.com" + related_element.xpath('.//a/@href')[0][1:]
related_articles.append({"title": related_title, "link": related_link})
# Ana haberleri ve ilgili makaleleri news_data listesine ekleyin
if title is not None:
news_data.append({
"main_title": title,
"main_link": f'https://news.google.com{link}',
"related_articles": related_articles
})
else:
continue
# Çıkarılan verileri bir JSON dosyasına kaydedin
with open("google_news_data.json", "w") as json_file:
json.dump(news_data, json_file, indent=4)
print('Data extraction complete. Saved to google_news_data.json')
Google News'i Python kullanarak kazımak, requests ve lxml kütüphaneleri ile birlikte, haber trendlerinin ayrıntılı analizini kolaylaştırır. Proxy'leri uygulamak ve istek başlıklarını yapılandırmak, engellemeleri önlemek ve kazıyıcı kararlılığını korumak için çok önemlidir. Bu amaç için ideal proxy'ler arasında IPv4 ve IPv6 veri merkezi proxy'leri ve yüksek hızlar ve düşük ping sunan ISP proxy'leri bulunur. Ayrıca, dinamik konut vekilleri, üstün güven faktörleri nedeniyle oldukça etkilidir.
Yorumlar: 0