Advertisement
DeaD_EyE

link_parser.py

Sep 14th, 2016
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.52 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. """
  3. Ein kleines Beispiel, wie man Links mit den Modulen
  4. requests und beautifulsoup herunterladen kann und
  5. danach direkt parsen. Das Parsen erfolgt durch
  6. BeautifulSoup (bs4).
  7.  
  8. Der Generator get_links löst aus dem Objekt
  9. die Links heraus und gibt dann linktext und
  10. link aus.
  11.  
  12. Wie man im Header sehen kann, geschrieben für
  13. Python 3.x
  14.  
  15. Abhängigkeiten: requests, beautifulsoup4
  16.  
  17. linux: pip3 install requests beautifulsoup4
  18. windows: py -m pip install requests
  19.  
  20. ###########
  21. # Hinweis #
  22. ###########
  23.  
  24. Bitte beachten, dass es Gesetze gibt.
  25.  
  26. ###########
  27.  
  28. Copyright: ?? macht damit was ihr wollt.
  29. """
  30.  
  31. import time
  32. import requests
  33. import bs4
  34. import urllib
  35. def get_links(bs, pattern):
  36.     """
  37.    Sucht nach dem Tag a und gibt alle Links aus,
  38.    die im Linktext das Suchmuster enthalten
  39.    
  40.    bs := BeautifulSoup object
  41.    pattern:= str
  42.    returns := linktext, link
  43.    """
  44.     a_tag = bs.find_all('a')
  45.     for link in a_tag:                                                              
  46.         if pattern in link.text:
  47.             yield (link.text.strip(), link.get('href'))
  48.  
  49. def bs4_create(link):
  50.     """
  51.    Lädt eine Seite herunter und erstellt und gibt ein
  52.    BeautifulSoup Objekt zurück.
  53.    """
  54.     page = requests.get(link).text
  55.     bs = bs4.BeautifulSoup(page, 'html.parser')
  56.     return bs
  57.  
  58. def get_email_adresses(url):
  59.     """
  60.    Soll die E-Mail Adressen ausgeben.
  61.    Funktioniert natuerlich nur auf den Gelben Seiten
  62.    Woanders muesste es angepasst werden.
  63.    """
  64.     req = requests.get(url)
  65.     if req.status_code == 200:
  66.         bs = bs4.BeautifulSoup(req.text, 'html.parser')
  67.     else:
  68.         return set()
  69.  
  70.     ret = set()
  71.     for element in bs.find_all('a'):
  72.         if element.get('class'):
  73.             if 'email_native_app' in element['class']:
  74.                 link = element.get('href')
  75.                 email, query = urllib.parse.splitquery(urllib.parse.unquote(link[7:]))
  76.                 ret.add(email)
  77.     return ret
  78.  
  79. def gelbeseiten(url='http://www.gelbeseiten.de/auto/hagen,,,,,umkreis-50000'):
  80.     """
  81.    Zusammengehackte Funktion. Die URL muss
  82.    eine Seite mit Suchtreffer auf gelbeseiten.de sein.
  83.    Uebergibt man der Funktion nichts, wird
  84.    die Beispielsuchanfrage fuer Autohaeuser in Hagen
  85.    im umkreis von 50 km durchgeführt.
  86.  
  87.    Ausgegeben wird ein Set mit E-Mail Adressen.
  88.    Es findet keine Validierung statt.
  89.    """
  90.     emails = get_email_adresses(url)
  91.     i=2
  92.     while True:
  93.        new_emails = get_email_adresses(url + '/s{}'.format(i))
  94.        if new_emails:
  95.            emails.update(new_emails)
  96.            i += 1
  97.        else:
  98.            break
  99.  
  100.  
  101.     return emails
  102.  
  103.  
  104. def help():
  105.     print('{} "url" "suchmuster"'.format(sys.argv[0]))
  106.  
  107. # Quasi der Einspringepunkt, wenn das Programm ausgeführt wird.
  108. if __name__ == '__main__':
  109.     import sys
  110.  
  111.     if len(sys.argv) == 3:
  112.         url = sys.argv[1]
  113.         suchmuster = sys.argv[2]
  114.         page = bs4_create(url)
  115.  
  116.     elif len(sys.argv) == 1:
  117.         help()
  118.         # nur ein Beispiel, nicht uebertreiben.
  119.         url = 'http://www.gelbeseiten.de/branchenbuch/autohaus/hessen'
  120.         page = bs4_create(url)
  121.         suchmuster = 'Autohaus'
  122.         print(' '.join([sys.argv[0], url, suchmuster]))
  123.         time.sleep(2)
  124.  
  125.     else:
  126.         help()
  127.         # Falsche Anzahl der Argumente
  128.         sys.exit(1)
  129.  
  130.     ### Hier könnte man auch eine Funktion erstellen
  131.     for text, link in get_links(page, suchmuster):
  132.         print('#', text, '->', link)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement