نحوه استفاده از Wikidata API (با مثال های پایتون)

در این آموزش، از کتابخانه درخواست‌های Python برای واکشی داده‌ها از Wikidata API استفاده می‌کنیم.

ما با جزئیات نحوه عملکرد Wikidata API و نحوه جمع‌آوری داده‌های مهم از صفحه Wikidata “Google LLC” با استفاده از Python را یاد خواهیم گرفت.

Wikidata API چیست؟

Wikidata API یک رابط برنامه نویسی کاربردی برای پرس و جو از پایگاه دانش ویکی داده است.

Wikidata API در مقابل Wikipedia API

در حالی که API ویکی‌پدیا به شما امکان می‌دهد محتوایی را که در صفحه واقعی ویکی‌پدیا پیدا می‌کنید پرس و جو کنید، API ویکی‌داده به شما امکان می‌دهد از داده‌های پشتی که برای ساخت محتوا در سراسر سازمان مدیاویکی استفاده می‌شود (ویکی‌سفر، ویکی‌پدیا، ویکی‌گونه‌ها و غیره) پرس و جو کنید.

بنابراین، با Wikidata API، به نوعی می‌توانید محتوای ویکی‌پدیا را پرس‌وجو کنید، اما با ویکی‌پدیا، ممکن است نتوانید برخی از داده‌های ویکی‌داده را پرس‌وجو کنید.

درخواست‌ها در مقابل Wrappers API

بسیاری از آموزش‌های موجود در وب به شما کمک می‌کنند تا APIهای پوشاننده پایتون مانند mkwikidata یا pywikibot را نصب کنید، اما من همیشه ترجیح می‌دهم از درخواست‌ها برای واکشی نقطه پایانی API خودم استفاده کنم زیرا منحنی یادگیری بسیار کوچک‌تر است و به کتابخانه‌هایی که تعداد زیادی نصب می‌کنند متکی نیست. از چیزهایی که شما نیاز ندارید

آنچه شما یاد خواهید گرفت

در این آموزش، شما یاد خواهید گرفت که از پایتون برای واکشی برخی از اطلاعاتی که به نظر من در ویکی داده مهم است، با استفاده از API آن استفاده کنید.

Wikidata API چگونه کار می کند؟

Wikidata API یک Open API است که به شما امکان می دهد با واکشی نقطه پایانی زیر، داده های آن را جستجو کنید.

https://www.wikidata.org/w/api.php

به این نقطه پایانی، پارامترهایی را می توان به درخواست اضافه کرد تا مشخص شود که کدام داده و در چه قالبی مورد نیاز است. پارامترها همه عناصر بعد از علامت سوال (?) هستند و با و (&) در URL از هم جدا می شوند.

به عنوان مثال، اگر URL زیر را در مرورگر خود باز کنید، API Wikidata را دریافت کرده اید.

https://www.wikidata.org/w/api.php?action=wbsearchentities&format=json&search=Google&language=en

نتیجه API در قالب JSON به شما بازگردانده شد که می‌تواند برای دریافت داده‌های اساسی تجزیه شود.

اقدامات ویکی داده

پارامتر اقدام Wikidata برای تعیین عملکردی که می‌خواهید API انجام دهد استفاده می‌شود. اقدامی که انتخاب کردید بر روش جستجوی داده ها تأثیر می گذارد.

دو عمل اصلی تحت پوشش این آموزش عبارتند از:

  • wbsearchentities
  • wbgetentities

اما اقدامات احتمالی بسیار بیشتری وجود دارد…

Wbsearchentities

wbsearchentities موجودیت ها را با استفاده از برچسب ها و نام های مستعار جستجو می کند. این به شما کمک می کند تا با استفاده از متن آزاد شناسه موجودیت را کشف کنید.

به عنوان مثال، با استفاده از عبارت جستجوی “Google” متوجه شوید که شناسه موجودیت آن Q9366 است.

Wbgetentities

عمل wbgetentities به شما کمک می‌کند تا داده‌های موجودیت‌های Wikibase را که شناسه آن‌ها را می‌دانید، دریافت کنید.

این به شما کمک می‌کند تمام داده‌های موجود برای یک شناسه ویکی‌داده داده شده را جستجو کنید.

شناسه ویکی داده یا با Wbsearchentities API یا در URL یا عنوان صفحه ویکی داده یافت می شود.

نحوه استفاده از Wikidata API با پایتون

