scrapy

Webscraping met Python Scrapy Module

Webscraping met Python Scrapy Module
De vaardigheid van webschrapen is tegenwoordig goud geworden, dus laten we leren hoe we de benodigde gegevens van webpagina's kunnen halen. In dit artikel zouden we het hebben over de Scrapy Python-bibliotheek, wat het kan doen en hoe het te gebruiken. Laten we beginnen.

Waarom Scrapy??

Scrapy is een robuuste webscraping-bibliotheek, die de mogelijkheid biedt om webpagina's, afbeeldingen en alle gegevens die u maar kunt bedenken razendsnel te downloaden. Snelheid is van groot belang bij de berekening, en Scrapy werkt hieraan door websites asynchroon te bezoeken en veel achtergrondwerk te doen, waardoor de hele taak er gemakkelijk uitziet.

Het moet gezegd dat Python andere bibliotheken heeft die kunnen worden gebruikt om gegevens van websites te schrapen, maar geen enkele is vergelijkbaar met Scrapy als het gaat om efficiëntie.

Installatie

Laten we eens kijken hoe deze krachtige bibliotheek op uw computer kan worden geïnstalleerd.

Net als bij de meeste Python-bibliotheken, kun je Scrapy installeren met behulp van de pip-module:

pip installeer Scrapy

U kunt controleren of de installatie is gelukt door scrapy te importeren in de interactieve shell van Python.

$ python
Python 3.5.2 (standaard, 14 september 2017, 22:51:06)
[GCC 5.4.0 20160609] op linux

Typ "help", "copyright", "credits" of "licentie" voor meer informatie.

>>> scrapy importeren

Nu we klaar zijn met de installatie, gaan we dieper in op de dingen.

Een webscraping-project maken

Tijdens de installatie is het scrapy-sleutelwoord toegevoegd aan het pad, zodat we het sleutelwoord rechtstreeks vanaf de opdrachtregel kunnen gebruiken. We zouden hiervan profiteren tijdens ons gebruik van de bibliotheek.

Voer de volgende opdracht uit vanuit de map van uw keuze:

scrapy startproject webscraper

Dit zou een map maken met de naam webschraper in de huidige map en scrapy.cfg-bestand. In de webschraper  directory zou hebben __in het__.py, items.py, middleware.py, pijpleidingen.py, instellingen.py bestanden en een map met de naam spinnen.

Onze spider-bestanden i.e. het script dat de webscraping voor ons doet, zou worden opgeslagen in de spinnen map.

Onze spin schrijven

Voordat we doorgaan met het schrijven van onze spider, wordt verwacht dat we al weten welke website we willen schrapen. Voor de toepassing van dit artikel schrapen we een voorbeeldwebscraping-website: http://example.web schrapen.com.

Deze website heeft alleen landnamen en hun vlaggen, met verschillende pagina's en we gaan drie van de pagina's schrappen. De drie pagina's waar we aan zouden werken zijn:

http://voorbeeld.web schrapen.com/places/default/index/0
http://voorbeeld.web schrapen.com/places/default/index/1
http://voorbeeld.web schrapen.com/places/default/index/2

Terug naar onze spider, we gaan een sample_spider maken.py in de directory spiders. Vanaf de terminal, een eenvoudige raak sample_spider aan.py commando zou helpen bij het maken van een nieuw bestand.

Nadat we het bestand hebben gemaakt, vullen we het met de volgende regels code:

scrapy importeren
 
klasse SampleSpider (scrapy).Spin):
naam = "voorbeeld"
start_urls = [
"http://voorbeeld.web schrapen.com/places/default/index/0",
"http://voorbeeld.web schrapen.com/places/default/index/1",
"http://voorbeeld.web schrapen.com/places/default/index/2"
]
 
def ontleden (zelf, antwoord):
page_number = reactie.url.splitsen('/')[-1]
file_name = "pagina.html".formaat (paginanummer)
met open(bestandsnaam, 'wb') als bestand:
het dossier.schrijven (antwoord).lichaam)

Voer vanaf het hoogste niveau van de projectdirectory de volgende opdracht uit:

scrapy kruipmonster

Bedenk dat we onze MonsterSpider klasse A, eerste klasse naam attribuut monster.

Na het uitvoeren van die opdracht, zou je merken dat drie bestanden met de naam page0.html, pagina1.html, pagina2.html worden opgeslagen in de map.

Laten we eens kijken wat er met de code gebeurt:

scrapy importeren

Eerst importeren we de bibliotheek in onze naamruimte.

klasse SampleSpider (scrapy).Spin):
naam = "voorbeeld"

Vervolgens maken we een spider-klasse die we noemen MonsterSpider. Onze spin erft van schrapend.Spin. Al onze spinnen moeten erven van scrapy.Spin. Nadat we de klas hebben gemaakt, geven we onze spin een naam attribuut, dit naam attribuut wordt gebruikt om de spider van de terminal op te roepen. Als je het je herinnert, hebben we de scrapy kruipmonster commando om onze code uit te voeren.

start_urls = [
 
"http://voorbeeld.web schrapen.com/places/default/index/0",
"http://voorbeeld.web schrapen.com/places/default/index/1",
"http://voorbeeld.web schrapen.com/places/default/index/2"
]

We hebben ook een lijst met url's voor de spin om te bezoeken. De lijst moet worden aangeroepen start_urls. Als u de lijst een andere naam wilt geven, moeten we a . definiëren start_requests functie die ons wat meer mogelijkheden geeft. Voor meer informatie kun je de scrapy-documentatie bekijken.

Hoe dan ook, vergeet niet om http:// of https:// voor uw links op te nemen, anders zou u te maken krijgen met een ontbrekende schemafout.

