如何专门自动抓取维基百科信息框并使用 python 打印任何维基页面的数据?我的任务是自动打印维基百科信息框数据。也就是说,我发现信息框是一个典型的维基部分。因此,如果我熟悉这一部分 - 那么我就学到了很多 - 对于未来的任务 - 不仅对我来说,而且对许多其他正在深入研究抓取维基页面的拓扑的人来说。因此,这可能是一项一般任务 - 对许多其他人来说很有帮助并且包含大量信息。
这是我在本“课程”中的起点:作为示例,我做了一些测试(在 Trek wikipedia 页面 (https://en.wikipedia.org/wiki/Star_Trek)上),并在那里提取了信息框部分从右侧并使用 python 在屏幕上逐行打印它们,我特别想要信息框 - 该示例运行良好。
所以我继续 - 我做了以下事情:
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")
效果非常好 - 现在我们有一组页面 - 类似于上面提到的:
如果我们选择这个:页面,列表上大约有 600 条记录(链接):https://de.wikipedia.org/wiki/Liste_der_Genossenschaftsbanken_in_Deutschland 我需要的是提取所有页面进行深度为1的遍历。
首页:https://de.wikipedia.org/wiki/Liste_der_Genossenschaftsbanken_in_Deutschland 子页面:https://de.wikipedia.org/wiki/Abtsgm%C3%BCnder_Bank 与 信息:
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.)
下一个子页面:https://de.wikipedia.org/wiki/Raiffeisenbank_Aidlingen 与信息:
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)
以及以下子页面:源自首页:(请注意,在此页面上,我们在 列表上有大约 600 条记录(链接):https://de.wikipedia.org/wiki/Liste_der_Genossenschaftsbanken_in_Deutschland
现在我们需要将以下解析器应用于所有子页面 - 然后将结果添加到数据框中并将其打印到屏幕
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")
这里是我们想要处理的网址的列表::
/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
对于这组 URL,我执行以下操作:
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)
这会返回以下内容:
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)
我的问题如下:我的方法看起来有点花哨 - 特别是我没有找到一种聪明的方法来从第一页获取所有网址:https://de.wikipedia.org/wiki/Liste_der_Genossenschaftsbanken_in_Deutschland
另外 - 最终结果 - 它们看起来有点有趣。我很想把它带到一张桌子上,那会很棒。
你需要做的是首先找到所有的 url:s,然后将它们一一解析,然后将它们放入 dataframe 中。请注意,有 1379 个链接,因此即使使用我使用并发Futures 提供的解决方案,也需要一些时间来执行:
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)
这给出了
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]