Cara mengikis artikel Medium menggunakan Python

Komentar: 0

Mengekstrak artikel dari Medium dapat menjadi sangat penting untuk tujuan seperti evaluasi konten, pengumpulan data, atau memantau penulis dan karya-karya mereka. Dalam tutorial ini, kita akan belajar bagaimana cara mengikis artikel dari Medium - sebuah situs web artikel untuk para penulis, dengan menggunakan bahasa pemrograman python. Kita akan membahas bagaimana data seperti judul artikel, nama penulis, nama publikasi, dan isi teks itu sendiri dapat diekstrak dari URL web yang diberikan dari artikel Medium.

Persyaratan

Untuk tutorial ini, kita akan mengambil artikel ini di Medium: "9 Dekorator Bawaan Python yang Mengoptimalkan Kode Anda Secara Signifikan".

Sebelum memulai, instal library berikut ini:

  • Requests: Untuk mengirim permintaan HTTP ke Medium.
  • lxml: Untuk mengurai konten HTML.
  • Pandas: Untuk menyimpan data ke file CSV.

Instal dengan perintah berikut ini:


pip install requests
pip install lxml 
pip install pandas

Memahami pentingnya header dan proksi

Medium menggunakan teknik deteksi bot untuk mencegah pengikisan yang tidak sah. Header dan proxy yang tepat sangat penting untuk menghindari deteksi bot dan untuk scraping yang bertanggung jawab.

Header: Header ini mensimulasikan permintaan seolah-olah berasal dari peramban sungguhan. Header ini mencakup informasi seperti jenis peramban, jenis konten yang diterima, dan perilaku caching.


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: Proksi dapat menyamarkan alamat IP Anda, memutarnya secara berkala untuk memperkecil kemungkinan permintaan diblokir oleh Medium. Berikut ini adalah contoh penggunaannya dengan autentikasi alamat IP:


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
)

Mengirim permintaan ke Medium

Berikut ini cara mengatur tajuk dan mengirim permintaan ke URL artikel:


import requests

# Header untuk mensimulasikan permintaan browser yang sebenarnya
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)

Mengekstrak data

Setelah kita memiliki konten halaman, kita dapat menguraikannya dan mengekstrak informasi yang relevan.

Mengurai Konten HTML

Kita akan menggunakan lxml untuk mem-parsing respons HTML dan mengekstrak elemen-elemen tertentu. Berikut ini cara melakukannya:


from lxml.html import fromstring

parser = fromstring(response.text)

# Ekstrak data
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]

Sekarang, kita akan membuat kamus untuk menampung semua data yang diekstrak. Hal ini akan mempermudah penyimpanan ke file CSV.


# Menyimpan data dalam kamus
article_data = {
    'Title': title,
    'Author': author,
    'Publication': publication_name,
    'Date': publication_date,
    'Followers': auth_followers,
    'Subtitle': sub_title,
    'Content': content,
}

print(article_data)

Menyimpan data ke file CSV

Terakhir, mari simpan data ke file CSV untuk analisis atau pencatatan lebih lanjut.


import pandas as pd

# Mengonversi kamus ke DataFrame dan menyimpannya sebagai CSV
df = pd.DataFrame([article_data])
df.to_csv('medium_article_data.csv', index=False)
print("Data saved to medium_article_data.csv")

Kode lengkap

Berikut adalah kode lengkap untuk mengikis data artikel Medium:


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

# Header untuk meniru browser
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'
}

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

# Mengurai halaman
parser = fromstring(response.text)

# Ekstrak data
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]

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

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

Mengambil konten dari Medium harus dilakukan secara bertanggung jawab. Beban permintaan yang berlebihan pada server dapat memengaruhi kinerja layanan, dan mengambil data tanpa izin dapat melanggar ketentuan penggunaan situs web. Selalu periksa file robots.txt dan ketentuan sebelum melakukan scraping situs web apa pun.

Komentar:

0 komentar