| 12-04-2026 (3 ) | Categoria: Python |
Molts ordinadors moderns ja el porten, aix铆 que val la pena mirar-ho primer.
Prem Tecla Windows
Escriu cmd i obre la finestra negra (S铆mbol del sistema)
Escriu: python --version
Si et surt un n煤mero (per exemple Python 3.10), ja el tens instal路lat
Python 茅s gratu茂t i segur, i la instal路laci贸 茅s molt senzilla.
https://www.python.org/downloads/
Entra a la p脿gina i prem Download Python 3.x
Quan s鈥檕bri l鈥檌nstal路lador, marca la casella Add Python to PATH (molt important)
Prem Install Now i espera que acabi
El codi Python es guarda en un fitxer de text amb extensi贸 .py.
Obre el Bloc de notes
Copia-hi el codi Python que et vaig donar
Desa el fitxer com: comptar_categories.py (o el nom que vulguis)
Assegura鈥檛 que el tipus de fitxer 茅s Tots els fitxers i no .txt
Ara ja pots fer-lo funcionar i veure el resultat.
Torna a obrir cmd (S铆mbol del sistema)
Ves a la carpeta on tens el fitxer, per exemple: cd C:UsersEL_TEU_NOMDesktop
Escriu: python comptar_categories.py
Prem Enter i veur脿s el resultat a la pantalla
El programa et mostrar脿 quants articles hi ha a cada categoria.
Veureu l铆nies com: Articles a 'Cavalls': 41 Articles a 'Hipologia': 96
I el total sumat
Si vols afegir m茅s categories, t鈥檋o puc adaptar
programa Python complet que:
Llegeixi una categoria de la Viquip猫dia (en catal脿)
Recorri totes les subcategories recursivament
Compti tots els articles que pengen de cadascuna
I sumi el total de les dues categories: Cavalls i Hipologia
La manera correcta i robusta 茅s usar l鈥API de MediaWiki, no pas fer scraping.
Funciona per a qualsevol categoria de la Viquip猫dia en catal脿.
import requests
API = "https://ca.wikipedia.org/w/api.php"
def get_category_members(category, cmtype="page|subcat", continue_token=None):
params = {
"action": "query",
"list": "categorymembers",
"cmtitle": f"Categoria:{category}",
"cmlimit": "500",
"cmtype": cmtype,
"format": "json"
}
if continue_token:
params["cmcontinue"] = continue_token
r = requests.get(API, params=params).json()
members = r["query"]["categorymembers"]
cont = r.get("continue", {}).get("cmcontinue")
return members, cont
def count_articles_recursive(category, visited=None):
if visited is None:
visited = set()
if category in visited:
return 0
visited.add(category)
total = 0
continue_token = None
while True:
members, continue_token = get_category_members(category, continue_token=continue_token)
for m in members:
if m["title"].startswith("Categoria:"):
subcat = m["title"].replace("Categoria:", "")
total += count_articles_recursive(subcat, visited)
else:
total += 1
if not continue_token:
break
return total
if __name__ == "__main__":
categories = ["Cavalls", "Hipologia"]
grand_total = 0
for cat in categories:
print(f"Comptant articles de la categoria {cat}...")
count = count_articles_recursive(cat)
print(f" 鈫 {count} articles")
grand_total += count
print("nTOTAL SUMAT:", grand_total)
Usa action=query&list=categorymembers
Recorre totes les subcategories amb una crida recursiva
Evita bucles infinits amb un conjunt visited
Suma tots els articles (tipus page)
Funciona amb categories de qualsevol profunditat
versi贸 ampliada i professional del programa, amb totes les funcionalitats que has demanat:
Entrada interactiva de categories
Recorregut recursiu complet
Filtre per comptar nom茅s articles principals (namespace 0)
Generaci贸 d鈥檜n llistat complet d鈥檃rticles
Exportaci贸 a CSV (tant del recompte com del llistat)
Tot plegat mantenint l鈥櫭簊 correcte de l鈥橝PI de MediaWiki.
--------------
import requests import csv API = "https://ca.wikipedia.org/w/api.php" def get_category_members(category, cmtype="page|subcat", continue_token=None): params = { "action": "query", "list": "categorymembers", "cmtitle": f"Categoria:{category}", "cmlimit": "500", "cmtype": cmtype, "format": "json" } if continue_token: params["cmcontinue"] = continue_token r = requests.get(API, params=params).json() members = r["query"]["categorymembers"] cont = r.get("continue", {}).get("cmcontinue") return members, cont def count_and_list_articles(category, visited=None, articles=None): if visited is None: visited = set() if articles is None: articles = [] if category in visited: return articles visited.add(category) continue_token = None while True: members, continue_token = get_category_members(category, continue_token=continue_token) for m in members: title = m["title"] if title.startswith("Categoria:"): subcat = title.replace("Categoria:", "") count_and_list_articles(subcat, visited, articles) else: # Nom茅s namespace 0 (articles principals) if m["ns"] == 0: articles.append(title) if not continue_token: break return articles def save_csv(filename, articles): with open(filename, "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(["T铆tol"]) for a in articles: writer.writerow([a]) if __name__ == "__main__": print("Introdueix categories separades per comes (ex: Cavalls,Hipologia):") user_input = input("Categories: ").strip() categories = [c.strip() for c in user_input.split(",")] all_articles = [] for cat in categories: print(f"nProcessant categoria: {cat}") articles = count_and_list_articles(cat) print(f" 鈫 {len(articles)} articles principals trobats") all_articles.extend(articles) save_csv(f"{cat}_articles.csv", articles) print(f" CSV generat: {cat}_articles.csv") # Eliminar duplicats si dues categories comparteixen articles all_articles = sorted(set(all_articles)) print("n=== RESULTATS FINALS ===") print(f"Total d鈥檃rticles 煤nics trobats: {len(all_articles)}") save_csv("totes_les_categories_articles.csv", all_articles) print("CSV global generat: totes_les_categories_articles.csv")
---------DeepSeek trampaprograma en Python que, donada una URL d'una categoria de la Viquip猫dia en catal脿, recorri totes les subcategories de manera recursiva i compti tots els articles (p脿gines que no s贸n categories) que pengen d'ella.
A continuaci贸 et deixo el codi complet. Haur脿s d'instal路lar la llibreria
requestsibeautifulsoup4si no les tens:CodiBash
pip install requests beautifulsoup4
Codi
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
import time
import sys
def get_soup(url):
"""Obt茅 el contingut d'una p脿gina i el parseja amb BeautifulSoup"""
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
return BeautifulSoup(response.text, 'html.parser')
except requests.RequestException as e:
print(f"Error carregant {url}: {e}")
return None
def extract_category_articles_and_subcats(soup, base_url):
"""Extreu els articles i subcategories d'una p脿gina de categoria"""
articles = []
subcategories = []
# Trobar la secci贸 de p脿gines (articles) - div amb id 'mw-pages'
pages_div = soup.find('div', id='mw-pages')
if pages_div:
# Dins d'aquest div, els articles estan en llistes ()
for li in pages_div.find_all('li'):
link = li.find('a')
if link and not 'Categoria:' in link.get('href', ''):
articles.append(link.text)
# Trobar la secci贸 de subcategories - div amb id 'mw-subcategories'
subcats_div = soup.find('div', id='mw-subcategories')
if subcats_div:
for li in subcats_div.find_all('li'):
link = li.find('a')
if link and 'Categoria:' in link.get('href', ''):
subcat_url = urljoin(base_url, link.get('href'))
subcategories.append((link.text, subcat_url))
return articles, subcategories
def count_articles_in_category(category_url, visited=None, depth=0, verbose=True):
"""
Compta recursivament tots els articles d'una categoria i les seves subcategories.
Retorna (total_articles, llista_detall_articles)
"""
if visited is None:
visited = set()
# Evitar bucles infinits
if category_url in visited:
if verbose:
print("聽 " * depth + f"鈿狅笍聽 Ja visitat: {category_url}")
return 0, []
visited.add(category_url)
if verbose:
print("聽 " * depth + f"