Vandaag ga ik het je leren doorloop links op een pagina met Python (web schrapen), kan dit erg handig zijn om inhoud op een website automatisch te volgen en dit niet met de hand te hoeven doen. In het programma dat ik breng, wordt elke link verkregen door de html te lezen, je zou het programma kunnen aanpassen om naar een bepaalde inhoud te zoeken en alleen de links te tonen waarin je geïnteresseerd bent.
U kunt ook webschrapen met behulp van het robots.txt-bestand of de sitemaps die de websites hebben.
OpmerkingDe getoonde code werkt in Python 3.x, als u deze in versie 2.x wilt uitvoeren, moet u kleine wijzigingen aanbrengen.
Hier is de code:
import wachtrij import urllib.request import re van urllib.parse import urljoin def download (pagina): probeer: request = urllib.request.Request (page) html = urllib.request.urlopen (request) .read () print ("[ *] Download OK >> ", pagina) behalve: print ('[!] Fout bij downloaden', pagina) return Geen return html def crawlLinks (pagina): searchLinks = re.compile ('] + href = ["'] ( *?) ["']', re.IGNORECASE) wachtrij = wachtrij.Wachtrij () wachtrij.put (pagina) bezocht = [pagina] print (" Zoeken naar links in ", pagina) while (queue.qsize () > 0): html = download (queue.get ()) if html == None: continue links = searchLinks.findall (str (html)) voor link in links: link = urljoin (page, str (link)) if ( link niet in bezocht): wachtrij.put (link) bezocht.append (link) if __name__ == "__main__": crawlLinks ("http://www.solvetic.com")Het eerste wat we doen is iimporteer de benodigde bibliotheken, voor reguliere expressies (re), om de wachtrij (wachtrij) te gebruiken, om verzoeken te doen en een pagina te lezen (urllib.request) en voor de constructie van absolute URL's van een basis-URL en een andere URL (urljoin).
Code verdeeld in 2 functies
downloadenHet helpt ons om de html van een pagina te downloaden. Het heeft niet veel uitleg nodig, het enige wat het doet is een verzoek aan de gewenste pagina, het leest zijn html, als alles goed gaat toont het een Download OK-bericht, en als het niet aangeeft dat er een fout was (Hier hebben we zou informatie over de fout kunnen tonen), geeft aan het einde de html read of None terug.
links volgenHet is de hoofdfunctie en zal door elke link lopen. Laten we het even uitleggen:
- We maken een variabele met een reguliere expressie, die ons helpt de links in de html te vinden.
- We beginnen een variabele van het type staart met de eerste pagina, het zal ons helpen om de links op te slaan in de "volgorde" waarin we ze hebben ontdekt. We starten ook een lijsttypevariabele genaamd bezocht die we zullen gebruiken om de links op te slaan wanneer ze worden bezocht, dit wordt gedaan om een oneindige lus te voorkomen, stel je voor dat pagina x verwijst naar pagina y, en dit op zijn beurt naar pagina x , alle terwijl we deze links eindeloos zullen invoegen.
- De kern van de functie is de while-lus, die wordt uitgevoerd zolang de wachtrij links heeft, dus we controleren of de grootte groter is dan 0. Bij elke passage verwijderen we een link uit de wachtrij en sturen deze naar de downloadfunctie , die de html naar ons terugstuurt, dan zoeken we naar de links, en we controleren of we het al hebben bezocht, zo niet, dan voegen we het toe aan de wachtrij en aan de lijst.
OpmerkingHet lijkt misschien dat de lijst overbodig is, maar we gaan de links uit de wachtrij verwijderen en verwijderen, dus de controle zou niet correct zijn, misschien de link die we een tijdje geleden hebben bezocht en deze niet meer in de wachtrij staat, maar het zal in de lijst staan.
Het laatste deel van de code buiten de functies zorgt voor het uitvoeren van de code. In de volgende afbeelding ziet u een schermafbeelding van de actieve code, die oplost.
Als je wilt, kun je jezelf helpen met een bibliotheek die bestaat voor python genaamd BeautifulSoup, het lijkt heel gemakkelijk te hanteren, ik raad het aan.
Voor het geval je de code wilt, hier is een zip:
TraverseLinks.zip 646 bytes 493 Downloads
Vond je deze Tutorial leuk en heb je eraan geholpen?Je kunt de auteur belonen door op deze knop te drukken om hem een positief punt te geven