اکنون، نمونه‌ای را نشان خواهم داد که چگونه می‌توان با استفاده از پایتون، با تلاش برای دریافت اطلاعات از صفحه ویکی‌داده Google LLC، داده‌های مهم را از API Wikidata جستجو کرد.

یک تابع برای واکشی API ایجاد کنید

این تابع از کتابخانه درخواست های پایتون برای واکشی نقطه پایانی ویکی داده استفاده می کند.

آرگومان params در مرحله بعد ارائه می شود و پارامترها (بعد از ? در URL) را به URL نقطه پایانی اضافه می کند.

فقط به URL که قبلاً در مرورگر کپی و جایگذاری کرده اید فکر کنید.

برای جلوگیری از شکستن کد در صورت وجود خطایی در درخواست، از کلمات کلیدی try و غیر استفاده می شود.

import requests

def fetch_wikidata(params):
    url = 'https://www.wikidata.org/w/api.php'
    try:
        return requests.get(url, params=params)
    except:
        return 'There was and error'

برای دریافت شناسه نهاد، wbsearchentities را واکشی کنید

اگر شناسه‌ای را که می‌خواهیم واکشی نکنیم ندانیم، نمی‌توانیم همه محتوای ویکی‌داده را واکشی کنیم.

بنابراین، برای دریافت شناسه باید از wbsearchentities استفاده کنیم.

برای انجام این کار، یک فرهنگ لغت پایتون با پارامترهای لازم برای اضافه شدن به URL ایجاد می کنیم. هر کلید، مقدار فرهنگ لغت یک پارامتر خواهد بود (که با &s در URL از هم جدا می شوند).

# What text to search for
query = 'Google LLC'

# Which parameters to use
params = {
        'action': 'wbsearchentities',
        'format': 'json',
        'search': query,
        'language': 'en'
    }

# Fetch API
data = fetch_wikidata(params)

#show response as JSON
data = data.json()
data

چیزی شبیه به این را برمی گرداند.

JSON جستجوی ویکی داده را تجزیه کنید

API جستجو یک JSON با سه بلوک اصلی را برمی‌گرداند که می‌توانید با استفاده از data.keys():

  • searchinfo: آنچه شما جستجو کردید
  • جستجو: نتیجه جستجوی شما
  • موفقیت: آیا درخواست شما کار می کند

در بلوک جستجو، لیستی از مواردی که جستجوی شما را برآورده می کند (نتایج جستجو) دریافت می کنید که می توانید با فهرست آن انتخاب کنید.

data['search'][0] # select first search result
data['search'][1] # select second search result

برای هر مورد، می توانید اطلاعاتی مانند عنوان، شناسه و زبان را انتخاب کنید.

data['search'][0]['id'] # select first search result ID
# 'Q95'

این شناسه ای است که ما برای پرس و جو از API با استفاده از عمل wbgetentities به آن نیاز داریم.

از طرف دیگر، می‌توانید نتایج را برای به دست آوردن همه آنها حلقه بزنید:

for elem in data['search']:
    print(elem['id'])

برای دریافت داده های موجودیت، wbgetentities را واکشی کنید

wbgetentities به شما این امکان را می دهد که داده ها را از یک یا چند موجودیت واکشی کنید.

هنگام واکشی چندین مورد، هر مورد را با (|) سمبل.

params = {
            'action': 'wbgetentities',
            'ids': 'id1|id2|id3'
            'format': 'json',
            'languages': 'en'
        }

در اینجا من شناسه Google LLC را که از پاسخ قبلی داشتیم واکشی می کنم.

# Get ID from the wbsearchentities response
id = data['search'][0]['id'] 

# Create parameters
params = {
            'action': 'wbgetentities',
            'ids':id, 
            'format': 'json',
            'languages': 'en'
        }

# fetch the API
data = fetch_wikidata(params)

# Show response
data = data.json()
data 

خروجی:

پاسخ Get Entities را تجزیه کنید

در حال حاضر، برای تجزیه این پاسخ نیاز به کار تحقیقی دارد. می توانید پاسخ JSON را با استفاده از روش هایی مانند:

object.keys() # Show keys of the object
object[key_name] # Show values of the object key

نکته ای که باید در نظر داشت این است که کلید ادعاها عناصر را با استفاده از فهرست فهرست می کند P123 قالب

به عنوان مثال:

data['entities'][id]['claims'].keys()

این شناسه شناسه خاصیت است که می توانید با نگه داشتن ماوس روی پیوندهای مجزا در ویکی داده آن را مشاهده کنید.

