пытаюсь выяснить логику, которая стоит за этой страницей:
мы сохранили некоторые результаты в следующей базе данных:
от а до я примерно: 120 результатов или больше:
какие варианты нам нужны для получения данных
https://www.raiffeisen.ch/zuerich/de.html#bankselector-focus-titlebar
Raiffeisenbank Zürich
Limmatquai 68
8001Zürich
Tel. +41 43 244 78 78
[email protected]
https://www.raiffeisen.ch/sennwald/de.html
Raiffeisenbank Sennwald
Äugstisriet 7
9466Sennwald
Tel. +41 81 750 40 40
[email protected]
BIC/Swift Code: RAIFCH22XXX
https://www.raiffeisen.ch/basel/de/ueber-uns/engagement.html#bankselector-focus-titlebar
Raiffeisenbank Basel
St. Jakobs-Strasse 7
4052Basel
Tel. +41 61 226 27 28
[email protected]
Хм, я так думаю, если каким-то образом все инкапсулировано в блок, закодированный в URL-адресе...
ну, я пытаюсь это выяснить - и вот мой подход:
import requests
from bs4 import BeautifulSoup
def get_raiffeisen_data(url):
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.content, 'html.parser')
banks = []
# Find all bank entries
bank_entries = soup.find_all('div', class_='bank-entry')
for entry in bank_entries:
bank = {}
bank['name'] = entry.find('h2', class_='bank-name').text.strip()
bank['address'] = entry.find('div', class_='bank-address').text.strip()
bank['tel'] = entry.find('div', class_='bank-tel').text.strip()
bank['email'] = entry.find('a', class_='bank-email').text.strip()
banks.append(bank)
return banks
else:
print(f"Failed to retrieve data from {url}")
return None
url = 'https://www.raiffeisen.ch/rch/de/ueber-uns/raiffeisen-gruppe/organisation/raiffeisenbanken/deutsche-schweiz.html'
banks_data = get_raiffeisen_data(url)
for bank in banks_data:
print(f"Name: {bank['name']}")
print(f"Address: {bank['address']}")
print(f"Tel: {bank['tel']}")
print(f"Email: {bank['email']}")
print('-' * 40)
Вам необходимо сделать запрос для каждого банка, но некоторые сайты размещены на raiffeisen.ch
, а другие перенаправляются на другой сайт (например: lokalbank.ch). Эти сайты имеют совершенно разную структуру, поэтому для каждого типа сайтов вам нужна разная логика/стратегия.
Синхронный метод (медленный):
import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse
import json
def scrape_raiffeisen(html):
data = BeautifulSoup(html, 'html.parser').select_one('meta[name=organisationData]')
bank = {
'name': data.get('data-organisation-name'),
'address': {
'street': data.get('data-organisation-street'),
'zip': data.get('data-organisation-zip'),
'city': data.get('data-organisation-city')
},
'tel': data.get('data-organisation-phone'),
'email': data.get('data-organisation-mail')
}
return bank
def scrape_lokalbank(html):
script = BeautifulSoup(html, 'html.parser').find('script', type='application/ld+json')
data = json.loads(script.text).get('@graph')[1]
address = data.get('address', {})
bank = {
'name': data.get('name'),
'address': {
'street': address.get('streetAddress'),
'zip': address.get('postalCode'),
'city': address.get('addressLocality')
},
'tel': data.get('telephone'),
'email': data.get('email')
}
return bank
scrapers = {'www.raiffeisen.ch': scrape_raiffeisen, 'www.lokalbank.ch': scrape_lokalbank}
url = 'https://www.raiffeisen.ch/rch/de/ueber-uns/raiffeisen-gruppe/organisation/raiffeisenbanken/deutsche-schweiz.html'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
bank_links = [a.get('href') for a in soup.select('div.accordion__itemWrapper li > a')]
banks = []
for link in bank_links:
response = requests.get(link)
hostname = urlparse(response.url).netloc
scraper = scrapers.get(hostname)
if not scraper:
print(f'Could not find scraper for `{response.url}`')
continue
banks.append(scraper(response.text))
print(banks)
Асинхронный метод:
Для более быстрого парсинга мы можем выполнять запросы асинхронно, используя такую библиотеку, как aiohttp или httpx. Я использовал curl_cffi :
from bs4 import BeautifulSoup
from urllib.parse import urlparse
import json
import asyncio
from curl_cffi.requests import AsyncSession
def scrape_raiffeisen(html):
data = BeautifulSoup(html, 'html.parser').select_one('meta[name=organisationData]')
bank = {
'name': data.get('data-organisation-name'),
'address': {
'street': data.get('data-organisation-street'),
'zip': data.get('data-organisation-zip'),
'city': data.get('data-organisation-city')
},
'tel': data.get('data-organisation-phone'),
'email': data.get('data-organisation-mail')
}
return bank
def scrape_lokalbank(html):
script = BeautifulSoup(html, 'html.parser').find('script', type='application/ld+json')
data = json.loads(script.text).get('@graph')[1]
address = data.get('address', {})
bank = {
'name': data.get('name'),
'address': {
'street': address.get('streetAddress'),
'zip': address.get('postalCode'),
'city': address.get('addressLocality')
},
'tel': data.get('telephone'),
'email': data.get('email')
}
return bank
scrapers = {'www.raiffeisen.ch': scrape_raiffeisen, 'www.lokalbank.ch': scrape_lokalbank}
def get_banks():
session = AsyncSession()
async def scrape_bank(link):
response = await session.get(link)
hostname = urlparse(response.url).netloc
scraper = scrapers.get(hostname)
if not scraper:
print(f'Could not find scraper for `{response.url}`')
return
return scraper(response.text)
async def main():
url = 'https://www.raiffeisen.ch/rch/de/ueber-uns/raiffeisen-gruppe/organisation/raiffeisenbanken/deutsche-schweiz.html'
response = await session.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
bank_links = [a.get('href') for a in soup.select('div.accordion__itemWrapper li > a')]
tasks = [scrape_bank(link) for link in bank_links]
banks = await asyncio.gather(*tasks)
await session.close()
return banks
return asyncio.run(main())
banks = get_banks()
print(banks)
привет! Большое спасибо за вашу потрясающую помощь – действительно выдающуюся. Я ошеломлен. Большое спасибо!! 10 звезд из 5 возможных.,...;)