Search code examples
pythonpandasweb-scrapingbeautifulsouprequest

How to automate scraping wikipedia-info box specifically and print the data using python for more (other) wiki page?


How to automate scraping wikipedia info box specifically and print the data using python for any wiki page? My task is to automate printing the wikipedia infobox data. And that said i found out that the infobox is a typical wiki-part. so if i get familiar on this part - then i have learned alot - for future tasks - not only for me but for many others more that are diving into the Topos of scraping-wiki pages. So this might be a general task - helpful and packed with lots of information for many others too.

here is my starting point in this "lesson": As an example,i did some tests (on the Trek wikipedia page ( https://en.wikipedia.org/wiki/Star_Trek) and there i extracte the infobox section from the right hand side and print them row by row on screen using python. I specifically want the info box - the example worked perfectly.

so i went on - and I have done the following:

import pandas
urlpage =  'https://de.wikipedia.org/wiki/Raiffeisenbank_Aidlingen'
data = pandas.read_html(urlpage)[0]
null = data.isnull()

for x in range(len(data)):
    first = data.iloc[x][0]
    second = data.iloc[x][1] if not null.iloc[x][1] else ""
    print(first,second,"\n")

that works perfect - now we have a set of some pages - similar to the above mentioned:

if we take this: page we have about 600 records ( links ) on the list: https://de.wikipedia.org/wiki/Liste_der_Genossenschaftsbanken_in_Deutschland What I need is to extract all the pages for the traversal with depth 1.

top-page: https://de.wikipedia.org/wiki/Liste_der_Genossenschaftsbanken_in_Deutschland sub-page: https://de.wikipedia.org/wiki/Abtsgm%C3%BCnder_Bank with the information:

Staat    Deutschland
Sitz    Hauptstraße 13
73453 Abtsgmünd
Rechtsform  eingetragene Genossenschaft
Bankleitzahl    600 696 73[1]
BIC GENO DES1 ABR[1]
Gründung    24. August 1890
Verband Baden-Württembergischer Genossenschaftsverband e.V.
Website abtsgmuender-bank.de
Geschäftsdaten 2022[2]
Bilanzsumme 217,5 Mio. Euro
Einlagen    170,0 Mio. Euro
Kundenkredite   107,9 Mio. Euro
Mitarbeiter 24
Geschäftsstellen    3
Mitglieder  4.669
Leitung
Vorstand    Danny Dürrich
Karl Heinz Gropper
Aufsichtsrat    Holger Wengert (Vors.)

next sub-page: https://de.wikipedia.org/wiki/Raiffeisenbank_Aidlingen with the information:

Logo der Genossenschaftsbanken  Raiffeisenbank Aidlingen eG
Staat    Deutschland
Sitz    Hauptstraße 8
71134 Aidlingen
Rechtsform  eingetragene Genossenschaft
Bankleitzahl    600 692 06[1]
BIC GENO DES1 AID[1]
Gründung    12. Oktober 1901
Verband Baden-Württembergischer Genossenschaftsverband e.V.
Website ihrziel.de
Geschäftsdaten 2022[2]
Bilanzsumme 268,0 Mio. EUR
Einlagen    242,0 Mio. EUR
Kundenkredite   121,0 Mio. EUR
Mitarbeiter 26
Geschäftsstellen    1 + 1 SB-GS
Mitglieder  3.196
Leitung
Vorstand Marco Bigeschi
Markus Vogel
Aufsichtsrat Thomas Rott (Vorsitzender)

and the following sub-pages: derived from the top-page: (note on this page, we have about 600 records ( links ) on the list: https://de.wikipedia.org/wiki/Liste_der_Genossenschaftsbanken_in_Deutschland

now we need to apply to all the sub-pages the following parser - and subsequently add the results into a dataframe and print it to screen

import pandas
urlpage =  'https://de.wikipedia.org/wiki/Raiffeisenbank_Aidlingen'
data = pandas.read_html(urlpage)[0]
null = data.isnull()

for x in range(len(data)):
    first = data.iloc[x][0]
    second = data.iloc[x][1] if not null.iloc[x][1] else ""
    print(first,second,"\n")

here the list of the urls: that we want to work on :

/wiki/Volksbank_im_Wesertal
/wiki/Raiffeisenbank_Westallg%C3%A4u
/wiki/Raiffeisenbank_MEHR_Mosel_-_Eifel_-_Hunsr%C3%BCck_-_Region
/wiki/Volksbank_Sangerhausen
/wiki/Volksbank_Grebenhain
/wiki/Obersulm
/wiki/Raiffeisenbank_Regenstauf
/wiki/Damme_(D%C3%BCmmer)
/wiki/Volksbank_Westerstede
/wiki/VR-Bank_Westm%C3%BCnsterland
/wiki/Breisach_am_Rhein
/wiki/DKM_Darlehnskasse_M%C3%BCnster
/wiki/Scharnhauser_Bank
/wiki/Sitz_(juristische_Person)
/wiki/Volksbank_Gera_Jena_Rudolstadt
/wiki/Volksbank_Bocholt
/wiki/G%C3%B6rlitz
/wiki/Raiffeisen-Volksbank_Neustadt

Well with this set of URLS i do the following:

import requests
from bs4 import BeautifulSoup
import pandas as pd

# Function to parse data from Wikipedia page
def parse_wikipedia_page(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.content, "html.parser")
    
    # Find the relevant content
    infobox = soup.find("table", class_="toccolours toptextcells float-right infobox")
    if not infobox:
        return None
    
    # Extract data from the infobox
    data = {}
    rows = infobox.find_all("tr")
    for row in rows:
        cells = row.find_all(["th", "td"])
        if len(cells) == 2:
            key = cells[0].text.strip()
            value = cells[1].text.strip()
            data[key] = value
    
    return data

# List of URLs for Wikipedia pages
urls = [
    'https://de.wikipedia.org/wiki/Volksbank_im_Wesertal',
    'https://de.wikipedia.org/wiki/Raiffeisenbank_Westallg%C3%A4u',
    'https://de.wikipedia.org/wiki/Raiffeisenbank_MEHR_Mosel_-_Eifel_-_Hunsr%C3%BCck_-_Region',
    'https://de.wikipedia.org/wiki/Volksbank_Sangerhausen',
    'https://de.wikipedia.org/wiki/Volksbank_Grebenhain',
    'https://de.wikipedia.org/wiki/Obersulm',
    'https://de.wikipedia.org/wiki/Raiffeisenbank_Regenstauf',
    'https://de.wikipedia.org/wiki/Damme_(D%C3%BCmmer)',
    'https://de.wikipedia.org/wiki/Volksbank_Westerstede',
    'https://de.wikipedia.org/wiki/VR-Bank_Westm%C3%BCnsterland',
    'https://de.wikipedia.org/wiki/Breisach_am_Rhein',
    'https://de.wikipedia.org/wiki/DKM_Darlehnskasse_M%C3%BCnster',
    'https://de.wikipedia.org/wiki/Scharnhauser_Bank',
    'https://de.wikipedia.org/wiki/Sitz_(juristische_Person)',
    'https://de.wikipedia.org/wiki/Volksbank_Gera_Jena_Rudolstadt',
    'https://de.wikipedia.org/wiki/Volksbank_Bocholt',
    'https://de.wikipedia.org/wiki/G%C3%B6rlitz',
    'https://de.wikipedia.org/wiki/Raiffeisen-Volksbank_Neustadt'
]

# Initialize an empty list to store parsed data
all_data = []

# Parse each Wikipedia page and store the results
for url in urls:
    parsed_data = parse_wikipedia_page(url)
    if parsed_data:
        all_data.append(parsed_data)

# Create a DataFrame from the parsed data
df = pd.DataFrame(all_data)

# Print the DataFrame
print(df)

this gives back the following:

                   Staat                                           Sitz  \
0   Deutschland Deutschland               Osterstraße 1131863 Coppenbrügge   
1   Deutschland Deutschland           Alois-Stadler-Straße 288167 Gestratz   
2   Deutschland Deutschland           Koblenzer Straße 5256759 Kaisersesch   
3   Deutschland Deutschland               Göpenstraße 3506526 Sangerhausen   
4   Deutschland Deutschland                 Hauptstraße 3936355 Grebenhain   
5   Deutschland Deutschland                   Marktplatz 893128 Regenstauf   
6   Deutschland Deutschland                Peterstraße 1926655 Westerstede   
7   Deutschland Deutschland                    Kupferstr. 2848653 Coesfeld   
8   Deutschland Deutschland                          Breul 2648143 Münster   
9   Deutschland Deutschland           Raiffeisenstraße 2–473760 Ostfildern   
10  Deutschland Deutschland                      Johannisplatz 707743 Jena   
11  Deutschland Deutschland                 Meckenemstraße 1046395 Bocholt   
12  Deutschland Deutschland  Hagener Straße 4431535 Neustadt am Rübenberge   

                     Rechtsform   Bankleitzahl               BIC  \
0   eingetragene Genossenschaft  254 626 80[1]  GENO DEF1 COP[1]   
1   eingetragene Genossenschaft  733 698 23[1]  GENO DEF1 WWA[1]   
2   eingetragene Genossenschaft  570 691 44[1]  GENO DED1 KAI[1]   
3   eingetragene Genossenschaft  800 635 58[1]  GENO DEF1 SGH[1]   
4   eingetragene Genossenschaft  500 691 46[1]  GENO DE51 GRC[1]   
5   eingetragene Genossenschaft  750 618 51[1]  GENO DEF1 REF[1]   
6   eingetragene Genossenschaft  280 632 53[1]  GENO DEF1 WRE[1]   
7   eingetragene Genossenschaft  428 613 87[1]  GENO DEM1 BOB[1]   
8   eingetragene Genossenschaft  400 602 65[1]  GENO DEM1 DKM[1]   
9   eingetragene Genossenschaft  600 695 17[1]  GENO DES1 SCA[1]   
10  eingetragene Genossenschaft  830 944 54[1]  GENO DEF1 RUJ[1]   
11  eingetragene Genossenschaft  428 600 03[1]  GENO DEM1 BOH[1]   
12  eingetragene Genossenschaft  250 692 62[1]  GENO DEF1 NST[1]   

             Gründung                                            Verband  \
0   31. Dezember 1886                                   Genoverband e.V.   
1       1. April 1903                 Genossenschaftsverband Bayern e.V.   
2                1872                                   Genoverband e.V.   
3    2. Dezember 1931                                   Genoverband e.V.   
4                1880                                  Genoverband e. V.   
5     6. Februar 1894                 Genossenschaftsverband Bayern e.V.   
6     2. Februar 1899              Genossenschaftsverband Weser-Ems e.V.   
7                 NaN                                   Genoverband e.V.   
8     24. Januar 1961                                   Genoverband e.V.   
9    23. Oktober 1890  Baden-Württembergischer Genossenschaftsverband...   
10      16. März 1857                                   Genoverband e.V.   
11               1900                                   Genoverband e.V.   
12    12. Januar 1920                                   Genoverband e.V.   

                             Website       Bilanzsumme          Einlagen  \
0                           vb-iw.de    348,0 Mio. EUR    295,0 Mio. EUR   
1      raiffeisenbank-westallgaeu.de    404,6 Mio. EUR    344,5 Mio. EUR   
2                         rb-mehr.de    855,0 Mio. EUR    689,0 Mio. EUR   
3          volksbank-sangerhausen.de    176,6 Mio. EUR    155,7 Mio. EUR   
4                   vb-grebenhain.de      151,4 Mio. €      117,2 Mio. €   
5       raiffeisenbank-regenstauf.de   315,1 Mio. Euro   240,4 Mio. Euro   
6                  vb-westerstede.de    495,5 Mio. EUR    290,8 Mio. EUR   
7                  www.vrbank-wml.de     3,5 Mrd. Euro     2,1 Mrd. Euro   
8                             dkm.de    4.827 Mio. EUR    3.682 Mio. EUR   
9                scharnhauserbank.de    175,0 Mio. EUR    136,0 Mio. EUR   
10          www.volksbank-vor-ort.de  1.828,5 Mio. EUR  1.504,6 Mio. EUR   
11                     vb-bocholt.de  1.695,0 Mio. EUR  1.145,0 Mio. EUR   
12  raiffeisen-volksbank-neustadt.de    139,9 Mio. EUR    108,6 Mio. EUR   

       Kundenkredite Mitarbeiter             Geschäftsstellen   Mitglieder  \
0     180,0 Mio. EUR          58                  3 + 2 SB-GS        7.546   
1     254,4 Mio. EUR          59                8 und 3 SB-GS        6.367   
2     447,0 Mio. EUR         128                  9 + 3 SB-GS       13.728   
3      40,4 Mio. EUR          20                            4        4.634   
4        96,5 Mio. €          21                            4        2.796   
5    205,6 Mio. Euro          53                  5 + 1 SB-GS        3.107   
6     346,3 Mio. EUR          63                            2        3.579   
7      2,6 Mrd. Euro         361                           20  über 48.000   
8     1.759 Mio. EUR         137                            1        1.566   
9     124,0 Mio. EUR           9                            1        1.020   
10  1.108,3 Mio. EUR         247  15 Filialen + 20 SB-Stellen       34.653   
11  1.354,0 Mio. EUR         218                  7 + 7 SB-GS       22.676   
12     74,9 Mio. EUR          24                            2        1.763   

                                             Vorstand  \
0                Illka Osterwald (Vors.)Marco Weßling   
1   Martin Öfner (Vorstandssprecher)Hans-Peter Beyrer   
2   Heinrich Josef BlümlingKarl Josef BrunnerElmar...   
3                           Carmen ClausDaniel Kubica   
4                       Martin WinterKarsten Beckmann   
5            Stephan Hauf (Vorsitzender)Wolfgang Haas   
6                     Christian BlessenStefan Terveer   
7   Carsten Düerkop (Vors.)Matthias EntrupBerthold...   
8           Christoph Bickmann (Vors.)Gerrit Abelmann   
9   Joachim Rapp (Vorstandsvorsitzender)Andreas Gi...   
10  Falko Gaudig Torsten Narr Jens Luley Harald Ra...   
11                 Franz-Josef HeidermannMartin Wilms   
12                           Frank HahnMarkus Heumann   

                     Aufsichtsrat  
0             Andreas Voß (Vors.)  
1      Kathrin Koch (Vorsitzende)  
2            Günter Urwer (Vors.)  
3    Anette Stelter (Vorsitzende)  
4           Werner Müller (Vors.)  
5      Barbara Eigl (Vorsitzende)  
6             Ralf Denker (Vors.)  
7          Helmut Rüskamp (Vors.)  
8         Antonius Hamers (Vors.)  
9     Thomas Durst (Vorsitzender)  
10       Bernhard Schanze (Vors.)  
11      Christoph Ernsten (Vors.)  
12  Gilbert Herzig (Vorsitzender)  

my question is the following: my approach looks a bit fancy - especially i did not manage to find a clever way to get all the urls from the first page: https://de.wikipedia.org/wiki/Liste_der_Genossenschaftsbanken_in_Deutschland

additionally - the final results - well they look a bit funny. i d love to bring that to a table that would be awesome.


Solution

  • What you need to do is first find all the url:s and then parse them one by one before putting them into a dataframe. Note that there are 1379 links and that it therefore takes some time to execute, even with the solution I provide using concurrentFutures:

    import requests
    from bs4 import BeautifulSoup
    import pandas as pd
    from concurrent.futures import ThreadPoolExecutor
    
    def get_wikipedia_urls(main_url):
        response = requests.get(main_url)
        soup = BeautifulSoup(response.content, "html.parser")
        
        links = soup.find_all("a", href=True)
        base_url = "https://de.wikipedia.org"
        
        urls = [base_url + link['href'] for link in links if link['href'].startswith("/wiki/") and ":" not in link['href']]
        
        return urls
    
    def parse_wikipedia_page(url):
        try:
            response = requests.get(url)
            soup = BeautifulSoup(response.content, "html.parser")
            
            infobox = soup.find("table", class_="infobox")
            if not infobox:
                return None
            
            data = {}
            rows = infobox.find_all("tr")
            for row in rows:
                if row.find("th") and row.find("td"):
                    key = row.find("th").text.strip()
                    value = row.find("td").text.strip()
                    data[key] = value
            
            data['URL'] = url  
            return data
        except Exception as e:
            print(f"Error parsing {url}: {e}")
            return None
    
    main_url = 'https://de.wikipedia.org/wiki/Liste_der_Genossenschaftsbanken_in_Deutschland'
    
    urls = get_wikipedia_urls(main_url)
    
    all_data = []
    
    with ThreadPoolExecutor(max_workers=10) as executor:
        results = list(executor.map(parse_wikipedia_page, urls))
    
    all_data = [result for result in results if result]
    
    df = pd.DataFrame(all_data)
    
    print(df)
    
    df.to_csv('wikipedia_infoboxes.csv', index=False)
    

    which gives

                           Rechtsform          Gründung  \
    0            eingetragener Verein   1972 in Bonn[1]   
    1                             NaN               NaN   
    2                            e.V.    1. Januar 2009   
    3                             NaN               NaN   
    4            Eingetragener Verein   1893 in München   
    ...                           ...               ...   
    1374  eingetragene Genossenschaft  28. Februar 1972   
    1375                          NaN               NaN   
    1376  eingetragene Genossenschaft  13. Oktober 1925   
    1377                          NaN               NaN   
    1378         eingetragener Verein   1972 in Bonn[1]   
    
                                         Sitz      Präsidentin  \
    0                     Berlin, Deutschland  Marija Kolak[2]   
    1                                     NaN              NaN   
    2     Stuttgart (jur. Sitz ist Karlsruhe)              NaN   
    3                                     NaN              NaN   
    4                                 München              NaN   
    ...                                   ...              ...   
    1374               Kamp 1733098 Paderborn              NaN   
    1375                                  NaN              NaN   
    1376             Goltenkamp 958452 Witten              NaN   
    1377                                  NaN              NaN   
    1378                  Berlin, Deutschland  Marija Kolak[2]   
    
                                                   Vorstand  \
    0               Daniel Quinten, Tanja Müller-Ziegler[3]   
    1                                                   NaN   
    2                                        Carsten Eisele   
    3                                                   NaN   
    4     Gregor Scheller (Vorstandsvorsitzender und Prä...   
    ...                                                 ...   
    1374         Richard Böger (Vorsitzender)Jürgen Reineke   
    1375                                                NaN   
    1376          Volkmar Birx (Sprecher)Sylvia Oberwinster   
    1377                                                NaN   
    1378            Daniel Quinten, Tanja Müller-Ziegler[3]   
    
                                                 Mitglieder  \
    0                                            818 (2022)   
    1                                                   NaN   
    2     750 Genossenschaften und genossenschaftlich au...   
    3                                                   NaN   
    4                    1169[1] (Stand: 31. Dezember 2022)   
    ...                                                 ...   
    1374                                              1.304   
    1375                                                NaN   
    1376                                              1.897   
    1377                                                NaN   
    1378                                         818 (2022)   
    
                                  Website  \
    0                          www.bvr.de   
    1                                 NaN   
    2     www.wir-leben-genossenschaft.de   
    3                                 NaN   
    4                    www.gv-bayern.de   
    ...                               ...   
    1374                 bkc-paderborn.de   
    1375                              NaN   
    1376                      kbwitten.de   
    1377                              NaN   
    1378                       www.bvr.de   
    
                                                        URL  \
    0     https://de.wikipedia.org/wiki/Bundesverband_de...   
    1       https://de.wikipedia.org/wiki/Kreditwesengesetz   
    2     https://de.wikipedia.org/wiki/Baden-W%C3%BCrtt...   
    3               https://de.wikipedia.org/wiki/Karlsruhe   
    4     https://de.wikipedia.org/wiki/Genossenschaftsv...   
    ...                                                 ...   
    1374  https://de.wikipedia.org/wiki/Bank_f%C3%BCr_Ki...   
    1375            https://de.wikipedia.org/wiki/Paderborn   
    1376  https://de.wikipedia.org/wiki/Spar-_und_Kredit...   
    1377               https://de.wikipedia.org/wiki/Witten   
    1378  https://de.wikipedia.org/wiki/Bundesverband_de...   
    
                Organisationstyp            Präsident  ... ISO 9362  \
    0                        NaN                  NaN  ...      NaN   
    1                        NaN                  NaN  ...      NaN   
    2     Genossenschaftsverband  Dr. Ulrich Theileis  ...      NaN   
    3                        NaN                  NaN  ...      NaN   
    4                        NaN                  NaN  ...      NaN   
    ...                      ...                  ...  ...      ...   
    1374                     NaN                  NaN  ...      NaN   
    1375                     NaN                  NaN  ...      NaN   
    1376                     NaN                  NaN  ...      NaN   
    1377                     NaN                  NaN  ...      NaN   
    1378                     NaN                  NaN  ...      NaN   
    
           Bankleitzahl               BIC           Verband       Bilanzsumme  \
    0               NaN               NaN               NaN               NaN   
    1               NaN               NaN               NaN               NaN   
    2               NaN               NaN               NaN               NaN   
    3               NaN               NaN               NaN               NaN   
    4               NaN               NaN               NaN               NaN   
    ...             ...               ...               ...               ...   
    1374  472 603 07[1]  GENO DEM1 BKC[1]  Genoverband e.V.  5.180,0 Mio. EUR   
    1375            NaN               NaN               NaN               NaN   
    1376  452 604 75[1]  GENO DEM1 BFG[1]  Genoverband e.V.    171,8 Mio. EUR   
    1377            NaN               NaN               NaN               NaN   
    1378            NaN               NaN               NaN               NaN   
    
                  Einlagen     Kundenkredite Geschäftsstellen  \
    0                  NaN               NaN              NaN   
    1                  NaN               NaN              NaN   
    2                  NaN               NaN              NaN   
    3                  NaN               NaN              NaN   
    4                  NaN               NaN              NaN   
    ...                ...               ...              ...   
    1374  3.946,0 Mio. EUR  2.082,0 Mio. EUR                1   
    1375               NaN               NaN              NaN   
    1376    137,4 Mio. EUR     69,0 Mio. EUR                1   
    1377               NaN               NaN              NaN   
    1378               NaN               NaN              NaN   
    
                            Aufsichtsrat Unternehmensleitung  
    0                                NaN                 NaN  
    1                                NaN                 NaN  
    2                                NaN                 NaN  
    3                                NaN                 NaN  
    4                                NaN                 NaN  
    ...                              ...                 ...  
    1374      Georg Rüter (Vorsitzender)                 NaN  
    1375                             NaN                 NaN  
    1376  Ralf Napiwotzki (Vorsitzender)                 NaN  
    1377                             NaN                 NaN  
    1378                             NaN                 NaN  
    
    [1379 rows x 25 columns]