Webscraping: verschil tussen versies
Naar navigatie springen
Naar zoeken springen
Regel 95: | Regel 95: | ||
== Voorbeeld NewEgg - Scraping == | == Voorbeeld NewEgg - Scraping == | ||
− | [https://www.youtube.com/watch?v=XQgXKtPSzUI] | + | [https://www.youtube.com/watch?v=XQgXKtPSzUI] |
+ | |||
+ | === Doel === | ||
+ | |||
+ | Lijst met | ||
+ | |||
+ | * Productitels | ||
+ | * SKU's | ||
+ | * Prijzen. | ||
== Vraagstukken == | == Vraagstukken == |
Versie van 2 aug 2019 13:45
Webscraping lijkt in twee stappen te gaan:
- Interacteren met een website -
requests
- HTML-parsing -
Beautiful soup
Casussen
- WooCrack Kopiëeren: Hoe kun je WooCrack kopiëren, inclusief de downloads? Dit geldt voor de situatie dat je over inlogcodes beschikt
- Price bot: Hoe kan ik met een script voor bepaalde producten, de prijzen van de concurrent zien? In dit geval zou ik vantevoren de URL's van de websites van concurrenten verzamelen
- Alle koolborstel-info: Kan ik voor een klant die in koolborstels handelt, alle koolborstels te wereld downloaden, inclusief alle gerelateerde data?
Webclients
Om te interacteren met een webserver, heb je een webclient nodig. De gebruikelijke pakketten in Python hiervoor:
- urllib
- urllib2
- urllib3
- requests - Op zichzelfstaand pakket. Niet onderdeel van een van de andere pakketten! - Vermoedelijk het beste pakket [1]
GET, POST, PUT
De belangrijkste HTTP requests:
GET:
Request a resource from a server. Argument: An URLPOST:
Sent data to a server to create/update a resource. Als je Terug klikt binnen een browser, en deze waarschuwt je, dat je iets opnieuw submit, dan betreft het een POST-requestPUT:
Broertje van POST, maar dan idempotent: Als je hetzelfde PUT-commando meerdere keren uitvoert, verandert het resultaat niet. Als je een POST-commando herhaalt, creëer je additionele resources/updates.
GET en POST zijn de twee meestvoorkomende HTTP requests. PUT is een stuk zeldzamer, net als de overige requests (die hier niet behandeld worden).
Requests - Inloggen op een afgeschermde pagina
Dat gaat met requests
verbazend simpel. Sterker nog: Het voorbeeld op de home page demonstreet dit al:
>>> r = requests.get('http://jeronimus.strompf.com', auth=('xxx','yyy')) >>> r.status_code 200 >>> r.headers {'Content-language': 'en', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Vary': 'Accept-Encoding,Cookie', 'X-Powered-By': 'PHP/5.5.9-1ubuntu4.27', 'Date': 'Fri, 02 Aug 2019 12:14:12 GMT', 'Cache-Control': 'private, must-revalidate, max-age=0', 'Server': 'Apache/2.4.7 (Ubuntu)', 'Content-Type': 'text/html; charset=UTF-8', 'Content-Encoding': 'gzip', 'Keep-Alive': 'timeout=5, max=49', 'Connection': 'Keep-Alive', 'Content-Length': '32237', 'Last-Modified': 'Fri, 02 Aug 2019 10:03:24 GMT'} >>> r.headers['content-type'] 'text/html; charset=UTF-8' >>> r.encoding 'UTF-8' >>> r.text '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n<html lang="en" dir="ltr">\n<head>\n<title>Main Page - Jeronimus</title>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\n<meta name="generator" content="MediaWiki 1.16.4" />\n<link rel="alternate" type="application/x-wiki" title="Edit" href="/index.php?title=Main_Page&action=edit" />\n<link rel="edit" title="Edit" href="/index.php?title=Main_Page&action=edit" />\n<link rel="shortcut icon" href="/favicon.ico" />\n<link rel="search" type="application/opensearchdescription+xml" href="/opensearch_desc.php" title="Jeronimus (en)" />\n<link rel="alternate" type="a
Ter verificatie
#! /usr/bin/python3 # # Experiments with requests ################################################################### # # import requests print(">>> Login zonder credentials...") r = requests.get('http://jeronimus.strompf.com') print(r.status_code) print(">>> Login met correcte credentials...") r = requests.get('http://jeronimus.strompf.com', auth=('xxx','correcte wachtwoord')) print(r.status_code) print(">>> Login met incorrecte credentials...") r = requests.get('http://jeronimus.strompf.com', auth=('xxx','Verkeerde wachtwoord')) print(r.status_code)
Uitvoer:
>>> Login zonder credentials... 401 >>> Login met correcte credentials... 200 >>> Login met incorrecte credentials... 401
P.s.: Handjevol HTTP Status codes:
- 200: OK
- 301: Moved Permanently
- 307: Temporary Redirected
- 400: Bad Request
- 401: Unauthorized
- 403: Forbidden - Ik geloof dat je dit krijgt als je Google Search probeert te scrapen
- 404: Not found
- 504: Gateway Timeout - Krijg ik regelmatig op https://couchsurfing.com
Voorbeeld NewEgg - Scraping
Doel
Lijst met
- Productitels
- SKU's
- Prijzen.
Vraagstukken
- Hoe kun je sites scrapen waar je eerst moet inloggen? Paar extra stappen die je met de webclient doorloopt? → Zie voorbeeld
requests
.
Zie ook
Bronnen
- https://www.youtube.com/watch?v=XQgXKtPSzUI - Windows & beginners, maar eigenlijk best wel heel erg goed
- https://zach-adams.com/2015/04/python-scraping-wordpress/
- https://www.youtube.com/watch?v=ng2o98k983k - Python Tutorial: Web Scraping with BeautifulSoup and Requests
- https://www.youtube.com/watch?v=tb8gHvYlCFs - Computerbrowsing
Post (ipv. get)
- https://www.pythoneasy.com/learn/python-how-to-send-a-http-post-and-put-request-in-python-9
- https://stackoverflow.com/questions/111945/is-there-any-way-to-do-http-put-in-python