Wir werden unseren Code in zwei Abschnitte unterteilen: einen für die Datenextraktion und einen für die Datenbearbeitung. Der erste Teil wird vom Requests-Paket abgedeckt, während der zweite Teil von BeautifulSoup abgedeckt wird. Lassen Sie uns ohne weitere Umschweife mit dem Programmieren beginnen, beginnend mit dem Extraktionsteil:
import requests
def scrape( url = None ):
# if there is no URL, there is no need to use Python HTTP clients
# We will print a message and stop execution
if url == None:
print('[!] Please add a target!')
return
response = requests.get( url )
return response
In diesem Abschnitt definieren wir eine Funktion mit nur einem Parameter: der Ziel-URL. Wenn die URL nicht angegeben wird, geben wir eine Meldung aus und brechen die Ausführung ab. Andernfalls verwenden wir die get-Methode von Requests, um die Antwort zurückzugeben. Nun wissen wir, dass Python-HTTP-Clients weitere Methoden abdecken, also fügen wir einen bedingten Parameter hinzu:
import requests
def scrape( method = 'get', url = None, data = None ):
# if there is no URL, there is no need to use Python HTTP clients
# We will print a message and stop execution
if url == None:
print('[!] Please add a target!')
return
if method.lower() == 'get':
response = requests.get( url )
elif method.lower() == 'post':
if data == None:
print('[!] Please add a payload to your POST request!')
return
response = requests.post( url, data )
return response
Wie du sehen kannst, haben wir unserer Funktion einige weitere Parameter hinzugefügt. Der Parameter `method` gibt an, welche Methode für unsere Anfrage verwendet werden soll. Der Parameter `data` steht für die Nutzdaten, die wir mit der POST-Anfrage senden. Standardmäßig ist die Methode GET, daher ist der Parameter `method` nicht erforderlich.
Herausforderung: Füge dieser Funktion weitere Methoden hinzu und erweitere die Fähigkeiten unseres Scrapers. Das macht nicht nur Spaß, sondern ist auch ein guter Lernansatz. Außerdem kannst du den Code so anpassen, dass er zu deinem eigenen wird, und ihn deinem Portfolio hinzufügen.
Bisher haben wir uns mit der Datenextraktion befasst. Lassen Sie uns nun den HTML-Code analysieren und etwas damit anfangen:
from bs4 import BeautifulSoup
def extract_elements(data = None, el = None):
if data == None:
print('[!] Please add some data!')
return
if el == None:
print('[!] Please specify which elements you are targeting!')
return
soup = BeautifulSoup(data.text, 'html.parser')
elements = soup.find_all(el)
return elements
Ein Web-Scraper sollte jedoch in der Lage sein, spezifischere Daten zu extrahieren. Er sollte beispielsweise Elemente anhand ihres CSS-Selektors finden und zurückgeben können. Fügen wir also die Logik hinzu, die diesen Teil übernimmt:
from bs4 import BeautifulSoup
def extract_elements(data = None, el = None, attr = None, attr_value = None):
if data == None:
print('[!] Please add some data!')
return
if el == None:
print('[!] Please specify which elements you are targeting!')
return
soup = BeautifulSoup(data.text, 'html.parser')
elements = soup.find_all(el, { attr : attr_value })
return elements
Mit BeautifulSoup können wir bestimmte Daten anhand ihrer Attribute extrahieren. Deshalb haben wir hier zwei neue Parameter hinzugefügt, die uns helfen, Elemente anhand ihrer Attribute zu finden und zu extrahieren.
Wir haben nun alles, was wir brauchen. Jetzt müssen wir nur noch die beiden Abschnitte kombinieren, und schon haben wir unseren Web-Scraper. Sobald du deinen Code zusammengestellt hast, gehe einfach wie folgt vor:
- Erstellen Sie eine neue Variable, die die mit Requests extrahierten Daten enthält
- Geben Sie die von BeautifulSoup zurückgegebenen Elemente aus
Hier sind die beiden fehlenden Teile deines Codes:
data = scrape('GET', 'https://webscrapingapi.com')
print( extract_elements(data, 'ul') )
Ich bin mir sicher, dass du bereits herausgefunden hast, was alles bewirkt, und eine Übersetzung an dieser Stelle nicht mehr nötig ist. Genau wie bei unserem Scraper fordere ich dich auf, mit der Funktion `extract_elements` zu experimentieren und sie dazu zu bringen, mehr zu tun, als nur Elemente zurückzugeben.