Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import requests
- from bs4 import BeautifulSoup
- r = requests.get("https://www.sejm.gov.pl/sejm9.nsf/poslowie_okregi.xsp").text
- soup = BeautifulSoup(r, features="html.parser")
- wojewodztwa_html = soup.find("ul", {"class": "wojewodztwa"}) # wyciąga listę województw ze strony razem z htmlem
- wojewodztwa = [x.text[12:] for x in wojewodztwa_html] # wyciąga listę nazw województw ze strony
- linki_wojewodztw = ["https://sejm.gov.pl"+x.find('a')['href'] for x in wojewodztwa_html] # wyciąga linki do województw
- def get_poslow_from_wojewodztwa(link):
- """
- Ta funkcja wyciąga linki do profili posłów z poszczególnych województw.
- W argumencie funkcji należy podać link do województwa
- np. https://www.sejm.gov.pl/sejm9.nsf/poslowie_wojewodztwo.xsp?wojewodztwo=kujawsko-pomorskie
- """
- r = requests.get(link).text # pobiera html
- soup = BeautifulSoup(r, features="html.parser") # przetwarzam html przez moduł BeautifulSoup
- lista_poslow = soup.find_all("div", {"class": "lista-poslow"}) # wyciąga html który zawiera listę posłów ze wszystkich okręgów wyborczych
- # dlatego find_all
- poslowie = [i.text for x in lista_poslow for posel in x for i in posel] # list comprehension (3 pętle for) które wyciąga imiona i nazwiska posłów oraz partię do której należą
- linki_do_profili_poslow = ["https://sejm.gov.pl"+i['href'] for x in lista_poslow for i in x.find_all('a')] # list comprehension które wyciąga linki do profili posłów z htmla
- return linki_do_profili_poslow
- def get_email_from_posel_link(link):
- """
- Funkcja wyciąga adres email z html.
- W argumencie funkcji należy podać link do profilu posła.
- """
- r = requests.get(link).text
- soup = BeautifulSoup(r, features="html.parser")
- kontakt = soup.find('div', {'class': 'kontakt'})
- """
- Zmienna kontakt zawiera DIV w którym znajduje się adres email posła
- """
- try:
- """
- Try użyte dlatego, że niektórzy posłowie nie mają podanego emaila na stronie przez co wywalało błąd.
- Dzięki try, funkcja po prostu pominie błąd i poleci zacznie wyciągać email z kolejnego profilu.
- """
- email = kontakt.find_all('a')[4]['href'][1:].replace('D O T', '.').replace('A T', '@').replace(' ', '')
- """
- Wyciągam email w taki dziwny sposób, bo email jest widoczny na stronie dopiero po kliknięciu przycisku "Pokaż adres email".
- Requests i BeautifulSoup nie są w stanie klikać guzików na stronie dlatego wyciągnąłem brzydko poformatowany adres email z diva
- i poprawiłem go zamieniając niektóre znaki funkcją replace.
- """
- return email
- except Exception as e:
- pass
- def get_wszystkich_poslow():
- """
- Funkcja pobiera listę linków do wszystkich województw
- Z każdego linku do województwa, funkcja pobiera listę linków do profili posłów i dodaje je do JEDNEJ DUŻEJ listy `poslowie`
- Funkcja zwraca jedną listę z linkami do profili wszystkich posłów
- """
- poslowie = []
- for link in linki_wojewodztw:
- poslowie += get_poslow_from_wojewodztwa(link)
- return poslowie
- def get_all_emails():
- """
- Funkcja robi podobnie to co na górze.
- Pobiera wygenerowaną listę linków do profili wszystkich posłów i wyciąga z każdego z nich email dzięki funkcji get_email_from_posel_link.
- Każdy email jest wrzucany do JEDNEJ WIELKIEJ listy `emaile`
- Funkcja zwraca jedną listę.
- """
- emaile = []
- for link in get_wszystkich_poslow():
- try:
- emaile += get_email_from_posel_link(link)
- except:
- pass
- return emaile
- # # for x in get_all_emails():
- # # print(x)
- # # for x in get_wszystkich_poslow():
- # # print(x)
- # with open('poslowie.txt', 'r') as f:
- # """
- # Ten kawałek kodu otwiera plik poslowie.txt który zawiera linki do profili posłów.
- # Następnie czyszczę link z ze spacji i innych pierdół i wrzucam czysty link do listy `link`
- # Plik poslowie.txt razem z linkami do profili posłów chyba zrobiłem ręcznie, nie pamiętam xd
- # """
- # link = []
- # plik = f.readlines()
- # for x in plik:
- # link.append(x.strip())
- def zapisz_do_pliku(email):
- """
- Funkcja dodaje email do pliku emaile.txt
- Dla każdego emaila należy wykonać oddzielnie
- """
- try:
- with open('emaile.txt', 'a') as f:
- f.write(str(email)+"\n")
- except:
- pass
- # for x in link:
- # """
- # Krótka pętla która dodaje email wyciągnięty ze strony do pliku
- # """
- # email = get_email_from_posel_link(x)
- # zapisz_do_pliku(email)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement