Programmeren in Python/Pywikibot: verschil tussen versies

Uit Wikibooks
Verwijderde inhoud Toegevoegde inhoud
RonnieV (overleg | bijdragen)
→‎Gebruiker e-mailen: Voordat er iemand geëmailleerd wordt
Lintfouten: Verouderde HTML-elementen
Regel 16: Regel 16:


==Wikidata redirect==
==Wikidata redirect==
<source lang="python">
<syntaxhighlight lang="python">
x = pywikibot.ItemPage(repo, 'Q18362289') #this one is a redirect
x = pywikibot.ItemPage(repo, 'Q18362289') #this one is a redirect
while x.isRedirectPage(): #controleer of dit een redirect is
while x.isRedirectPage(): #controleer of dit een redirect is
Regel 22: Regel 22:
print("Ik heb 'm [%s]" % (x.title()))
print("Ik heb 'm [%s]" % (x.title()))


</syntaxhighlight>
</source>
==Alle pagina's uit een categorie==
==Alle pagina's uit een categorie==
<source lang="python">
<syntaxhighlight lang="python">
import pywikibot
import pywikibot
from pywikibot import pagegenerators
from pywikibot import pagegenerators
Regel 36: Regel 36:
print(page.title())
print(page.title())
print("Klaar")
print("Klaar")
</syntaxhighlight>
</source>


==Alle pagina's uit een categorie, met andere taalversies==
==Alle pagina's uit een categorie, met andere taalversies==
<source lang="python">
<syntaxhighlight lang="python">




Regel 75: Regel 75:
print("[%s]-[%s]" % (page.site.lang, page.title()))
print("[%s]-[%s]" % (page.site.lang, page.title()))
print("Klaar")
print("Klaar")
</syntaxhighlight>
</source>


==Gebruiker e-mailen==
==Gebruiker e-mailen==
<source lang="python">
<syntaxhighlight lang="python">
import pywikibot
import pywikibot


Regel 88: Regel 88:


wikiuser.sendMail(subject='bot-mail-subject',text='Hoi, het is gelukt! Ik kan naar een wiki-username een mail sturen, en het subject en de body van de e-mail kan ik zelf bepalen!')
wikiuser.sendMail(subject='bot-mail-subject',text='Hoi, het is gelukt! Ik kan naar een wiki-username een mail sturen, en het subject en de body van de e-mail kan ik zelf bepalen!')
</syntaxhighlight>
</source>


==Wikidata property==
==Wikidata property==
<source lang="python">
<syntaxhighlight lang="python">
site=pywikibot.site()
site=pywikibot.site()
repo=site.data_repository()
repo=site.data_repository()
Regel 98: Regel 98:
for x in (dir(pp)):
for x in (dir(pp)):
print(x)
print(x)
</syntaxhighlight>
</source>


==Alle links op een pagina==
==Alle links op een pagina==
<source lang="python">
<syntaxhighlight lang="python">
#import pywikibot
#import pywikibot
site=pywikibot.Site('nl')
site=pywikibot.Site('nl')
Regel 107: Regel 107:
for onelink in page.linkedPages():
for onelink in page.linkedPages():
print(onelink)
print(onelink)
</syntaxhighlight>
</source>


==Alle links naar deze pagina==
==Alle links naar deze pagina==
<source lang="python">
<syntaxhighlight lang="python">
#import pywikibot
#import pywikibot
site=pywikibot.Site('nl')
site=pywikibot.Site('nl')
Regel 116: Regel 116:
for onelink in page.backlinks():
for onelink in page.backlinks():
print(onelink.title())
print(onelink.title())
</syntaxhighlight>
</source>


==Alle pagina's met een bepaald sjabloon erop==
==Alle pagina's met een bepaald sjabloon erop==
<source lang="python">
<syntaxhighlight lang="python">
import pywikibot
import pywikibot
from pywikibot import pagegenerators
from pywikibot import pagegenerators
Regel 139: Regel 139:
if mypage.namespace().id in allowed_namespaces:
if mypage.namespace().id in allowed_namespaces:
print(mypage.title())
print(mypage.title())
</syntaxhighlight>
</source>




==Wikidata-items bekijken==
==Wikidata-items bekijken==
<source lang="python">
<syntaxhighlight lang="python">
#import pywikibot
#import pywikibot


Regel 159: Regel 159:
for sl in wikidataitem.sitelinks: #alle talen en de link naar het artikel in die taal
for sl in wikidataitem.sitelinks: #alle talen en de link naar het artikel in die taal
print('%s : %s' % (sl, wikidataitem.sitelinks[sl]))
print('%s : %s' % (sl, wikidataitem.sitelinks[sl]))
</syntaxhighlight>
</source>


