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.
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:
Instal dengan perintah berikut ini:
pip install requests
pip install lxml
pip install pandas
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
)
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)
Setelah kita memiliki konten halaman, kita dapat menguraikannya dan mengekstrak informasi yang relevan.
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)
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")
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