Webscraping, webverrijking en Wiki WTT 1 Webtechnologie en talen Webscraping, webverrijking en Wiki Maarten Marx www.science.uva.nl/~marx/teaching/0607/wtt Semester Ia en Ib, 2006
Webscraping, webverrijking en Wiki WTT 2 Waar zijn we en wat gaan we doen? Vorige week Tentamen Deze week Webscraping en webverrijking. Webscraping is informatie van het web plukken en bewerken. Webverrijking is webpaginas (van anderen) mooier maken. Gebruik van Wikipedia. Volgende week Webverrijking en Wikis.
Webscraping, webverrijking en Wiki WTT 3 Web scraping WebScraping is extracting information from the Web. Picking out information from web pages and using it in an appliction is said to be scraping the data. Usually refers to harvesting live data feeds or manipulating specific applications via the Web. Also known as Web Mining or Web Harvesting, especially when one type of information is sought across the entire web.
Webscraping, webverrijking en Wiki WTT 4 Web scraping: voorbeelden Vorig jaar gemaakt in Project IK in de praktijk: Plaatsnamen in het nieuws. Google Scholar Google define
Webscraping, webverrijking en Wiki WTT 5 Spul ophalen van het web zonder een browser Kan dat? Natuurlijk! Prima Linux tools hiervoor zijn wget en lynx.
Webscraping, webverrijking en Wiki WTT 6 wget GNU Wget is a free utility for non-interactive download of files from the Web. Wget is non-interactive, meaning that it can work in the background, while the user is not logged on. (Use with a cronjob!) Wget can follow links in HTML and XHTML pages and create local versions of remote web sites, fully recreating the directory structure of the original site. This is sometimes referred to as recursive downloading. Wget has been designed for robustness over slow or unstable network connections.
Webscraping, webverrijking en Wiki WTT 7 Whole story: info wget, man wget, or simply wget -h
Webscraping, webverrijking en Wiki WTT 8 wget gebruik (basic) wget URL haalt URL op en bewaart de pagina onder de oorspronkelijke naam. wget -O mijnnaam URL zelfde, maar bewaart het onder mijnnaam. wget -O - stuurt het resultaat naar standaard output (handig voor pipelines). -a logfile: stuur de info van wget naar logfile en append het. wget -i urllist haalt alle URL s in urllist op. -nc (noclobber) haal een file die al eerder is opgehaald niet nogmaals op.
Webscraping, webverrijking en Wiki WTT 9 wget gebruik (recursive) Soms wil je een hele directory leegplukken, of zelfs een mirror maken van een hele site. Dat kan met wget -r (recursive download). Wget retrieves and parses the HTML from the given URL, retrieving the files the HTML document was referring to, through markup like href, or src. Default depth is 5. Recursive downloads can overload the remote servers, and you may be banned. Use the -w option to slow down retrieval and not be detected.
Webscraping, webverrijking en Wiki WTT 10 You may also quickly overload your own server, or run out of disk space! Wil je alleen files in een bepaalde directory, bijvoorbeeld http://staff.science.uva.nl/~marx/pub/, gebruik dan -np (no parents) en zet de diepte op 1 (met -l 1).
Webscraping, webverrijking en Wiki WTT 11 wget gebruik (voorbeelden) You want to download all the GIFs from a directory on an HTTP server. You tried wget http://www.server.com/dir/*.gif, but that didn t work because HTTP retrieval does not support globbing. In that case, use: wget -r -l1 no-parent -A *.gif http://www.server.com/dir/ -r -l1 means to retrieve recursively with maximum depth of 1. no-parent means that references to the parent directory are ignored -A *.gif means to download only the GIF files.
Webscraping, webverrijking en Wiki WTT 12 wget gebruik (voorbeelden) Gebruik van standard input en output en pipelines: Stel dat http://cool.list.com/ allerlei fijne links bevat, die je allemaal wilt ophalen. Dit kan makkelijk met een pipeline: wget -O - http://cool.list.com/ wget --force-html -i - stuur de URL naar standaard output, en gebruik hem als input voor wget -i. force-html zorgt ervoor dat de input file als een HTML file wordt gezien (en dus dat alle links eruit worden gehaald).
Webscraping, webverrijking en Wiki WTT 13 lynx Lynx is een browser die werkt op de command line binnen een shell. Lynx lijkt vreselijk ouderwets, maar is erg krachtig om URL s te downloaden of te bewerken. Gebruik lynx in plaats van wget als de server wget niet toestaat (Google bijvoorbeeld). Gebruik lynx om snel de relevante tekst van een website te plukken en vervolgens te bewerken.
Webscraping, webverrijking en Wiki WTT 14 Lynx gebruik lynx URL laat URL (kan ook een locale file zijn) zien in de lynx webbrowser. lynx heeft vele opties. Relevante opties voor downloaden van files zijn: -dump dumps the formatted output of the URL to standard output. lynx -source URL > FILE alternatief voor wget -O FILE URL.
Webscraping, webverrijking en Wiki WTT 15 -display charset=mimename Bijvoorbeeld latin1 of utf-8. set the charset for the terminal output. (hiermee kan je characterconversies doen). -stdin laat de standaardinput zien (handig met pipelines). -force html laat files zien die geen HTML extensie hebben. -accept all cookies is soms nodig.
Webscraping, webverrijking en Wiki WTT 16 Lynx voor webscraping Stel je wilt het volgende telegraaf artikel downloaden en als tekst file bewaren. Je wilt alleen het artikel, niets van de tekst eromheen. Met lynx -dump ben je al meteen van de advertenties af. We doen nog wat meer: lynx dump -display charset=iso-8859-1 -nolist -force html file Maar nu hebben we nog wat troep erom heen staan...
Webscraping, webverrijking en Wiki WTT 17 sed one liners http://sed.sourceforge.net/sed1line.txt bevat een schat aan handige oneliners, om tekst te veranderen. http://gmckinney.info/resources/regex.pdf is een handige regular expression quick reference. Wij willen alleen de artikel tekst, dus # Filter 90% van de troep uit de file: lynx --dump -display_charset=iso-8859-1 -nolist -force_html FILE # print section of file between two regular expressions (inclusive) sed -n /door onze redactie/,/zie ook:/p # case sensitive
Webscraping, webverrijking en Wiki WTT 18 #!/bin/sh # usage: clean.sh file Nog wat beter: file=$1; # Filter 90% van de troep uit de file: lynx --dump -display_charset=iso-8859-1 -nolist -force_html $file # print section of file between two regular expressions (inclusive) sed -n /\[sectiontitlebalk\.gif\]/,/zie ook:/p # case sensitive # print only lines which do NOT match regexp (emulates "grep -v") sed -n /\[sectiontitlebalk\.gif\]/!p sed -n /Zie ook:/!p # Verwijder de [images], sed s/\[.*\..*\]//g # remove consequtive identical lines uniq # delete all trailing blank lines at end of file sed -e :a -e /^\n*$/{$d;n;ba -e }
Webscraping, webverrijking en Wiki WTT 19 Practicum map Het telegraaf artikel en het script staan in de practicum map. Experimenteer ermee. Haal bijvoorbeeld een ander telegraaf artikel op en pas je script aan zodat je ook weer precies de tekst overhoudt die je wilt.
Webscraping, webverrijking en Wiki WTT 20 Lynx gebruik 2 We bekijken nog een handig gebruik van lynx:
Webscraping, webverrijking en Wiki WTT 21 Haal de laatste tien nummers van Linux Gazette op Die staan op ftp://ftp.ssc.com/pub/lg/. We willen dus de laatste tien uit die lijst ophalen. Eerst halen we de file op met lynx bash$ lynx -dump ftp://ftp.ssc.com/pub/lg/ Dan willen we de laatste 10 urls hebben eindigend in gz: grep gz$ tail -10
Webscraping, webverrijking en Wiki WTT 22 Dan krijgen we dit: vervolg 87. ftp://ftp.ssc.com/pub/lg/lg-issue89.tar.gz 88. ftp://ftp.ssc.com/pub/lg/lg-issue90.tar.gz 89. ftp://ftp.ssc.com/pub/lg/lg-issue91.tar.gz 90. ftp://ftp.ssc.com/pub/lg/lg-issue92.tar.gz 91. ftp://ftp.ssc.com/pub/lg/lg-issue93.tar.gz 92. ftp://ftp.ssc.com/pub/lg/lg-issue94.tar.gz 93. ftp://ftp.ssc.com/pub/lg/lg-issue95.tar.gz 94. ftp://ftp.ssc.com/pub/lg/lg-issue96.tar.gz 95. ftp://ftp.ssc.com/pub/lg/lg-issue97.tar.gz 96. ftp://ftp.ssc.com/pub/lg/lg-issue98.tar.gz
Webscraping, webverrijking en Wiki WTT 23 vervolg 2 Nu nog van die vervelende nummers af! Maar dit is een space separated file, dus... awk awk print $2 Alternatief: sed s/\^[ \t]*[0-9][0-9]\.[ \t]*// Het hele commando: lynx -dump ftp://ftp.ssc.com/pub/lg/ grep gz$ tail -10 awk {print $2} wget --force-html -i -
Webscraping, webverrijking en Wiki WTT 24 Foto opdracht Je baas wil fotos hebben van elke Nederlandse minister en lid van de tweede Kamer. Dat zijn zo n 170 fotos! Die ga je toch niet met de hand van het net plukken? We doen dat met een script. Gebruik Wikipedia om de namen te vinden. Vindt de fotos met Google afbeeldingen.
Webscraping, webverrijking en Wiki WTT 25 Bewaar ze als politicusnaam.extensie met extensie het juiste formaat.
Webscraping, webverrijking en Wiki WTT 26 Foto opdracht Hints Doe het hele proces voor 1 persoon eerst eens met hand in firefox. Bekijk de URL s goed. Voor elke naam, doe haal de google afbeeldingen pagina op met lynx --dump of lynx --source vis de beste afbeelding uit de lijst met een reguliere expressie haal de oorspronkelijke URL eruit met een reguliere expressie haal die afbeelding op en bewaar hem met wget -O
Webscraping, webverrijking en Wiki WTT 27 For loop in bash script #!/bin/sh # usage: get-google-pics.sh inputfile # input file is een file met op elke regel een #politicus naam met + tekens in plaats van spaties. input=$1; for name in cat $input ; do #get the google page # get the url of the pictures #delete doubles uniq # get the first one (if you want more change 1 to n)(if you want all delete the next # get the picture and save it as ${name}.extensie wget -O "${name}.jpg" -i - done
Webscraping, webverrijking en Wiki WTT 28 ## problems: # 1 extensie is nu altijd.jpg, maar dit klopt natuurlijk niet altijd
Webscraping, webverrijking en Wiki WTT 29 Foto opdracht formaat Het hele proces moet automatisch. Stop alle fotos in een aparte directory. Lever dus een shell script in wat alles doet, inclusief het ophalen en opslaan van de namen. Geef duidelijk in commentaar weer wat er gebeurt in je script. Als iets niet automatisch lukt, doe het met de hand en geef dat aan in je script.
Webscraping, webverrijking en Wiki WTT 30 Reguliere expressies Onmisbaar bij het manipuleren van strings. Perl regexps worden behandeld in? Hfd 9.9. Een ander mooie referentie is http://manning.com/maher/ hfd 3 en 8. Pas op! Er zijn verschillende smaken van de reguliere expressies. sed werkt niet met perl regular expressions. grep -P wel! grep heeft allerlei opties. Zie man grep of grep -h
Webscraping, webverrijking en Wiki WTT 31 grep voorbeeld 14. http://images.google.nl/imgres?imgurl=http://www.illc.uva.nl/j50/contribs/hoog land/marxillc.jpeg&imgrefurl=http://www.illc.uva.nl/j50/contribs/hoogland/&h=552& w=382&sz=64&tbnid=j8muu-tdq7nkfm:&tbnh=133&tbnw=92&hl=nl&start=3&prev=/images %3Fq%3D%2Bmaarten%2Bmarx%26svnum%3D10%26hl%3Dnl%26lr%3D%26ie%3DUTF-8%26oe%3DUTF-8%26 %26rls%3Dorg.mozilla:en-US:official%26sa%3DN 15. http://images.google.nl/imgres?imgurl=http://www.illc.uva.nl/j50/cover33.jpg& imgrefurl=http://www.illc.uva.nl/j50/&h=394&w=394&sz=84&tbnid=4qufjzpugljpam:& tbnh=124&tbnw=124&hl=nl&start=4&prev=/images%3fq%3d%2bmaarten%2bmarx%26svnum%3d10%26 3Dnl%26lr%3D%26ie%3DUTF-8%26oe%3DUTF-8%26client%3Dfirefox-a%26rls%3Dorg.mozilla:en-U 16. http://images.google.nl/imgres?imgurl=http://www.illc.uva.nl/lia/images/ group_lic.jpg&imgrefurl=http://www.illc.uva.nl/lia/lic.html&h=271&w=190&sz=14 &tbnid=9njbxi_iahud0m:&tbnh=113&tbnw=79&hl=nl&start=5&prev=/images%3fq%3d%2bmaarten %2Bmarx%26svnum%3D10%26hl%3Dnl%26lr%3D%26ie%3DUTF-8%26oe%3DUTF-8%26client%3Dfirefoxen-US:official%26sa%3DN
Webscraping, webverrijking en Wiki WTT 32 grep voorbeeld 2 Waar zitten de plaatjes? Hoe krijg je ze eruit? Pak alles wat begint met http en eindigt met gif,jpg,jpeg Makkelijk: http.*(jpeg gif jpg)... Werkt dat? Nee, want er wordt greedy gematched! Gebruik karakters die zeker NIET voorkomen in je gewenste URL s. Dus bijvoorbeeld http[^"&=%]*(gif jpg jpeg).
Webscraping, webverrijking en Wiki WTT 33 [^ab] betekent alles behalve a of b. Met grep only-matching -P regexp krijg je precies die strings die met je perl-regexp matchen.
Webscraping, webverrijking en Wiki WTT 34 Verrijking van webpaginas Bijvoorbeeld het mooi weergeven van een RSS feed. CSS, en XSLT zijn hier standaard technieken. Maar ook extra IR technieken kunnen veel bieden.
Webscraping, webverrijking en Wiki WTT 35 Opdracht: Verrijken van een RSS feed Neem een RSS feed met berichten over Nederlands politiek nieuws. Die kunnen we mooi laten zien met XSLT. Nu willen we wat extra s toevoegen: elke naam van een politieke partij of een minister of een lid van de Tweede kamer in het description gedeelte willen we voorzien van een link naar een relevante pagina. Zo laten we dan die feed zien.
Webscraping, webverrijking en Wiki WTT 36 Wat voor data hebben we nodig? Namen en hyperlinks naar relevante paginas. Bijvoorbeeld maarten marx http://staff.science.uva.nl/~marx/ Die halen we natuurlijk van het web: weer webscraping!
Webscraping, webverrijking en Wiki WTT 37 Opdracht: Namen en hyperlinks ophalen http://nl.wikipedia.org/wiki/politieke_partijen_in_ Nederland heeft een lijstje van de partijen in de tweede kamer. Ook kan je lijstjes van de leden en de ministers vinden. Download die, en gebruik xsltproc om de namen en hun hyperlinks eruit te vissen. Sla die op in een XML file, bijvoorbeeld als <name url= http://nl.wikipedia.org/wiki/cda >CDA</name> Lever een shell script in dat de wikipedia paginas ophaalt, de namen eruit vist en ze keurig in een XML file plaatst.
Webscraping, webverrijking en Wiki WTT 38 Structuur van deze opdracht 1. Verzin een handige DTD om je data in op te slaan. 2. Zoek goede paginas (wikipedia) waaruit je data kan scrapen. 3. Scrapen gaat heel makkelijk met XPath, dus kies mooie (X)HTML paginas. 4. Maak een xslt stylesheet dat één pagina scraped, en je spullen in het juiste formaat zet. 5. Doe het laatste voor alle paginas. 6. Combineer alles in een shell script.
Webscraping, webverrijking en Wiki WTT 39 De DTD Je hebt drie soorten data: partijen, ministers, Tweede Kamerleden. Voor alle drie wil je namen en hyperlinks opslaan. Iets als dit ligt voor de hand: lijst -> (partijen*,ministers*,kamerleden*) partijen -> member* member -> EMPTY maar met attributen url en naam Maar dan kan je maar 1 naam opslaan per member. (terwijl je er misschien meer wilt: SP én Socialistische Partij). Dus je zou ook eber - name+* kunnen kiezen.
Webscraping, webverrijking en Wiki WTT 40 Goede paginas http://nl.wikipedia.org/wiki/politieke_partijen_in_ Nederland heeft een lijstje van de partijen in de tweede kamer. Ook kan je lijstjes van de leden en de ministers vinden. Bekijk hem in je browser en met view-page-source. Probeer de structuur te zien als een boom.
Webscraping, webverrijking en Wiki WTT 41 Download die pagina. Scrapen met XPath wget -O partijen.html "http://nl.wikipedia.org/wiki/politieke_partijen_in_nederland" Bekijk hem in je editor of met more. Probeer XPath expressies te verzinnen die datgene eruit halen wat jij wilt hebben.
Webscraping, webverrijking en Wiki WTT 42 XPath expressies <table> <tr> <td><a href="/wiki/christenunie" title="christenunie">cu</a></td> <td><a href="/wiki/christenunie" title="christenunie">christenunie</a></td> </tr> Twee verschillende voorkomens van de naam! Die willen we allebei wel. De URL gaat met //table/tr/td/a/@href. De namen met //table/tr/td/a. Maar misschien staan er wel meer table elementen in die file...
Webscraping, webverrijking en Wiki WTT 43 In een stylesheet <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:output method="xml" encoding= ISO-8859-1 /> <xsl:template match= / > <!--pak juiste tabel--> <xsl:apply-templates select="//table[./tr/td[contains(., CDA )]][1]"/> </xsl:template> <xsl:template match="table"> <xsl:for-each select= tr > <!--plak de base url ervoor--> <name url="http://nl.wikipedia.org/{./td[1]/a/@href}"> <xsl:value-of select=./td[1] /> </name> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Webscraping, webverrijking en Wiki WTT 44 Uitproberen in Jedit of op de commandline xsltproc --html --novalid haal-links-eruit.xsl partijen.html Foutmeldingen over de html pagina kan je natuurlijk ignoreren. Let op <xsl:output method="xml"/>. Dat maakt het makkelijk om XML te outputten, maar je krijgt wel een header! Alternatief is <xsl:output method="text"/>, maar dan moet je alle output text ook zelf echt maken met xsl:text.
Webscraping, webverrijking en Wiki WTT 45 Uitkomst van ons stylesheet <?xml version="1.0" encoding="iso-8859-1"?> <name url="http://nl.wikipedia.org//wiki/christen-democratisch_app%c3%a8l">cda</name <name url="http://nl.wikipedia.org//wiki/christenunie">cu</name> <name url="http://nl.wikipedia.org//wiki/democraten_66">d66</name> <name url="http://nl.wikipedia.org//wiki/groenlinks">gl</name> <name url="http://nl.wikipedia.org//wiki/lijst_pim_fortuyn">lpf</name> <name url="http://nl.wikipedia.org//wiki/partij_van_de_arbeid_%28nederland%29">pvda< <name url="http://nl.wikipedia.org//wiki/staatkundig_gereformeerde_partij">sgp</name <name url="http://nl.wikipedia.org//wiki/socialistische_partij_%28nederland%29">sp</ <name url="http://nl.wikipedia.org//wiki/volkspartij_voor_vrijheid_en_democratie">vv Werken al die links? We hebben nog niet alle voorkomens van namen... Dit is geen valid XML!
Webscraping, webverrijking en Wiki WTT 46 Combinatie in een shell script #!/bin/sh # usage: maak-lijstjes.sh >output file # schrijf de xml header echo -e "<?xml version= 1.0 encoding= ISO-8859-1?>"; # schrijf de root echo -e "<lijst>"; # haal de partijen op en zet ze in een lijst echo -e "<partijen>"; ## if the url does not want to load, combine it with wget as follows # wget -O - "http://nl.wikipedia.org/wiki/politieke_partijen_in_nederland" # xsltproc --html --novalid haal-links-eruit.xsl - >/tmp/effe.xml; xsltproc --html --novalid haal-links-eruit.xsl "http://nl.wikipedia.org/wiki/politie # haal de xml header eraf (de eerste regel dus) echo " cat /tmp/effe.xml sed 1d "; # sluit partijen af echo -e "</partijen>";
Webscraping, webverrijking en Wiki WTT 47 # haal de ministers en tweede kamer leden op op dezelfde wijze #sluit xml root af echo -e "</lijst>"; #gooi effe weer weg rm /tmp/effe.xml;
Webscraping, webverrijking en Wiki WTT 48 Practicum In de practicum map vind je de besproken scripts en stylesheets. Experimenteer met het telegraaf scrape script. Haal eens een andere telegraaf pagina op en run het daarop. Maak net zo n script voor Volkskrant paginas. Maak de foto opdracht en de politieke lijstjes opdracht. Je mag weer samenwerken in een groepje van hooguit twee. De RSS opdracht doen we volgende week.
Webscraping, webverrijking en Wiki WTT 49 Webverrijking en Wiki s. Volgende Keer op WTT