<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Staffan Malmgrens blogg &#187; webscraping</title>
	<atom:link href="http://blog.tomtebo.org/tag/webscraping/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tomtebo.org</link>
	<description>Programmering, juridik, punkrock och andra trivialiteter</description>
	<lastBuildDate>Sun, 01 Jan 2012 14:51:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>SF Bio, negativ marknadsföring och sökspindeljuridik</title>
		<link>http://blog.tomtebo.org/2008/02/07/sf-bio-negativ-marknadsforing-och-sokspindeljuridik/</link>
		<comments>http://blog.tomtebo.org/2008/02/07/sf-bio-negativ-marknadsforing-och-sokspindeljuridik/#comments</comments>
		<pubDate>Thu, 07 Feb 2008 17:48:14 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[law]]></category>
		<category><![CDATA[dataintrång]]></category>
		<category><![CDATA[dumheter]]></category>
		<category><![CDATA[länkning]]></category>
		<category><![CDATA[upphovsrätt]]></category>
		<category><![CDATA[webscraping]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/2008/02/07/sf-bio-negativ-marknadsforing-och-sokspindeljuridik/</guid>
		<description><![CDATA[Kanske är det för att jag själv sysslat mycket med screenscraping och omstöpande av innehåll från andra webbplatser som jag tycker att SF Bio:s agerande enligt nedanstående är rent fantastiskt korkat &#8212; ännu mer så när det kommer från den &#8230; <a href="http://blog.tomtebo.org/2008/02/07/sf-bio-negativ-marknadsforing-och-sokspindeljuridik/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Kanske är det för att jag själv sysslat mycket med screenscraping och omstöpande av innehåll från andra webbplatser som jag tycker att SF Bio:s agerande enligt nedanstående är rent fantastiskt korkat &#8212; ännu mer så när det kommer från den enda sektor av filmbranschen som faktiskt i teorin kan erbjuda ett mervärde som inte kan kopieras digitalt.</p>
<blockquote><p>&#8221;På SF medger man att biotider.se numera inte har möjlighet att automatiskt hämta information om var och när filmerna visas. Enligt informationschefen Thomas Runfors är nu de &#8221;spindlar&#8221;, eller program, som biotider.se använt blockerade&#8221; </p></blockquote>
<p>(<a href="http://www.svd.se/kulturnoje/nyheter/artikel_849945.svd">SvD</a>, läs även <a href="http://bloggywood.se/2008/02/06/sf-tvingar-biotiderse-till-att-stanga/">Bloggywood</a> eller <a href="http://behind.biotider.se/2008/02/05/biotiderse-tvingas-av-sf-att-upphora-med-sin-verksamhet/">direkt från källan</a>.)
</p>
<p>Jag kände inte till <a href="http://www.biotider.se/">biotider.se</a> sedan tidigare (man kan väl anta att de fått rätt bra med uppmärksamhet nu i elfte timmen, då ovanstående just nu är förstanyhet på svd.se), men det verkar vara en schysst site &#8211; lagom web 2.0-ig ut med taggmoln och pastellfärger och användarinteraktion och annat bra som SF:s egen webbplats inte har. Att alienera sådana <a href="http://headrush.typepad.com/creating_passionate_users/">passionerade användare</a> känns som grund för uppsägning för en marknadschef på 2000-talet.</p>
<p>Men marknadsföring är inte min grej, så vad vet jag. Dock är  de juridiska aspekterna är ju intressanta. Jag kan se tre separata frågor.</p>
<p><b>1: Har SF någon ensamrätt över sina biotider?</b> Jag tycker det känns lite tveksamt &#8212; nån vanlig upphovsrätt kan det inte vara frågan om (då såväl verkshöjd som originalitet saknas), men kanske s.k. <a href="http://lagen.nu/1960:729#P49">databas- eller tabellskydd</a>? Denna ensamrätt är en s.k. närstående rättighet, som regleras i samma lag som upphovsrätten, men lyder under andra villkor. Huvudregeln för att något ska skyddas på detta sätt är att att det ska vara antingen en samling av ett stort antal uppgifter, eller att samlingen ska vara resultatet av en stor investering. Både rättsläget och det aktuella fallet är alltför komplicerat för att jag ska våga mig på att reda ut huruvida någon ensamrätt föreligger för biotiderna, men det är i vart fall inte självklart. (Den intresserade läser lämpligtvis <a href="http://www.dom.se/Domstolar/hogstadomstolen/Avgoranden/2005/2005-12-28_T_2106-01_Dom.pdf">Fixtures mot Svenska Spel</a> och fortsätter med <a href="http://www.adbj.se/2006/uppsats.htm">Johan Axhamns examensuppsats</a>)</p>
<p><b>2: Har SF möjlighet att spärra ut crawlers?</b> Till att börja med kan man observera att SF inte har någon <a href="http://www.sf.se/robots.txt">robots.txt-policy</a>, vilket är lite märkligt eftersom de hänvisar till den från sin<a href="http://www.sf.se/foretag/omsfbio/lankningspolicy">länkpolicysida</a>. Eftersom rättsläget kring rekvisiten för dataintrång är så pass luddigt i svensk rätt (vilket jag <a href="http://blog.tomtebo.org/2005/06/15/har_du_olovligen_berett_dig/">skrivit om</a> <a href="http://blog.tomtebo.org/2005/03/29/the_legality_of_screenscraping/">tidigare</a>) är det lite oklart vilken betydelse en sådan icke-maskinläsbar policy har, men vi får anta att biotider.se åtminstone numera är medvetna om att de inte har SF Bio:s tillåtelse att hämta datat (&#8221;bereder sig tillgång till en uppgift som är avsedd för automatiserad behandling&#8221;). Därmed kan det utgöra dataintrång att fortsätta.</p>
<p><b>3: Har SF möjlighet att förbjuda djuplänkar?</b> (i betydelsen &#8221;länk till en resurs annan än &#8221;startsidan&#8221; på en webbplats.) Rent tekniskt har de möjligheten &#8211; sf.se har infört en referer-check genom vilken den som försöker följa en länk från biotider.se till SF:s bokningssida för en specifik film, plats och tid www.sf.se istället vidarebefordras till SF:s förstasida, och får välja film, plats och tid igen (och under processen exponeras för några reklambanners). Men kan SF på upphovsrättslig eller annan grund tvinga biotider.se att inte djuplänka? Rättsläget är inte solklart, men i tidigare diskussioner om länkning och svensk rätt har man främst riktat in sig på två fall:</p>
<ul>
<li>inramade länkar, dvs när en frame-tagg i ett frameset på en första webbplats hänvisar till en annan webbplats så att det för användaren framstår som den externa webbbplatsens innehåll är en del av den första webbplatsens, eller</li>
<li>direktlänkar till ljud- eller bildfiler, som för användaren typiskt spelas upp utan att det tydligt framgår att innehållet kommer från en annan webbplats</li>
</ul>
<p>Dessa skulle kunna falla in under beskrivningen av offentligt framförande, vilket är ett upphovsrättsligt förfogande. Men jag har svårt att se att en länkning från en sida till en annan sida, där det tydligt framgår att innehållet på den nya sidan kommer från en annan part, skulle kunna hindras på upphovsrättslig väg. Den kan förstås hindras på avtalsmässig väg, men nu har ju biotider.se och SF Bio knappast träffat något avtal.</p>
<p>Så möjligtvis finns det en (svag) juridisk grund för SF att hindra biotider.se att fortsätta sin verksamhet, även om det inte är den man hävdar i sina uttalanden. Klart är att man redan försökt hindra dem <a href="http://blog.tomtebo.org/2005/10/11/juridiska-vs-tekniska-losningar-pa-problem/">på teknisk väg</a> åtskilliga gånger. Om SF lyckas blir förlorarna dels biotider.se, dels alla människor som trots att de blir utsatta för <a href="http://moonhouse.se/posts/1266">rent förolämpade pekpinnar</a> envisas med att stödja filmbranschen. Men ser någon några vinnare?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2008/02/07/sf-bio-negativ-marknadsforing-och-sokspindeljuridik/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Cachning och throttling för webspindlar i python</title>
		<link>http://blog.tomtebo.org/2006/04/15/cachning-och-throttling-for-webspindlar-i-python/</link>
		<comments>http://blog.tomtebo.org/2006/04/15/cachning-och-throttling-for-webspindlar-i-python/#comments</comments>
		<pubDate>Fri, 14 Apr 2006 22:37:51 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[källkod]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[webscraping]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/?p=283</guid>
		<description><![CDATA[Om du inte ägnar dig åt att programmera webspindlar i Python är dagens post förmodligen inte av så stort intresse. Men: Jag har ägnat långfredagen åt att bland annat putsa på några utökningar till urllib2. För länge sedan skrev jag &#8230; <a href="http://blog.tomtebo.org/2006/04/15/cachning-och-throttling-for-webspindlar-i-python/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>
Om du inte ägnar dig åt att programmera webspindlar i Python är dagens post förmodligen inte av så stort intresse.
</p>
<p>
Men: Jag har ägnat långfredagen åt att bland annat putsa på några utökningar till urllib2. För länge sedan skrev jag något i stil med att<br />
urllib2 var alldeles för komplext, men jag lutar nu åt att det &#8221;bara&#8221; är underdokumenterat.
</p>
<p>
Jag behövde ett sätt att från ett pythonprogram hämta websidor utan att hämta samma sida två gånger i onödan. Jag ville dessutom att förfrågningarna inte skulle ske allt för tätt inpå varandra &#8212; jag ville med andra ord ha en cache och en throttling-mekanism. Det visar sig att urllib2&#8242;s modell med kedjade handlers som anropas efter varandra lät mig göra det hela på ett mycket smidigt sätt.
</p>
<p>
Här är resultatet: <a href='/wp-content/StandaloneRobot.py'>StandaloneRobot.py</a>. Testkoden i slutet förklarar hur det funkar; en anropare kan observera hur cache/throttling har använts genom att titta efter x-cache och x-throttling-headers i resultatet.
</p>
<p>
Lagringsmekanismen för cachen är inte den smartaste, men den funkar. Den implementerar inte en &#8221;riktig&#8221; cache såsom en sådan ska funka enligt HTTP/1.1, utan har en GET-förfrågan till en viss URL skickats så får alla efterföljande förfrågningar till samma URL det cacheade svaret &#8212; tills man raderar cachen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2006/04/15/cachning-och-throttling-for-webspindlar-i-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PM om juridiska aspekter på robots.txt</title>
		<link>http://blog.tomtebo.org/2005/10/27/pm-om-juridiska-aspekter-pa-robotstxt/</link>
		<comments>http://blog.tomtebo.org/2005/10/27/pm-om-juridiska-aspekter-pa-robotstxt/#comments</comments>
		<pubDate>Thu, 27 Oct 2005 21:19:00 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[law]]></category>
		<category><![CDATA[dataintrång]]></category>
		<category><![CDATA[PM]]></category>
		<category><![CDATA[webscraping]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/law/pm-om-juridiska-aspekter-pa-robotstxt.html</guid>
		<description><![CDATA[Här är den tidigare omnämda PM:en om juridiska aspekter på robots.txt (i PDF-format), som jag skrev efter att ha diskuterat frågeställningarna med mina kollegor på IRI.]]></description>
			<content:encoded><![CDATA[<p>Här är den <a href="http://blog.tomtebo.org/law/malnummer-personuppgifter-och-journalistisk-verksamhet.html">tidigare omnämda</a> PM:en om <a href="/wp-content/juridiska-aspekter-pa-robots.txt.pdf">juridiska aspekter på robots.txt</a> (i PDF-format), som jag skrev efter att ha diskuterat frågeställningarna med <a href="http://www.juridicum.su.se/iri/medarbetare/">mina kollegor på IRI</a>. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2005/10/27/pm-om-juridiska-aspekter-pa-robotstxt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Juridiska vs tekniska lösningar på problem</title>
		<link>http://blog.tomtebo.org/2005/10/11/juridiska-vs-tekniska-losningar-pa-problem/</link>
		<comments>http://blog.tomtebo.org/2005/10/11/juridiska-vs-tekniska-losningar-pa-problem/#comments</comments>
		<pubDate>Tue, 11 Oct 2005 17:48:35 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[lagen.nu]]></category>
		<category><![CDATA[law]]></category>
		<category><![CDATA[dataintrång]]></category>
		<category><![CDATA[offentlighetsprincipen]]></category>
		<category><![CDATA[personuppgifter]]></category>
		<category><![CDATA[PUL]]></category>
		<category><![CDATA[webscraping]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/?p=267</guid>
		<description><![CDATA[Idag blev jag uppringd av en person från domstolsverket, som hade sett lagen.nu. Personen i fråga var dock kritisk till att jag länkar direkt till rättsfallen på deras site; genom mina länkar hade nämligen Google hittat till rättsfallen och indexerat &#8230; <a href="http://blog.tomtebo.org/2005/10/11/juridiska-vs-tekniska-losningar-pa-problem/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Idag blev jag uppringd av en person från <a href="http://www.dom.se/">domstolsverket</a>, som hade sett <a href="http://lagen.nu/">lagen.nu</a>. Personen i fråga var dock kritisk till att jag länkar direkt till rättsfallen på deras site; genom mina länkar hade nämligen Google hittat till rättsfallen och indexerat dessa. Det ansåg man var dåligt, då vissa referat kan innhålla personuppgifter, och om dessa indexeras kan dessas personliga integritet kränkas. Detta är grundproblemet, vilket jag har viss förståelse för.
</p>
<p>
Domstolsverket hade ursprungligen tänkt att Google och andra sökmotorer inte skulle <em>kunna</em> indexera rättsfallen genom att man valt en <a href="http://blog.tomtebo.org/programming/lagen.nu_tech_2.html">relativt komplicerad weblösning</a> för att göra dessa tillgängliga, men då jag lade in direktlänkar på lagen.nu brast den förutsättningen.
</p>
<p>
Fråga uppstod om huruvida jag inte borde ha kontaktat domstolsverket innan, och även om min hantering kunde tänkas bryta mot <a href="http://lagen.nu/1998:204">personuppgiftslagen</a>. Vad gäller att be om tillstånd innan man länkar har jag alltid tyckt att det är fullständigt fel. Välkommen till webben, det är så här den funkar, liksom. Vad gäller PUL så är jag relativt säker på att min behandling, som enbart befattar sig med den data som finns i varje domsluts detaljvy, inte faller under dess bestämmelser, då personuppgifter enbart kan förekomma i referaten.
</p>
<p>
Jag har, från tid till annan, funderat på att även behandla/lägga upp referaten, men valt att inte göra det just på grund av hänsyn till personuppgiftslagen. En lösning på problemet skulle vara att skaffa ett <a href="http://www.rtvv.se/se/Internet/utgivningsbevis/">utgivningsbevis</a> för lagen.nu så att <a href="http://lagen.nu/1991:1469">YGL</a> blir tillämplig; då gäller (enkelt uttryckt) inte PUL. Av flera olika anledningar är dock inte det aktuellt i dagsläget. Men det är ett ämne för ett inlägg någon annan dag.
</p>
<p>
Sedan i eftermiddag har domstolsverket valt att lösa problemet genom att stoppa in en <a href="http://www.rattsinfosok.dom.se/robots.txt">restriktiv robots.txt</a> på sin tjänst. Detta gör att jag inte, enligt <a href="http://www.robotstxt.org/wc/exclusion.html">den sedvänja som gäller på internet</a>, får screenscrape:a tjänsten. Vilket jag naturligtvis tycker är dumt, inte minst med avseende på <a href="http://lagen.nu/1949:105#K2">offentlighetsprincipen</a>, och vilket leder till att listorna med rättsfall under paragraferna på lagen.nu gradvis kommer bli mer och mer irrelevanta. Jag har mailat en förfrågan om huruvida domstolsverket kan göra ett undantag i denna policy för mig, men inte fått något slutgiltigt besked.
</p>
<p>
Trots att slutresultatet, åtminstone som det ser ut nu, går lagen.nu emot, så tycker jag ändå att domstolsverket har handlat ganska rätt. Visst borde de haft en robots.txt uppe sen dag ett, och visst borde de göra undantag för min webrobot, och kanske borde man fråga sig vad personuppgifterna har att göra i domslutsreferat som ska vara anonymiserade, men nu har de iaf löst ett tekniskt problem med en teknisk, snarare än en juridisk, åtgärd. Alla tjänar på att sådana här riktlinjer <a href="http://www.code-is-law.org/">uttrycks med kod, inte författningar</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2005/10/11/juridiska-vs-tekniska-losningar-pa-problem/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Har du olovligen berett dig tillgång till en upptagning för automatiserad databehandling idag?</title>
		<link>http://blog.tomtebo.org/2005/06/15/har_du_olovligen_berett_dig/</link>
		<comments>http://blog.tomtebo.org/2005/06/15/har_du_olovligen_berett_dig/#comments</comments>
		<pubDate>Wed, 15 Jun 2005 21:46:07 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[law]]></category>
		<category><![CDATA[avtalsfrihet]]></category>
		<category><![CDATA[dataintrång]]></category>
		<category><![CDATA[webscraping]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/law/har_du_olovligen_berett_dig_tillgang_till_en_upptagning_for_automatiserad_databehandling_idag.html</guid>
		<description><![CDATA[Bruce Schneier länkar till en mycket intressant artikel om vad begreppet &#8221;Unauthorized access&#8221; betyder i datorsammanhang, i ett rättsligt perspektiv, utgående från amerikansk rättspraxis och -doktrin. Artikelförfattaren, Orin S. Kerr, kommer fram till att begrepp som &#8221;access&#8221; och &#8221;authorized&#8221; används &#8230; <a href="http://blog.tomtebo.org/2005/06/15/har_du_olovligen_berett_dig/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>
Bruce Schneier <a href="http://www.schneier.com/blog/archives/2005/06/defining_access.html">länkar<br />
till</a> en mycket intressant <a href="http://papers.ssrn.com/sol3/papers.cfm?abstract_id=399740">artikel</a><br />
om vad begreppet &#8221;Unauthorized access&#8221; betyder i datorsammanhang, i ett<br />
rättsligt perspektiv, utgående från amerikansk rättspraxis och<br />
-doktrin. Artikelförfattaren, <a href="http://www.law.gwu.edu/faculty/profile.asp?ID=3568">Orin<br />
S. Kerr</a>, kommer fram till att begrepp som &#8221;access&#8221; och<br />
&#8221;authorized&#8221; används som om deras mening vore otvetydig, när de i<br />
själva verket är väldigt dåligt definerade. Artikeln är inte pinfärsk<br />
(oktober 2003), men så vitt jag vet är de frågeställningar som tas upp<br />
fortfarande aktuella. Det handlar helt enkelt om var gränsen för<br />
brottet &#8221;dataintrång&#8221; skall dras.
</p>
<p>
Svensk och amerikansk lagstiftning verkar vara ganska likartad här, i<br />
det att det finns ett brott (dataintrång respektive &#8221;unauthorized<br />
access&#8221;) som har två rekvisit &#8212; i svensk lag &#8221;att bereda sig tillgång<br />
till upptagning för automatiserad databehandling&#8221;, samt att denna<br />
handling skall vara &#8221;otillåten&#8221; (<a href="http://lagen.nu/1962:700#K4P9c">BrB 4:9 c</a>). Amerikansk lag<br />
har de bägge rekvisiten i brottsbenämningen.
</p>
<p>
Jag har <a href="http://blog.tomtebo.org/programming/the_legality_of_screenscraping.html">tidigare<br />
intresserat mig</a> för den svenska motsvarigheten, och kom fram till<br />
att framförallt &#8221;olovligen&#8221; var ett väldigt suddigt begrepp. Kerr kommer även i sin artikel fram till att gränserna är suddiga och inte<br />
har dragits konsekvent i praxis. Han förespråkar att<br />
&#8221;kontraktsbaserade&#8221; överträdelser inte i sig ska bedömas som<br />
&#8221;unauthorized&#8221;, utan att det ska krävas någon typ av kringående av en<br />
teknisk accesskontroll:
</p>
<blockquote><p>
This Article proposes that courts should reject contract-based<br />
notions of authorization, and instead limit the scope of unauthorized<br />
access statutes to cases involving the circumvention of code-based<br />
restrictions. The fact that computer use violates a contractual restriction<br />
should not turn that use into an unauthorized access. The bypassing<br />
of a code-based restriction such as a password gate should be<br />
required to trigger criminal liability, such that hacking into a computer<br />
could be an unauthorized access, but violating Terms of Service would<br />
not be.
</p></blockquote>
<p>
En kontraktsbaserad överträdelse skulle här kunna vara att bryta mot<br />
ett explicit eller implicit avtal (ett avtalsbrott kan dock<br />
naturligtvis alltid angripas med civilrättsliga principer). Ett<br />
explicit avtalsbrott skulle kunna vara att bryta mot en webtjänsts<br />
användarvillkor, ett implicit avtalsbrott skulle kunna vara att<br />
använda en annonsblockerare.
</p>
<p>
Den <a href="http://conventions.coe.int/Treaty/en/Treaties/Html/185.htm">EG-konvention<br />
om angrepp mot informationssystem</a> som Sverige har börjat<br />
implementera iom <a href="http://www.regeringen.se/sb/d/108/a/40254">Ds 2005:5</a> gav<br />
utrymme för medlemsländerna att lagstifta om att det skulle krävas<br />
kringgående av säkerhetsåtgärder för att rekvisitet &#8221;olovligen&#8221;<br />
skulle uppfyllas. Utredningen bakom Ds 2005:5 har valt att inte<br />
utnyttja denna möjlighet, vilket jag tycker är synd. Det leder till,<br />
som jag skrev i mitt <a href="http://blog.tomtebo.org/programming/the_legality_of_screenscraping.html">tidigare<br />
inlägg</a>, att många handlingar som har ett positivt värde för<br />
samhället, kan betraktas som dataintrång.
</p>
<p>
Jag var på <a href="http://www.adbj.se/2005/sem050511.htm">ett<br />
föredrag</a> för ett tag sedan där Ds 2005:5 (och framförallt <a href="http://www.regeringen.se/sb/d/108/a/39950">Ds 2005:6</a>)<br />
presenterades. Jag fick intrycket att målsättningen hade varit att<br />
göra minsta möjliga ändring i de svenska lagarna för att kunna säga<br />
att EG-konventionskraven är uppfyllda. Det är förmodligen därför man<br />
inte gjorde något åt det hopplösa uttrycket &#8221;bereder sig tillgång till<br />
upptagning för automatisk databehandling&#8221; inte ändrats. Eller, fel av<br />
mig, man föreslår faktiskt en ändring, till &#8221;bereder sig tillgång till<br />
<i>en</i> upptagning för <i>automatiserad</i> databehandling&#8221;&#8230;
</p>
<p>
Kerrs artikel ger en bra analys av varför en definition av<br />
&#8221;unauthorized&#8221; som kan innefatta kontraktsbaserade överträdelser leder<br />
till en oförutsägbar rättstillämpning. Jag hoppas att den svenska<br />
lagstiftaren utnyttjar möjligheten till att tydliggöra begreppen<br />
längre fram i lagstiftningsprocessen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2005/06/15/har_du_olovligen_berett_dig/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The legality of screenscraping</title>
		<link>http://blog.tomtebo.org/2005/03/29/the_legality_of_screenscraping/</link>
		<comments>http://blog.tomtebo.org/2005/03/29/the_legality_of_screenscraping/#comments</comments>
		<pubDate>Tue, 29 Mar 2005 15:33:56 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[law]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[dataintrång]]></category>
		<category><![CDATA[upphovsrätt]]></category>
		<category><![CDATA[webscraping]]></category>

		<guid isPermaLink="false">http://blog.tomtebo.org/programming/the_legality_of_screenscraping.html</guid>
		<description><![CDATA[Niklas Lundblad directs me to a couple of interesting propositions about pending laws regarding computer crime (one of them actually uses the phrase &#8221;crimes in cyberspace&#8221; &#8212; very 1995&#8242;ish retro). Both Ds 2005:5 and Ds 2005:6 are intended to be &#8230; <a href="http://blog.tomtebo.org/2005/03/29/the_legality_of_screenscraping/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Niklas Lundblad <a href="http://kommentar.typepad.com/k/2005/03/lngfredagslsnin.html">directs<br />
me</a> to a couple of interesting propositions about pending laws<br />
regarding computer crime (one of them actually uses the phrase &#8221;crimes<br />
in cyberspace&#8221; &#8212; very 1995&#8242;ish retro). Both <a href="http://www.regeringen.se/sb/d/108/a/40254">Ds 2005:5</a> and <a href="http://www.regeringen.se/sb/d/108/a/39950">Ds 2005:6</a> are<br />
intended to be the first steps in implementing recent EC legislation<br />
(particularly &#8221;<a href="http://conventions.coe.int/Treaty/en/Treaties/Html/185.htm">Convention<br />
on Cybercrime ETS no.:185</a>&#8221;) in swedish law.</p>
<p>Unfortunately, both documents are very thin when it comes to<br />
defining what should be regarded as &#8221;illegal access to information<br />
systems&#8221;. Swedish law has not been well defined in this area<br />
before, and I was hoping that maybe the lawmakers would take the<br />
opportunity to clarify this.</p>
<p>The issue I&#8217;m mostly concerned with is <a href="http://en.wikipedia.org/wiki/Screen_scraping">screen<br />
scraping</a>. I like screen scraping. I think screen scraping is<br />
cool. I wrote my first screen scraping program the same week I got my<br />
first job, almost ten years ago (it was a simple script to<br />
automatically download the latest <a href="http://www.dilbert.com/">Dilbert</a> cartoon and email it as an<br />
attachment to myself).</p>
<p>Now, it&#8217;s easy to see why a content provider would be opposed to<br />
screen scraping. When I got my Dilbert strip in my inbox, there was no<br />
advertising attached to it, thus I was depriving Unitedmedia of ad<br />
revenue.</p>
<p>Years later, I was involved in the <a href="http://membled.com/work/apps/xmltv/">XMLTV</a> project as I was<br />
playing around with a homebrew HTPC. For Swedish TV listings, there<br />
was a <a href="http://cvs.sourceforge.net/viewcvs.py/xmltv/xmltv/grab/sn/Attic/tv_grab_sn?view=markup">simple program</a> that would fetch TV listings from <a href="http://www.dagenstv.com/se/frontpage/">dagenstv.com</a> and<br />
re-format them into the XMLTV format. One day, their service started<br />
to serve up a very hostile-worded text file when I ran this<br />
program. Basically, dagenstv.com had changed their web server<br />
configuration so that requests from a certain <a href="http://en.wikipedia.org/wiki/User-agent">User-agent</a> (our<br />
screen scraper program), would get a stern warning that we were doing<br />
illegal things and that our IP adress had been logged, or something<br />
like that.</p>
<p>Now, were we doing something illegal? Keep in mind that each user<br />
would run this program on his or hers individual computer; we never<br />
redistributed the content. Wheter or not we could have done that<br />
legally in Sweden is another question, one that maybe could be<br />
answered by pondering <a href="http://lagen.nu/1960:729#P49">URL 49<br />
§</a> and related materials. It&#8217;s an interesting question in it&#8217;s own<br />
right, just not the subject of today&#8217;s blog post.
</p>
<p>Was the mere act of accessing the site with a different tool than<br />
the site owner intended, thus gaining access to digital data in a<br />
non-approved way, illegal? For me as a programmer, this feels like an<br />
absurd question. I&#8217;m only sending humble <a href="http://en.wikipedia.org/wiki/Http#HTTP_request_methods">GET<br />
requests</a>, if the site owner doesn&#8217;t want me to have the<br />
information, then don&#8217;t send it! But with my legal student-glasses on,<br />
this could be considered as computer infringement, as per the wording<br />
in <a href="http://lagen.nu/1962:700#K4P9c">BrB 4:9 c</a>: <i>&#8221;Den som<br />
[...]  olovligen bereder sig tillgång till upptagning för automatisk<br />
databehandling [...]döms för dataintrång till böter eller fängelse i<br />
högst två år.&#8221;</i>. (A rough translation would be <i>&#8221;Someone who gets<br />
hold of a recording for automatic computer handling without permission<br />
is to be sentenced for computer infringement to fine or prison for no<br />
more than two years&#8221;</i>).</p>
<p>Dagenstv.com could be said to have given users with normal web<br />
browsers implicit permission to access the data, but probably not to<br />
us with our screen scraper. If we had asked the site owners, they<br />
would very likely had said &#8221;no&#8221;, and therefore, they could well argue<br />
that we were getting hold of a &#8221;recording&#8221; witout permission.</p>
<p>(As an aside: the use of &#8221;recording&#8221; (&#8221;upptagning&#8221; in swedish) in<br />
the quoted law text is interesting in it&#8217;s own right &#8212; the<br />
legislation was originally written with telephone wiretapping, opening<br />
of letters, and similar things in mind, then &#8221;adapted&#8221; (used in the<br />
loosest of senses) into the digital age.)</p>
<p>I would prefer that questions like these were solved by technical,<br />
not legal, means. Dagenstv.com used one such mean (the User-agent<br />
discrimination) to block our screen scraper. We could have changed our<br />
program to masquerade as a normal Internet Explorer browser, but that<br />
would only escalate into a pointless arms race. Someone wrote a<br />
different script that fetched the data from another site instead, and<br />
that was the end of it. Furthermore, if we had bypassed dagenstv.com&#8217;s<br />
User-agent check, we would have essentially said &#8221;Even though we&#8217;ve<br />
been told in no uncertain terms that what we&#8217;re doing is not permitted<br />
by the site owners, we&#8217;re choosing to ignore that and circumvent the<br />
access control&#8221; &#8212; if we had done that, dagenstv.com would really be<br />
right in saying we were getting hold of data without permission.</p>
<p>But there&#8217;s a lot to be said for screen scraping. <a href="http://lagen.nu/">lagen.nu</a> could not exist without screen<br />
scraping. A lot of really cool web services over the years have been<br />
made possible by screen scraping. It has enabled <a href="http://www.infoworld.com/article/02/06/07/020610feappdevtci_1.html">loose<br />
coupling</a> years before anyone had talked about web services. It&#8217;s<br />
the basis for a lot of interesting research and data mining. And<br />
sometimes it just enables <a href="http://www.viksoe.dk/code/gmail.htm">plain</a> <a href="http://richard.jones.name/google-hacks/gmail-filesystem/gmail-filesystem.html">cool</a> stuff.
</p>
<p>Furthermore, it would be wrong to assume that all content providers<br />
are opposed to screen scraping. For example, what is the one thing<br />
that distinguishes forward-thinking web companies? They provide API&#8217;s<br />
to their services (<a href="http://www.amazon.com/gp/browse.html/104-5307331-1497510?%5Fencoding=UTF8&#038;node=3435361">Amazon</a>,</p>
<p><a href="http://www.livejournal.com/doc/server/ljp.csp.xml-rpc.protocol.html">Livejournal</a>,<br />
<a href="http://developer.yahoo.net/">Yahoo</a>, <a href="http://www.google.com/apis/">Google</a>, <a href="http://www.flickr.com/services/api/">Flickr</a>), enabling<br />
anyone to build cool applications on top of their data, just like we<br />
wanted to build a cool HTPC application using data from<br />
dagenstv.com. By providing API&#8217;s, smart web sites remove the need for<br />
actual screen scraping (which, in all fairness, is a messy and seldom<br />
very interesting technological challenge, and furthermore only a means<br />
to an end), but enable and encourage the same kinds of applications.<br />
These API&#8217;s (and the XML-RPC/SOAP-based underpinnings) did not emerge<br />
from a vacuum. People have been screen-scraping Amazon.com for their<br />
own little needs since it was launched. Smart service providers<br />
realise that it&#8217;s better to work with all this creativity than against<br />
it.</p>
<p>If web site providers choose to do what dagenstv.com did, then<br />
fine. They&#8217;ve stated their intent, it&#8217;s their service, their rules,<br />
they&#8217;re entitled to take their ball and go home. But before a site<br />
owner puts such a block in place (which could also be done through a<br />
<a href="http://www.robotstxt.org/">robots.txt</a> file), screen<br />
scraping should in no way be considered unlawful computer<br />
infringement.</p>
<p>It turns out that the <a href="http://conventions.coe.int/Treaty/en/Treaties/Html/185.htm">EC<br />
convention</a> that this new legislation is to implement provides for<br />
these kinds of distinctions, under article 2 (my emphasis):</p>
<blockquote>
<p><b>Article 2 &#8211; Illegal access</b></p>
<p>
Each Party shall adopt such legislative and other measures as may be<br />
necessary to establish as criminal offences under its domestic law,<br />
when committed intentionally, the access to the whole or any part of a<br />
computer system without right. <i>A Party may require that the offence be<br />
committed by infringing security measures</i>, with the intent of<br />
obtaining computer data or other dishonest intent, or in relation to a<br />
computer system that is connected to another computer system.
</p>
</blockquote>
<p>Knowingly circumventing a access control system by, for example,<br />
changing the User-agent string, might be considered infringing<br />
security measures (weak as they are), but an unassuming GET request<br />
could, with this definition, never be considered illegal access. I<br />
hope that Sweden takes this opportunity to better define what should<br />
be considered illegal access.</p>
<p>Another aside: Since lot of my current activities, and thus my blog<br />
writing, revolve around swedish law, it&#8217;s sometimes difficult to write<br />
in English, as there are a lot of precise Swedish legal terms that I&#8217;m<br />
not comfortable translating. For anyone versed in Swedish law, posts<br />
about it in English is probably way harder to read. Furthermore, most<br />
of these posts are probably of limited interest to non-swedes.</p>
<p>Therefore, I&#8217;m considering switching the language of this blog to<br />
Swedish. If you don&#8217;t understand Swedish, but would like to continue<br />
reading this blog, please say so in the comments. Thank you.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2005/03/29/the_legality_of_screenscraping/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Part 3: Understanding what was fetched</title>
		<link>http://blog.tomtebo.org/2004/12/15/lagennu_tech_3/</link>
		<comments>http://blog.tomtebo.org/2004/12/15/lagennu_tech_3/#comments</comments>
		<pubDate>Wed, 15 Dec 2004 17:16:00 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[lagen.nu]]></category>
		<category><![CDATA[programmering]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[webscraping]]></category>

		<guid isPermaLink="false">http://newblog.tomtebo.org/programming/part_3__understanding_what_was_fetched.html</guid>
		<description><![CDATA[(Earlier posts in this series: here and here) There are a lot of ways to extract data from a HTML file. You can do simple string searching (by the way, why is the python documentation for basic string objects hidden &#8230; <a href="http://blog.tomtebo.org/2004/12/15/lagennu_tech_3/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>(Earlier posts in this series: <a href="http://blog.tomtebo.org/programming/lagen.nu_tech_1.html">here</a><br />
  and <a href="http://blog.tomtebo.org/programming/lagen.nu_tech_2.html">here</a>)</p>
<p>
    There are a lot of ways to extract data from a HTML file. You can<br />
    do simple <a href="http://www.python.org/dev/doc/devel/lib/string-methods.html">string<br />
    searching</a> (by the way, why is the python documentation for<br />
    basic string objects hidden under the non-descript heading<br />
    &#8221;Sequence types&#8221;, and why is there no reference to that part of<br />
    the documentation from the <a href="http://www.python.org/dev/doc/devel/lib/module-string.html">separate<br />
    string module</a>, which hardly does anything?) and <a href="http://www.python.org/dev/doc/devel/lib/module-re.html">rexep<br />
    munging</a>, or you can use <a href="http://www.python.org/dev/doc/devel/lib/module-htmllib.html">more<br />
    sophisticated</a> <a href="http://www.python.org/dev/doc/devel/lib/module-HTMLParser.html">HTML<br />
    parsers</a>. Funnily enough, there are two of these in the Python<br />
    standard library, and both of them are callback based &#8212; why no<br />
    tree-based interface? If the HTML code is modern and well-formed,<br />
    you can even use a <a href="http://www.python.org/dev/doc/devel/lib/module-xml.parsers.expat.html">vast</a><br />
    <a href="http://www.python.org/dev/doc/devel/lib/module-xml.dom.minidom.html">array</a><br />
    <a href="http://www.python.org/dev/doc/devel/lib/module-xml.sax.html">of</a><br />
    <a href="http://xmlsoft.org/python.html">XML</a> <a href="http://effbot.org/zone/element-index.htm">tools</a> (and if<br />
    it&#8217;s not, you can fix it with <a href="http://tidy.sourceforge.net/">HTML Tidy)</a>.
  </p>
<p>
    I ended up using the <a href="http://diveintopython.org/html_processing/index.html">BaseHTMLProcessor</a><br />
    approach from <a href="http://diveintopython.org/index.html">Dive<br />
    Into Python.</a>, which has a <a href="http://diveintopython.org/html_processing/index.html">whole<br />
    chapter</a> devoted to the art of HTML parsing. Basically, you<br />
    subclass BaseHTMLProcessor, implementing callbacks for various<br />
    tags, which are called as these tags are encountered in the<br />
    document. Your class is responsible for keeping track of whatever<br />
    state (ie what depth you are in the document, what tags were<br />
    encountered before this one, and so on) that needs to be kept.
  </p>
<p>
    There are some things that are cumbersome with this approach. For<br />
    example, automatic HTML entity resolving would be good. The HTML<br />
    fragment<br />
    &#8221;<tt>&lt;h1&gt;r&amp;auml;ksm&amp;ouml;rg&amp;aring;s&lt;/h1gt;</tt>&#8221;<br />
    represents a single header with the string &#8221;r&auml;ksm&ouml;rg&aring;s&#8221; (a common<br />
    <a href="http://susning.nu/R%e4ksm%f6rg%e5s#2">test phrase</a> for<br />
    swedish programmers), and so it should only result in three<br />
    callbacks: <tt>start_h1</tt>, <tt>handle_data</tt> (which should<br />
    be called with the string &#8221;<tt>r&auml;ksm&ouml;rg&aring;s</tt>&#8221;), and <tt>end_h1</tt>.
    </p>
<p>Instead, the following callbacks are called:</p>
<ul>
<li><tt>start_h1</tt></li>
<li><tt>handle_data</tt> (called with the string &#8216;<tt>R</tt>&#8216;)</li>
<li><tt>handle_entityref</tt> (called with the string &#8216;<tt>auml</tt>&#8216;)</li>
<li><tt>handle_data</tt> (called with the string &#8216;<tt>ksm</tt>&#8216;)</li>
<li><tt>handle_entityref</tt> (called with the string &#8216;<tt>ouml</tt>&#8216;)</li>
</ul>
<p>
    &#8230;you get the idea. There exists <a href="http://www.python.org/dev/doc/devel/lib/module-htmlentitydefs.html">a<br />
    mapping</a> that helps with the entity resolving, but for the HTML<br />
    case, this could have been solved at a lower-level stage.
  </p>
<p>
    Still, for the parsing problems I have, the<br />
    callback-based/keep-your-own-goddam-state-approach works. Most of<br />
    the time I&#8217;m just concerned with finding the <a href="http://62.95.69.15/cgi-bin/thw?%24%7BOOHTML%7D=sfsr_dok&amp;%24%7BHTML%7D=sfst_lst&amp;%24%7BSNHTML%7D=sfsr_err&amp;%24%7BBASE%7D=SFSR&amp;BET=1960%3A729&amp;%24%7BTRIPSHOW%7D%22=format%3DTHW">elements<br />
    in a table</a>, meaning I have to keep track of what cells I&#8217;ve<br />
    seen and when a new table row starts, things like that. As I go<br />
    along, build up a list of mappings or something similar, and then<br />
    just use that list once done. The calling code gets quite nice and<br />
    simple:
  </p>
<pre>
cl = SFSChangelogExtractor()
cl.feed(open("downloaded/lawinfo/%s.html" % self.basefile).read())
for c in cl.changelog:
    if c.item('SFS-nummer') == current_transitional_id: ...
  </pre>
<p>
    (Note that the &#8216;c&#8217; object here is not a standard dictionary, but a<br />
    mapping-ish object that also keeps track of the order keys have<br />
    been inserted. That&#8217;s why it&#8217;s <tt>c.item('SFS-nummer')</tt> and<br />
    not <tt>c['SFS-nummer']</tt>. That, and the fact that I was too<br />
    lazy to implement the <a href="http://diveintopython.org/object_oriented_framework/special_class_methods.html">special<br />
    methods</a> needed to do a proper <a href="http://c2.com/cgi/wiki?DuckTyping">Duck Typed</a><br />
    dictionary.)
  </p>
<p>
    The one exception is the problem of finding all the plaintext in a<br />
    law text like <a href="http://62.95.69.15/cgi-bin/thw?%24%7BHTML%7D=sfst_lst&amp;%24%7BOOHTML%7D=sfst_dok&amp;%24%7BSNHTML%7D=sfst_err&amp;%24%7BBASE%7D=SFST&amp;%24%7BTRIPSHOW%7D=format%3DTHW&amp;BET=1960:729%24">this<br />
    one</a>, but it&#8217;s even easier: Just increment a counter whenever a<br />
    <tt>&lt;pre&gt;</tt> tag is encountered, decrement it when seing<br />
    <tt>&lt;/pre&gt;</tt>. In handle_entityref and handle_text, just<br />
    check if the counter is > 0 and if so, append the text to a <a href="http://www.python.org/dev/doc/devel/lib/module-StringIO.html">StringIO</a><br />
    object.
  </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2004/12/15/lagennu_tech_3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Part 2: Fetching stuff from the web</title>
		<link>http://blog.tomtebo.org/2004/12/14/lagennu_tech_2/</link>
		<comments>http://blog.tomtebo.org/2004/12/14/lagennu_tech_2/#comments</comments>
		<pubDate>Tue, 14 Dec 2004 17:55:00 +0000</pubDate>
		<dc:creator>staffan</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[COM automation]]></category>
		<category><![CDATA[lagen.nu]]></category>
		<category><![CDATA[rättsinformation]]></category>
		<category><![CDATA[webscraping]]></category>

		<guid isPermaLink="false">http://newblog.tomtebo.org/programming/part_2__fetching_stuff_from_the_web.html</guid>
		<description><![CDATA[(A continuation of the series started in this post) Now, the first thing that needs to be done is to actually get the text of the laws from the web. Before that can be done, a list of available laws &#8230; <a href="http://blog.tomtebo.org/2004/12/14/lagennu_tech_2/">Läs mer <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>(A continuation of the series started in <a href="/programming/lagen.nu_tech_1.html">this post</a>)</p>
<p>
    Now, the first thing that needs to be done is to actually get<br />
    the text of the laws from the web. Before that can be done, a<br />
    list of available laws must be fetched. In Swedish law, most<br />
    laws have nice ID&#8217;s known as &#8221;SFS-nummer&#8221;, usually on the form<br />
    &#8221;yyyy:nnn&#8221;, where yyyy is the year it was issued, and nnn is<br />
    incremented for each law passed that year. Some of the older<br />
    laws don&#8217;t strictly follow this convention, and can have ID&#8217;s<br />
    like &#8221;1736:0123 2&#8243; or &#8221;1844:50 s.2&#8243;.
  </p>
<p>
    To get a list of all laws passed between two years, one can use <a href="http://62.95.69.15/sfs/sfsr_form13.html">this form</a> from<br />
    <a href="http://62.95.69.15/">Regeringskansliets<br />
    R&auml;ttsdatabaser</a>. It uses the normal GET method, and so it&#8217;s<br />
    quite easy to construct a URL that will return all laws between,<br />
    say, 1600 and 1850 (linebreaks inserted for readability):
  </p>
<p><pre>http://62.95.69.15/cgi-bin/thw?${HTML}=sfsr_lst&amp;
${OOHTML}=sfsr_dok&amp;${SNHTML}=sfsr_err&amp;${MAXPAGE}=26&amp;
${BASE}=SFSR&amp;${FORD}=FIND&amp;&Aring;R=FR&Aring;N+<b>1600</b>&amp;
&Aring;R=TILL+<b>1850</b></pre>
</p>
<p>
    To fetch this, I used urllib2. Now for a little aside rant: Why<br />
    are there two urllibs in the standard distribution? I understand<br />
    that basic urllib has a simple interface and urllib2 a more<br />
    complex, but would it be so hard to design a single module<br />
    that lets you do simple things easy, and progress onto hard<br />
    things? In the Perl world, you can start with LWP::Simple and<br />
    then go on to more advanced stuff, but with python it&#8217;s either<br />
    simple urllib requests with practially no control at all, or<br />
    urllib2 with it&#8217;s way-too-complex system of chained handlers. I<br />
    will return to this rant in a little bit, but for now let&#8217;s have<br />
    some useful content. This is the code used to fetch stuff:
  </p>
<pre>
url = "http://62.95.69.15/...&Aring;R=FR&Aring;N+%s&amp;&Aring;R=TILL+%s" % (1600,1850)
sock = urllib.urlopen(url)
html = sock.read()
  </pre>
<p>
    So, as long as your needs are simple, like just wanting to do a<br />
    simple GET or POST, urllib and/or urllib2 will work. However, I<br />
    encountered a more complex scenario when I wanted to download<br />
    court verdicts from <a href="http://www.rattsinfosok.dom.se/">Domstolsv&auml;sendets<br />
    r&auml;ttsinformation</a>: This is a web app that relies on HTTP<br />
    posts, HTTP redirects, session tracking cookies, frames,<br />
    javascript links and is, in general, incredibly fragile. The<br />
    slightest &#8221;error&#8221; in what you send and the server answers with a<br />
    &#8221;<tt>500 Server Error: java.lang.NullPointerException</tt>&#8221;
  </p>
<p>
    The first problem was that the application requires cookie<br />
    support, which urllib2 doesn&#8217;t have (as it doesn&#8217;t have any<br />
    concept of state between requests). At first I thought I could fix<br />
    the cookie support by reading and setting headers, the way it was<br />
    done back in the day when men were men and knew the <a href="http://wp.netscape.com/newsref/std/cookie_spec.html">cookie<br />
    spec</a> by heart. Turns out the web service sets a cookie when<br />
    you issue a search request, but the answer from the search request<br />
    is a HTTP redirect. To get the resulting list of matches, you need<br />
    to present that same cookie that was set.
  </p>
<p>
    Now, let&#8217;s continue the rant: urllib2 blindly follows the<br />
    redirect, giving us no chance to set the Cookie header. From the<br />
    documentation, it appears that it should be possible to override<br />
    this behaviour by subclassing HTTPRedirectHandler and passing<br />
    the instance to build_opener, which creates a chain of instances<br />
    of BaseHandler or a subclassed class. Reading the documentation<br />
    for urllib2 makes me think that someones OO/design patterns<br />
    fetish was not kept properly in check. Anyway, I could not get<br />
    that to work.
  </p>
<p>
    Another thing that bugs me about urllib2 is that is has no<br />
    support for implementing <a href="http://www.robotstxt.org/">Robots Exclusion Standard</a><br />
    (RES) support. Right now, neither Regeringskansliets databaser<br />
    or Domstolsv&auml;sendets r&auml;ttsinformation has a<br />
    <tt>/robots.txt</tt>, but if they put one in tomorrow I think I<br />
    should respect it.
  </p>
<p>
    I did briefly use <a href="http://wwwsearch.sourceforge.net/ClientCookie/doc.html">ClientCookie</a>,<br />
    which is an add-on module for urllib2 that provides automatic<br />
    cookie support, and it did solve my first problem. Although I<br />
    did not try it, it can also be used to provide RES support,<br />
    proper Referer setting, and some other goodies. It seems that<br />
    at least the cookie handling functionality of ClientCookie has<br />
    been folded into urllib2 in Python 2.4, which is a good thing.
  </p>
<p>
    However, some time after I first got some code to work with the<br />
    site, they changed something around and made it even more<br />
    fragile. No matter what I did, I couldn&#8217;t get the site to<br />
    respond with anything other than a &#8221;<tt>500 Server Error</tt>&#8221;,<br />
    even though I checked the client-server communication when using<br />
    IE (with the excellent <a href="http://www.fiddlertool.com/fiddler/">Fiddler</a> utility),<br />
    and replicated the behaviour down to the exact header level.
  </p>
<p>
    So, I remembered that <a href="http://www.torgesta.com/blog/">Erik</a> had told me about<br />
    the virtues of webscraping using <a href="http://msdn.microsoft.com/workshop/browser/webbrowser/browser_control_ovw_entry.asp">IE<br />
    and COM automation</a>. Since I&#8217;m only running the code on<br />
    windows machines, giving up platform independence wasn&#8217;t that<br />
    big a deal, and the rich COM support in both Python and IE made<br />
    it quite easy (after installing <a href="https://sourceforge.net/projects/pywin32/">pywin32</a> for<br />
    COM support). Here&#8217;s the basic code:
  </p>
<pre>
      from win32com.client import Dispatch
      ie = Dispatch("InternetExplorer.Application")
      ie.Visible = 1
      ie.Navigate("http://www.rattsinfosok.dom.se/lagrummet/index.jsp")
      while ie.Busy: sleep(1)
      ie.Document.frames(1).Document.forms(0).all.item("txtAvgDatumFran").value = startdate.strftime("%Y-%m-%d")
      ie.Document.frames(1).Document.forms(0).all.item("txtAvgDatumTill").value = "%s-12-31" % year
      ie.Document.frames(1).Document.forms(0).all.item("slctDomstol").value = "ALLAMYND"
      ie.Document.frames(1).Document.forms(0).all.item("buttonSok").click()
      while ie.Busy: sleep(1)
      html = ie.Document.frames(1).Document.body.outerHTML.encode('iso-8859-1')
  </pre>
<p>
    With such a javascript- and browser behaviour dependent web app<br />
    such as this, you can really save yourself a whole lot of<br />
    trouble if your code can <i>use</i> that web browser instead of<br />
    trying to <i>emulate</i> that web browser. For one thing,<br />
    behaviour implemented in javascript (OnClick-handlers and the<br />
    like) is reproduced correctly without any extra work.
  </p>
<p>
    Well, that&#8217;s all for now about fetching stuff from the web. Next<br />
    installment will center around making sense of what we&#8217;ve just<br />
    fetched, i.e. parsing HTML and stuff.
  </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomtebo.org/2004/12/14/lagennu_tech_2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