def ontleden (zelf, antwoord):

We gaan dan door met het declareren van een ontledingsfunctie en geven deze een antwoordparameter. Wanneer de code wordt uitgevoerd, wordt de ontledingsfunctie opgeroepen en wordt het antwoordobject verzonden dat alle informatie van de bezochte webpagina bevat.

page_number = reactie.url.splitsen('/')[-1]
file_name = "pagina.html".formaat (paginanummer)

Wat we met deze code hebben gedaan, is de tekenreeks met het adres splitsen en alleen het paginanummer opslaan in a paginanummer variabele. Dan maken we een bestandsnaam variabele invoegen van de paginanummer in de string die de bestandsnaam zou zijn van de bestanden die we zouden maken.

met open(bestandsnaam, 'wb') als bestand:
het dossier.schrijven (antwoord).lichaam)

We hebben nu het bestand gemaakt en we schrijven de inhoud van de webpagina in het bestand met behulp van de lichaam attribuut van de reactie voorwerp.

We kunnen meer doen dan alleen de webpagina opslaan. De BeautifulSoup-bibliotheek kan worden gebruikt om de lichaam.reactie. Je kunt deze BeautiulSoup-tutorial bekijken als je niet bekend bent met de bibliotheek.

Van de pagina die moet worden gesloopt, is hier een uittreksel van de html met de gegevens die we nodig hebben:

Je zou merken dat alle benodigde gegevens zijn ingesloten in div-tags, dus we gaan de code herschrijven om de html te ontleden.
Dit is ons nieuwe script:

scrapy importeren
van bs4 import BeautifulSoup
 
klasse SampleSpider (scrapy).Spin):
naam = "voorbeeld"
 
start_urls = [
"http://voorbeeld.web schrapen.com/places/default/index/0",
"http://voorbeeld.web schrapen.com/places/default/index/1",
"http://voorbeeld.web schrapen.com/places/default/index/2"
]
 
def ontleden (zelf, antwoord):
page_number = reactie.url.splitsen('/')[-1]
file_name = "pagina.tekst".formaat (paginanummer)
met open(bestandsnaam, 'w') als bestand:
html_content = BeautifulSoup(reactie.lichaam, "lxml")
div_tags = html_content.find("div", "id": "resultaten")
country_tags = div_tags.find_all("div")
country_name_position = zip(range(len(country_tags)), country_tags)
voor positie, country_name in country_name_position:
het dossier.write("landnummer : \n".formaat (positie + 1, landnaam.tekst))

De code is vrijwel hetzelfde als de eerste, maar ik heb BeautifulSoup toegevoegd aan onze naamruimte en ik heb de logica in de ontledingsfunctie gewijzigd.

Laten we snel naar de logica kijken.

def ontleden (zelf, antwoord):

Hier hebben we de ontledingsfunctie gedefinieerd en deze een responsparameter gegeven.

page_number = reactie.url.splitsen('/')[-1]
file_name = "pagina.tekst".formaat (paginanummer)
met open(bestandsnaam, 'w') als bestand:

Dit doet hetzelfde als besproken in de begincode, het enige verschil is dat we met een tekstbestand werken in plaats van een html-bestand. We zouden de geschraapte gegevens in het tekstbestand opslaan en niet de hele webinhoud in html zoals eerder gedaan done.

html_content = BeautifulSoup(reactie.lichaam, "lxml")

Wat we in deze regel code hebben gedaan, is de reactie.lichaam als argument aan de BeautifulSoup-bibliotheek, en de resultaten toegewezen aan de html_content variabele.

div_tags = html_content.find("div", "id": "resultaten")

We nemen de html-inhoud en analyseren deze hier door te zoeken naar a div tag die ook heeft en ID kaart attribuut met resultaten als het zijn waarde heeft, dan mogen we het opslaan in a div_tags variabele.

country_tags = div_tags.find_all("div")

Vergeet niet dat de landen bestonden in div tags ook, nu krijgen we gewoon alle div tags en sla ze op als een lijst in de country_tags variabele.

country_name_position = zip(range(len(country_tags)), country_tags)
 
voor positie, country_name in country_name_position:
het dossier.write("landnummer : \n".formaat (positie + 1, landnaam.tekst))

Hier herhalen we de positie van de landen tussen alle landtags en vervolgens slaan we de inhoud op in een tekstbestand.

Dus in je tekstbestand zou je zoiets hebben als:

land nummer 1:  Afghanistan
land nummer 2:   landeilanden
land nummer 3:  Albanië

Conclusie

Scrapy is ongetwijfeld een van de krachtigste bibliotheken die er zijn, het is erg snel en downloadt in feite de webpagina. Het geeft je dan de vrijheid om te doen wat je wilt met de webinhoud.

We moeten er rekening mee houden dat Scrapy veel meer kan dan we hier hebben uitgecheckt. U kunt desgewenst gegevens ontleden met Scrapy CSS- of Xpath-selectors. U kunt de documentatie lezen als u iets complexers moet doen.

Top Oculus App Lab-games
Als je eigenaar bent van een Oculus-headset, moet je op de hoogte zijn van sideloading. Sideloading is het proces van het installeren van niet-winkeli...
Top 10 spellen om te spelen op Ubuntu
Het Windows-platform is een van de dominante platforms voor gaming geweest vanwege het enorme percentage games dat tegenwoordig wordt ontwikkeld om Wi...
5 beste arcade-spellen voor Linux
Tegenwoordig zijn computers serieuze machines die worden gebruikt om te gamen. Als je de nieuwe hoge score niet kunt halen, weet je wat ik bedoel. In ...