در این آموزش، از کتابخانه درخواستهای 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 با پایتون باید بدانید را پوشش داده ایم. تبریک می گویم.
استراتژیست سئو در Tripadvisor، Seek سابق (ملبورن، استرالیا). متخصص در سئو فنی. در تلاش برای سئوی برنامهریزی شده برای سازمانهای بزرگ از طریق استفاده از پایتون، R و یادگیری ماشین.