==Wikidata-property ophalen==
==Wikidata-property ophalen==
<source lang="python">
<syntaxhighlight lang="python">
#import pywikibot
#import pywikibot
site=pywikibot.Site('nl')
site=pywikibot.Site('nl')
Regel 168: Regel 168:
wditem=pywikibot.ItemPage(repo,'Q2013')
wditem=pywikibot.ItemPage(repo,'Q2013')
otheritem=wditem.claims.get('P31')[0].getTarget() # gets value of the first P31 value defined on Q2013
otheritem=wditem.claims.get('P31')[0].getTarget() # gets value of the first P31 value defined on Q2013
</syntaxhighlight>
</source>


==Wikidata:SparQL query==
==Wikidata:SparQL query==
<source lang="python">
<syntaxhighlight lang="python">
import pywikibot
import pywikibot
import from pywikibot pagegenerators as pg
import from pywikibot pagegenerators as pg
Regel 193: Regel 193:
print('%s - %s' % (i,person.title()))
print('%s - %s' % (i,person.title()))
action_one_item(person)
action_one_item(person)
</syntaxhighlight>
</source>


==Ophalen wikidata bij pagina==
==Ophalen wikidata bij pagina==
<source lang="python">
<syntaxhighlight lang="python">
import pywikibot
import pywikibot


Regel 207: Regel 207:
pass #no wikidata for this page
pass #no wikidata for this page


</syntaxhighlight>
</source>


<!-- ----- Hieronder onderhoudsmeldingen, niet verwijderen ----- -->
<!-- ----- Hieronder onderhoudsmeldingen, niet verwijderen ----- -->
{{sub}}
{{Sub}}

Versie van 16 jan 2022 16:47

Pywikibot is een class library in Python om Wikimedia-projecten te kunnen lezen en schrijven. Uiteraard kunnen Wikipedia-pagina's worden bewerkt, maar ook afbeeldingen op Commons of Wikidata kunnen worden bewerkt.

Een script eindigt doorgaans op de extentie .py en wordt gestart door het als parameter naar python te sturen:

pyton3 myscript.py

Maar om de zaken zoals inloggen op Wikimedia te regelen, wordt een script voor pywikibot via pwb.py gestart:

python3 ~/pywikibot/core/pwb.py myscript.py

Wanneer je python3 hebt opgestart zonder parameters, zodat je in de command line zelf commando's wilt intypen, dan geef je het best eerst deze twee commando's:

import pwb
import pywikibot

en daarna bijvoorbeeld:

site = pywikibot.Site('nl')
repo = site.data_repository()

Wikidata redirect

 x = pywikibot.ItemPage(repo, 'Q18362289')  #this one is a redirect
 while x.isRedirectPage():   #controleer of dit een redirect is
   x = pywikibot.ItemPage(repo,x.getRedirectTarget().title())  #lees de redirected page
 print("Ik heb 'm [%s]" % (x.title()))

Alle pagina's uit een categorie

 import pywikibot
 from pywikibot import pagegenerators

 print("Begonnen")
 site = pywikibot.Site() #default site of user
 cat = pywikibot.Category(site,'Categorie:Woerden')
 gen = pagegenerators.CategorizedPageGenerator(cat,True) #generator geeft alle pagina's uit de categorie, tweede parameter zegt: ook sub-cats meenemen
 #gen = pagegenerators.CategorizedPageGenerator(cat,1) #generator geeft alle pagina's uit de categorie, tweede parameter zegt: 1 sub-cat diep doorlopen
 for page in gen:
   print(page.title())
 print("Klaar")

Alle pagina's uit een categorie, met andere taalversies

import pywikibot
from pywikibot import pagegenerators


def show_cat_all_pages(lng,catname, leveldeep):  #print all page-titles from *category* in language *lng*
  site = pywikibot.Site(lng)
  cat = pywikibot.Category(site,catname)
  catgen = pagegenerators.CategorizedPageGenerator(cat,leveldeep)
  
  for pagefound in catgen:
    yield pagefound