با انتخاب Property ID می توانید عناصری را که در سمت راست می بینید بدست آورید.

data['entities'][id]['claims']['P361']

از آنجایی که یک عنصر “بخشی از” وجود دارد که “تکنولوژی بزرگ” است، هنگام انتخاب شناسه “بخشی از” (P361) تنها یکی وجود دارد.

و شناسه عنصر “Big Tech” همان چیزی است که در پاسخ بالا مشاهده می کنید.

با استفاده از این انتخاب درک فهرست، تمام عناصر “Part of” را انتخاب می کنید.

[v['mainsnak']['datavalue']['value']['id'] for v in data['entities'][id]['claims']['P361']]

استخراج مفیدترین اطلاعات

من وارد جزئیات هر یک نمی شوم، اما همه آنها در یک موضوع مشابه تجزیه و تحلیل شده اند.

با این حال، کار را به صورت رایگان در اختیار شما دوستان قرار می دهم.

try:
    title = data['entities'][id]['labels']['en']['value']
except:
    title = 'not_found'
try:
    alternate_names = [v['value'] for v in data['entities'][id]['aliases']['en']]
except:
    alternate_names = 'not_found'
try:
    description = data['entities'][id]['descriptions']['en']['value'] 
except:
    description = 'not_found'
try:
    twitter = data['entities'][id]['claims']['P2002'][0]['mainsnak']['datavalue']['value']
except:
    twitter = 'not_found'
try:
    facebook = data['entities'][id]['claims']['P2013'][0]['mainsnak']['datavalue']['value']
except:
    facebook = 'not_found'
try:
    linkedin = data['entities'][id]['claims']['P4264'][0]['mainsnak']['datavalue']['value']
except:
    linkedin = 'not_found'
try:
    youtube = data['entities'][id]['claims']['P2397'][0]['mainsnak']['datavalue']['value']
except:
    youtube = 'not_found'
try:
    instagram = data['entities'][id]['claims']['P2003'][0]['mainsnak']['datavalue']['value']
except:
    instagram = 'not_found'
try:
    subreddit = data['entities'][id]['claims']['P3984'][0]['mainsnak']['datavalue']['value']
except:
    subreddit = 'not_found'
try:
    instance_of = [v['mainsnak']['datavalue']['value']['numeric-id'] for v in data['entities'][id]['claims']['P31']]
except:
    instance_of = 'not_found'
try:
    part_of = [v['mainsnak']['datavalue']['value']['id'] for v in data['entities'][id]['claims']['P361']]
except:
    part_of = 'not_found'
try:
    founded_by = [v['mainsnak']['datavalue']['value']['numeric-id'] for v in data['entities'][id]['claims']['P112']]
except:
    founded_by = 'not_found'
try:
    nick_names = [v['mainsnak']['datavalue']['value']['text'] for v in data['entities'][id]['claims']['P1449']]
except:
    nick_names = 'not_found'
try:
    official_websites = [v['mainsnak']['datavalue']['value']for v in data['entities'][id]['claims']['P856']]
except:
    official_websites = 'not_found'
try:
    categories = [v['mainsnak']['datavalue']['value']['numeric-id'] for v in data['entities'][id]['claims']['P910']]
except:
    categories = 'not_found'
try:
    inception = data['entities'][id]['claims']['P571'][0]['mainsnak']['datavalue']['value']['time']
except:
    inception = 'not_found'
try:
    latitude = data['entities'][id]['claims']['P625'][0]['mainsnak']['datavalue']['value']['latitude']
    longitude = data['entities'][id]['claims']['P625'][0]['mainsnak']['datavalue']['value']['longitude']
except:
    latitude = 'not_found'
    longitude = 'not_found'


result = {
    'wikidata_id':id,
    'title':title,
    'description':description,
    'alternate_names':alternate_names,
    'twitter':twitter,
    'linkedin':linkedin,
    'instagram':instagram,
    'youtube':youtube,
    'subreddit':subreddit,
    'instance_of':instance_of,
    'part_of':part_of,
    'founded_by':founded_by,
    'inception':inception,
    'nick_names':nick_names,
    'official_websites':official_websites,
    'main_categories':categories,
    'latitude':latitude,
    'longitude':longitude
    }

result

نتیجه تصویری است که در ابتدای پست به اشتراک گذاشته شده است.

نتیجه

ما اکنون همه چیزهایی را که برای شروع با Wikidata API با پایتون باید بدانید را پوشش داده ایم. تبریک می گویم.

سئو PBN | خبر های جدید سئو و هک و سرور