Python kullanarak Medium makaleleri nasıl kazınır?

Yorumlar: 0

Medium'dan makale çıkarmak, içerik değerlendirme, veri toplama veya yazarları ve çalışmalarını izleme gibi amaçlar için son derece önemli olabilir. Bu eğitimde, python programlama dilini kullanarak yazarlar için bir makale web sitesi olan medium'u nasıl kazıyacağımızı öğreneceğiz. Makale başlığı, yazar adı, yayın adı ve metin gövdesi gibi verilerin bir Medium makalesinin belirli bir web URL'sinden nasıl çıkarılabileceğini tartışacağız.

Gereksinimler

Bu eğitim için Medium'daki şu makaleden yararlanacağız: "Kodunuzu Önemli Ölçüde Optimize Eden 9 Python Yerleşik Dekoratörü".

Başlamadan önce aşağıdaki kütüphaneleri yükleyin:

  • Requests: HTTP isteklerini Medium'a göndermek için.
  • lxml: HTML içeriğini ayrıştırmak için.
  • Pandas: Verileri bir CSV dosyasına kaydetmek için.

Bunları aşağıdaki komutlarla kurun:


pip install requests
pip install lxml 
pip install pandas

Üstbilgilerin ve proxy'lerin önemini anlamak

Medium, yetkisiz kazımayı önlemek için bot algılama teknikleri kullanır. Uygun başlıklar ve proxyler, bot tespitinden kaçınmak ve sorumlu kazıma için çok önemlidir.

Headers: Bunlar bir isteği gerçek bir tarayıcıdan geliyormuş gibi simüle eder. Tarayıcı türü, kabul edilen içerik türleri ve önbelleğe alma davranışı gibi bilgileri içerirler.


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': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    '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/129.0.0.0 Safari/537.36',
}

Proxy'ler: Proxy'ler IP adresinizi maskeleyebilir, isteklerin Medium tarafından engellenme olasılığını azaltmak için periyodik olarak döndürür. İşte IP adresi kimlik doğrulaması ile kullanımına bir örnek:


proxies = {
    'http': 'IP:PORT',
    'https': 'IP:PORT'
}

response = requests.get(
 'https://medium.com/techtofreedom/9-python-built-in-decorators-that-optimize-your-code-significantly-bc3f661e9017',
    headers=headers,
    proxies=proxies
)

Media'ya bir istek gönderme

Başlıkların nasıl ayarlanacağı ve makale URL'sine nasıl istek gönderileceği aşağıda açıklanmıştır:


import requests

# Gerçek bir tarayıcı isteğini simüle etmek için başlıklar
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': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    '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/129.0.0.0 Safari/537.36',
}

url = 'https://medium.com/techtofreedom/9-python-built-in-decorators-that-optimize-your-code-significantly-bc3f661e9017'
response = requests.get(url, headers=headers)

Veri çıkarma

Sayfa içeriğine sahip olduğumuzda, bunu ayrıştırabilir ve ilgili bilgileri çıkarabiliriz.

HTML İçeriğini Ayrıştırma

HTML yanıtını ayrıştırmak ve belirli öğeleri ayıklamak için lxml kullanacağız. İşte nasıl yapılacağı:


from lxml.html import fromstring

parser = fromstring(response.text)

# Veri ayıklama
title = parser.xpath('//h1[@data-testid="storyTitle"]/text()')[0]
author = parser.xpath('//a[@data-testid="authorName"]/text()')[0]
publication_name = parser.xpath('//a[@data-testid="publicationName"]/p/text()')[0]
publication_date = parser.xpath('//span[@data-testid="storyPublishDate"]/text()')[0]
content = '\n '.join(parser.xpath('//div[@class="ci bh ga gb gc gd"]/p/text()'))
auth_followers = parser.xpath('//span[@class="pw-follower-count bf b bg z bk"]/a/text()')[0]
sub_title = parser.xpath('//h2[@id="1de6"]/text()')[0]

Şimdi, çıkarılan tüm verileri tutmak için bir sözlük oluşturacağız. Bu, bir CSV dosyasına kaydetmeyi kolaylaştırır.


# Verileri bir sözlüğe kaydetme
article_data = {
    'Title': title,
    'Author': author,
    'Publication': publication_name,
    'Date': publication_date,
    'Followers': auth_followers,
    'Subtitle': sub_title,
    'Content': content,
}

print(article_data)

Verileri bir CSV dosyasına kaydetme

Son olarak, daha fazla analiz veya kayıt tutma için verileri bir CSV dosyasına kaydedelim.


import pandas as pd

# Sözlüğü DataFrame'e dönüştürme ve CSV olarak kaydetme
df = pd.DataFrame([article_data])
df.to_csv('medium_article_data.csv', index=False)
print("Data saved to medium_article_data.csv")

Tam kod

İşte Medium makale verilerini kazımak için tam kod:


import requests
from lxml.html import fromstring
import pandas as pd

# Bir tarayıcıyı taklit etmek için başlıklar
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': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    '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/129.0.0.0 Safari/537.36',
}


proxies = {
    'http': 'IP:PORT',
    'https': 'IP:PORT'
}

# Sayfayı talep etme
url = 'https://medium.com/techtofreedom/9-python-built-in-decorators-that-optimize-your-code-significantly-bc3f661e9017'
response = requests.get(url, headers=headers, proxies=proxies)

# Sayfayı ayrıştırma
parser = fromstring(response.text)

# Veri ayıklama
title = parser.xpath('//h1[@data-testid="storyTitle"]/text()')[0]
author = parser.xpath('//a[@data-testid="authorName"]/text()')[0]
publication_name = parser.xpath('//a[@data-testid="publicationName"]/p/text()')[0]
publication_date = parser.xpath('//span[@data-testid="storyPublishDate"]/text()')[0]
content = '\n '.join(parser.xpath('//div[@class="ci bh ga gb gc gd"]/p/text()'))
auth_followers = parser.xpath('//span[@class="pw-follower-count bf b bg z bk"]/a/text()')[0]
sub_title = parser.xpath('//h2[@id="1de6"]/text()')[0]

# Veri kaydetme
article_data = {
    'Title': title,
    'Author': author,
    'Publication': publication_name,
    'Date': publication_date,
    'Followers': auth_followers,
    'Subtitle': sub_title,
    'Content': content,
}

# CSV'ye Kaydet
df = pd.DataFrame([article_data])
df.to_csv('medium_article_data.csv', index=False)
print("Data saved to medium_article_data.csv")

Medium'dan içerik kazıma işlemi sorumlu bir şekilde yapılmalıdır. Sunucular üzerindeki aşırı istek yükü hizmetin performansını etkileyebilir ve izinsiz veri kazımak web sitesinin kullanım koşullarını ihlal edebilir. Herhangi bir web sitesini kazımadan önce her zaman robots.txt dosyasını ve şartları kontrol edin.

Yorumlar:

0 yorumlar