def gen_cat_all_pages(lng,catname,leveldeep):
 site = pywikibot.Site(lng)
 cat = pywikibot.Category(site,catname)
 gen = pagegenerators.CategorizedPageGenerator(cat,leveldeep)

 for page in show_cat_all_pages(lng,cat.title(),leveldeep):
   #print("[%s]-[%s]" % ( 'nl',page.title()))
   yield page
  
 #print("Now go international!")  
 for interlinks in cat.iterlanglinks():
   #print("Site:  [%s]" % (interlinks.site.lang))
   #print("Title: [%s]" % (interlinks.title))
   for page in show_cat_all_pages(interlinks.site.lang,interlinks.title,leveldeep):
     #print("[%s]-[%s]" % ( interlinks.site.lang,page.title()))
     yield page

print("Begonnen")
for page in gen_cat_all_pages('nl','Woerden',1):
  print("[%s]-[%s]" % (page.site.lang, page.title()))
print("Klaar")

Gebruiker e-mailen

import pywikibot

site = pywikibot.Site('nl')
wikiuser = pywikibot.User(site,'Testuser')
print("\n\n\n")
print(wikiuser)
print("\n\n\n")

wikiuser.sendMail(subject='bot-mail-subject',text='Hoi, het is gelukt! Ik kan naar een wiki-username een mail sturen, en het subject en de body van de e-mail kan ik zelf bepalen!')

Wikidata property

site=pywikibot.site()
repo=site.data_repository()
pp=pywikibot.PropertyPage('P17')
pp.get()
for x in (dir(pp)):
  print(x)

Alle links op een pagina

#import pywikibot
site=pywikibot.Site('nl')
page=pywikibot.Page(site,'Schaar')
for onelink in page.linkedPages():
  print(onelink)

Alle links naar deze pagina

#import pywikibot
site=pywikibot.Site('nl')
page=pywikibot.Page(site,'Schaar')
for onelink in page.backlinks():
  print(onelink.title())

Alle pagina's met een bepaald sjabloon erop

import pywikibot
from pywikibot import pagegenerators

language = 'en'
template = 'template:FIS' 
allowed_namespaces = [0]


def genPagesWithTemplate(sitecode,template):
   site=pywikibot.Site(sitecode)
   refPage = pywikibot.Page(pywikibot.Link(template,site))
   gen = pagegenerators.ReferringPageGenerator(refPage)
   for onepage in gen:
     yield(onepage)
     
     
for mypage in genPagesWithTemplate(language,template):
  if mypage.namespace().id in allowed_namespaces:
    print(mypage.title())


Wikidata-items bekijken

#import pywikibot

site=pywikibot.Site('nl')
repo=site.data_repository()
wikidataitem=pywikibot.ItemPage(repo,'Q2013')
for label in wd.labels:
  print('%s : %s' % (label, wikidataitem.labels[label]))  #print taalcode + label in die taal
for lng in wikidataitem.descriptions:
  print('%s : %s' % (lng,wikidataitem.descriptions[lng])) #print taalcode + omschrijving in die taal
for claim in wikidataitem.claims:  #print all claims plus their value (target)
  print('%s: %s' % (claim, wikidataitem.claims.get(claim)[0].getTarget() ))
for al in wikidataitem.aliases:  #alle alternatieve namen van dit item
  print('%s : %s' % (al, wikidataitem.aliases[al]))
for sl in wikidataitem.sitelinks:  #alle talen en de link naar het artikel in die taal
  print('%s : %s' % (sl, wikidataitem.sitelinks[sl]))

Wikidata-property ophalen

#import pywikibot
site=pywikibot.Site('nl')
repo=site.data_repository()
wditem=pywikibot.ItemPage(repo,'Q2013')
otheritem=wditem.claims.get('P31')[0].getTarget()  # gets value of the first P31 value defined on Q2013

Wikidata:SparQL query

import pywikibot
import from pywikibot pagegenerators as pg

def action_one_item():
  pass #do something useful here

def wd_all_people():
 QUERY=u'SELECT ?item WHERE {?item wdt:P31 wd:Q5}'
 wikidata_site = pywikibot.Site("wikidata", "wikidata")
 generator = pg.WikidataSPARQLPageGenerator(QUERY, site=wikidata_site)

 for wd in generator:
  wd.get(get_redirect=True)
  yield wd

mygenerator=wd_all_people()  
i=0  
for person in mygenerator:
  i += 1  
  print('%s - %s' % (i,person.title()))
  action_one_item(person)

Ophalen wikidata bij pagina

import pywikibot

site=pywikibot.Site('nl')
page=pywikibot.Page('Nederlandstalige Wikipedia')
if ('wikibase_item' in page.properties()):
  wd=page.data_item()
  wd.get(get_redirect=True)
else:
 pass #no wikidata for this page
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.