Advertisement
Guest User

Untitled

a guest
Dec 7th, 2022
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.78 KB | None | 0 0
  1. import requests
  2. from bs4 import BeautifulSoup
  3.  
  4. r = requests.get("https://www.sejm.gov.pl/sejm9.nsf/poslowie_okregi.xsp").text
  5.  
  6. soup = BeautifulSoup(r, features="html.parser")
  7. wojewodztwa_html = soup.find("ul", {"class": "wojewodztwa"}) # wyciąga listę województw ze strony razem z htmlem
  8. wojewodztwa = [x.text[12:] for x in wojewodztwa_html] # wyciąga listę nazw województw ze strony
  9. linki_wojewodztw = ["https://sejm.gov.pl"+x.find('a')['href'] for x in wojewodztwa_html] # wyciąga linki do województw
  10.  
  11.  
  12. def get_poslow_from_wojewodztwa(link):
  13.     """
  14.    Ta funkcja wyciąga linki do profili posłów z poszczególnych województw.
  15.    W argumencie funkcji należy podać link do województwa
  16.    np. https://www.sejm.gov.pl/sejm9.nsf/poslowie_wojewodztwo.xsp?wojewodztwo=kujawsko-pomorskie
  17.    """
  18.     r = requests.get(link).text # pobiera html
  19.     soup = BeautifulSoup(r, features="html.parser") # przetwarzam html przez moduł BeautifulSoup
  20.     lista_poslow = soup.find_all("div", {"class": "lista-poslow"}) # wyciąga html który zawiera listę posłów ze wszystkich okręgów wyborczych
  21.                                                                    # dlatego find_all
  22.     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żą
  23.     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
  24.     return linki_do_profili_poslow
  25.    
  26.  
  27.  
  28. def get_email_from_posel_link(link):
  29.     """
  30.    Funkcja wyciąga adres email z html.
  31.    W argumencie funkcji należy podać link do profilu posła.
  32.    """
  33.     r = requests.get(link).text
  34.     soup = BeautifulSoup(r, features="html.parser")
  35.     kontakt = soup.find('div', {'class': 'kontakt'})
  36.     """
  37.    Zmienna kontakt zawiera DIV w którym znajduje się adres email posła
  38.    """
  39.     try:
  40.         """
  41.        Try użyte dlatego, że niektórzy posłowie nie mają podanego emaila na stronie przez co wywalało błąd.
  42.        Dzięki try, funkcja po prostu pominie błąd i poleci zacznie wyciągać email z kolejnego profilu.
  43.        """
  44.         email = kontakt.find_all('a')[4]['href'][1:].replace('D O T', '.').replace('A T', '@').replace(' ', '')
  45.         """
  46.        Wyciągam email w taki dziwny sposób, bo email jest widoczny na stronie dopiero po kliknięciu przycisku "Pokaż adres email".
  47.        Requests i BeautifulSoup nie są w stanie klikać guzików na stronie dlatego wyciągnąłem brzydko poformatowany adres email z diva
  48.        i poprawiłem go zamieniając niektóre znaki funkcją replace.
  49.        """
  50.         return email
  51.     except Exception as e:
  52.         pass
  53.  
  54. def get_wszystkich_poslow():
  55.     """
  56.    Funkcja pobiera listę linków do wszystkich województw
  57.    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`
  58.    Funkcja zwraca jedną listę z linkami do profili wszystkich posłów
  59.    """
  60.     poslowie = []
  61.     for link in linki_wojewodztw:
  62.         poslowie += get_poslow_from_wojewodztwa(link)
  63.     return poslowie
  64.  
  65.  
  66. def get_all_emails():
  67.     """
  68.    Funkcja robi podobnie to co na górze.
  69.    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.
  70.    Każdy email jest wrzucany do JEDNEJ WIELKIEJ listy `emaile`
  71.    Funkcja zwraca jedną listę.
  72.    """
  73.     emaile = []
  74.     for link in get_wszystkich_poslow():
  75.         try:
  76.             emaile += get_email_from_posel_link(link)
  77.         except:
  78.             pass
  79.     return emaile
  80.        
  81. # # for x in get_all_emails():
  82. # #     print(x)
  83.  
  84. # # for x in get_wszystkich_poslow():
  85. # #     print(x)
  86.  
  87.  
  88.  
  89. # with open('poslowie.txt', 'r') as f:
  90. #     """
  91. #     Ten kawałek kodu otwiera plik poslowie.txt który zawiera linki do profili posłów.
  92. #     Następnie czyszczę link z ze spacji i innych pierdół i wrzucam czysty link do listy `link`
  93.    
  94. #     Plik poslowie.txt razem z linkami do profili posłów chyba zrobiłem ręcznie, nie pamiętam xd
  95. #     """
  96. #     link = []
  97. #     plik = f.readlines()
  98. #     for x in plik:
  99. #         link.append(x.strip())
  100.    
  101.  
  102. def zapisz_do_pliku(email):
  103.     """
  104.    Funkcja dodaje email do pliku emaile.txt
  105.    Dla każdego emaila należy wykonać oddzielnie
  106.    """
  107.     try:
  108.         with open('emaile.txt', 'a') as f:
  109.             f.write(str(email)+"\n")
  110.     except:
  111.         pass
  112.        
  113. # for x in link:
  114. #     """
  115. #     Krótka pętla która dodaje email wyciągnięty ze strony do pliku
  116. #     """
  117. #     email = get_email_from_posel_link(x)
  118. #     zapisz_do_pliku(email)
  119.    
  120.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement