From 89bd6ede437c3d0ca99c8d551670644847fdc53c Mon Sep 17 00:00:00 2001 From: Ismael Carnales Date: Tue, 25 Nov 2008 18:16:04 +0000 Subject: [PATCH] first commit of doc apps --HG-- extra : convert_revision : svn%3Ab85faa78-f9eb-468e-a121-7cced6da292c%40425 --- .../docs/pickle/.doctrees/basics.doctree | Bin 0 -> 18659 bytes .../docs/pickle/.doctrees/environment.pickle | Bin 0 -> 6759 bytes .../docs/pickle/.doctrees/index.doctree | Bin 0 -> 3115 bytes .../pickle/.doctrees/tutorial/index.doctree | Bin 0 -> 2581 bytes .../.doctrees/tutorial/tutorial1.doctree | Bin 0 -> 20879 bytes .../.doctrees/tutorial/tutorial2.doctree | Bin 0 -> 33834 bytes .../.doctrees/tutorial/tutorial3.doctree | Bin 0 -> 30742 bytes sites/scrapy.org/docs/pickle/basics.fpickle | Bin 0 -> 4934 bytes .../scrapy.org/docs/pickle/environment.pickle | Bin 0 -> 6759 bytes sites/scrapy.org/docs/pickle/genindex.fpickle | 1 + .../docs/pickle/globalcontext.pickle | Bin 0 -> 526 bytes sites/scrapy.org/docs/pickle/index.fpickle | Bin 0 -> 1334 bytes sites/scrapy.org/docs/pickle/last_build | 0 sites/scrapy.org/docs/pickle/objects.inv | 3 + sites/scrapy.org/docs/pickle/search.fpickle | 1 + .../scrapy.org/docs/pickle/searchindex.pickle | 2636 +++++++++++++++++ .../docs/pickle/tutorial/index.fpickle | Bin 0 -> 965 bytes .../docs/pickle/tutorial/tutorial1.fpickle | Bin 0 -> 7946 bytes .../docs/pickle/tutorial/tutorial2.fpickle | Bin 0 -> 14028 bytes .../docs/pickle/tutorial/tutorial3.fpickle | Bin 0 -> 23793 bytes sites/scrapy.org/docs/sources/basics.rst | 47 + sites/scrapy.org/docs/sources/conf.py | 187 ++ sites/scrapy.org/docs/sources/index.rst | 13 + .../docs/sources/tutorial/index.rst | 9 + .../docs/sources/tutorial/tutorial1.rst | 74 + .../docs/sources/tutorial/tutorial2.rst | 173 ++ .../docs/sources/tutorial/tutorial3.rst | 173 ++ sites/scrapy.org/scrapyorg/docs/__init__.py | 0 sites/scrapy.org/scrapyorg/docs/models.py | 3 + sites/scrapy.org/scrapyorg/docs/urls.py | 18 + sites/scrapy.org/scrapyorg/docs/views.py | 28 + sites/scrapy.org/scrapyorg/settings.py | 3 + sites/scrapy.org/scrapyorg/urls.py | 3 + sites/scrapy.org/static/style/pygments.css | 61 + sites/scrapy.org/templates/base_doc.html | 42 + sites/scrapy.org/templates/docs/doc.html | 37 + sites/scrapy.org/templates/header.html | 2 +- 37 files changed, 3513 insertions(+), 1 deletion(-) create mode 100644 sites/scrapy.org/docs/pickle/.doctrees/basics.doctree create mode 100644 sites/scrapy.org/docs/pickle/.doctrees/environment.pickle create mode 100644 sites/scrapy.org/docs/pickle/.doctrees/index.doctree create mode 100644 sites/scrapy.org/docs/pickle/.doctrees/tutorial/index.doctree create mode 100644 sites/scrapy.org/docs/pickle/.doctrees/tutorial/tutorial1.doctree create mode 100644 sites/scrapy.org/docs/pickle/.doctrees/tutorial/tutorial2.doctree create mode 100644 sites/scrapy.org/docs/pickle/.doctrees/tutorial/tutorial3.doctree create mode 100644 sites/scrapy.org/docs/pickle/basics.fpickle create mode 100644 sites/scrapy.org/docs/pickle/environment.pickle create mode 100644 sites/scrapy.org/docs/pickle/genindex.fpickle create mode 100644 sites/scrapy.org/docs/pickle/globalcontext.pickle create mode 100644 sites/scrapy.org/docs/pickle/index.fpickle create mode 100644 sites/scrapy.org/docs/pickle/last_build create mode 100644 sites/scrapy.org/docs/pickle/objects.inv create mode 100644 sites/scrapy.org/docs/pickle/search.fpickle create mode 100644 sites/scrapy.org/docs/pickle/searchindex.pickle create mode 100644 sites/scrapy.org/docs/pickle/tutorial/index.fpickle create mode 100644 sites/scrapy.org/docs/pickle/tutorial/tutorial1.fpickle create mode 100644 sites/scrapy.org/docs/pickle/tutorial/tutorial2.fpickle create mode 100644 sites/scrapy.org/docs/pickle/tutorial/tutorial3.fpickle create mode 100644 sites/scrapy.org/docs/sources/basics.rst create mode 100644 sites/scrapy.org/docs/sources/conf.py create mode 100644 sites/scrapy.org/docs/sources/index.rst create mode 100644 sites/scrapy.org/docs/sources/tutorial/index.rst create mode 100644 sites/scrapy.org/docs/sources/tutorial/tutorial1.rst create mode 100644 sites/scrapy.org/docs/sources/tutorial/tutorial2.rst create mode 100644 sites/scrapy.org/docs/sources/tutorial/tutorial3.rst create mode 100644 sites/scrapy.org/scrapyorg/docs/__init__.py create mode 100644 sites/scrapy.org/scrapyorg/docs/models.py create mode 100644 sites/scrapy.org/scrapyorg/docs/urls.py create mode 100644 sites/scrapy.org/scrapyorg/docs/views.py create mode 100644 sites/scrapy.org/static/style/pygments.css create mode 100644 sites/scrapy.org/templates/base_doc.html create mode 100644 sites/scrapy.org/templates/docs/doc.html diff --git a/sites/scrapy.org/docs/pickle/.doctrees/basics.doctree b/sites/scrapy.org/docs/pickle/.doctrees/basics.doctree new file mode 100644 index 0000000000000000000000000000000000000000..09ec0ffc4e7c99c7808f267621770b4aa2a3f9a7 GIT binary patch literal 18659 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 ImK@3d11iL4ZvX%Q literal 0 HcmV?d00001 diff --git a/sites/scrapy.org/docs/pickle/.doctrees/environment.pickle b/sites/scrapy.org/docs/pickle/.doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..910edf0f44187b132341b7d625aebdf8b33ac559 GIT binary patch literal 6759 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 literal 0 HcmV?d00001 diff --git a/sites/scrapy.org/docs/pickle/.doctrees/index.doctree b/sites/scrapy.org/docs/pickle/.doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..cc3fec4777074f77f566102415d897c08c0ef486 GIT binary patch literal 3115 zcmaJ@iGLeM6?Pq4mXyeG(!_0Z(B&vqX)HNT3c-cagR>?o(7xgVVl&zuX$J4^?Aw`@ zC19cDC^h$eL%Hw!zVEx-H-8Ph*B$caVEpr^~I^FDeWaJ9$%}S$$Dm_im=kra7d>;ZKR=7 zRpk1-uW>HJD$K_$(cBHW)@(p$)w)=Rc`r>8y3W-qO+1eKJ5cwzr;_5l106WbQlt7x znMfJ#YQqwPjkU{Q&Z3gO#`z2niV7?ike2k)Zb%Cns-BR6PuJj~E*@@P60@hmBIL^z z9?9@1g`BX>64B!NLlp0wdAz%$bwZ{MPn^CC_$kLrI5XULdSge&LPnz{Or^Jx19nv8 zoTtBz8agXyozp9;%PXrltT-#n%ja74dsOOpEOMC7V&fPgb$+Bnu;PFl9*iBMoG}sP z1ad=0gHui~HI6in7Ag&VhZ!f}gr)AO$S@hv8Qe*TGUtL(o=G^r;P^7(o{>Y|!YiOc zsUXtvN-+(UGR~{u#u1)(jK49bs0tZv(XWwvx%Mm`_45^eAp%o#SY zIl<#FS2Btxpw5g*B;loupUm)K#O){yR&~rM+gC$1PPpdDkfQ_pY&IX>#YaH3$GnZi zD(8`1d=ymuG`1&eyrzqfrqctaH9cM1#U{)a-(1(l$D}Y5$cW?hYcsT`6f&L?(}ME8 zv{&hO@e!%Kb=`f~&TzRY7GVlzd}bJ)7FUQX#gVkf(%vOv(UwLP)p14PnGDb78)^Bp zxJn!o6nnVHTfEf?U(e0)u4j0U#d`KF=ccZMwMy-nVcE zaG+dlO+usSqHL~Lh=?B3($n~&^?7$P1tP*lid|3yo z(l5>Zx)@@4x~Nd)y{-Oo|tr8~nf)oK&faQ}e&h{2;XIlxFUm>QD2qIK4MAUWJzQJ(^;H__|Xm=wY=Nf zvzc-Yr;bXD;m4@)@ObH(<+DD191ii3qzQzioa&OBPpr*Ch1zLf4)Bv@t~}!orIu8x z_$fNs3l!UMdB|kolB-Z3vpwn455P%^B;2m9i&=MzruUf+?Bmf8KieteiZxGtiX#m0 zbC$kQtVmgsj53K>pz-rmLzWYot8&XJBmTk`>@Rw^YZZ%MB$!s0J5=^1x?&IU_+^+) zO@HYeeg*2~b}Qnq(ry{;Oc8!dC?#mH=lUirZu%5dq zeX^`?t;uzEhJmNI%5vkuJ2zjC}hW>pLwawsmt^EM5 zE^BRbbF&qXjZjfOq4<2*rj@#lKZFyz1KFeBABhKH-ujDsF@PV#wDj>ObU)2Yw&Ru@ z|8xtE7Zt(-Zf8VIAsXRMCXkeZx#DC*lTAJZ^T=}N<1b01`)RbK zGALgBie5DGn71A4*PXNnNB4SeG57vvZK{}(9?I~yVnLkIq>P=@cH#2B%kcN&IJq%3 zu0Q0h^pCbd{mC|{KW`6wf1z=O`qW=-pZZ%0wTTC6{CgMw0Tr8C8p!^c;lI*e>p$LI Bi3|V$ literal 0 HcmV?d00001 diff --git a/sites/scrapy.org/docs/pickle/.doctrees/tutorial/index.doctree b/sites/scrapy.org/docs/pickle/.doctrees/tutorial/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f756b9cb046e36f38cd920e00452ddc1c1e6addd GIT binary patch literal 2581 zcmZ`*=bzg|5WQTk*iPdGqGYJ~UbnLKS3IMy8Rdkeix&jCo>fxI*D*jw|a>O<2tB zLdp$}@5l*xWtTkENSV`}sO8k&_3{K`)f$5ZK!~K{W!@9J)>R}D0 zgG_5Wz&9$>0moG>sD(UGnz`M$x&`YP1@9>(Z!y!Y1(>bmY6Hpm~ zm@!ZZgp5K8jB7ny_ph`J4_x>fu2;Ar$BmSgX7eS4O)vrzgq2X?W-$sA<@-ZmS5v5% zH|LZLn??ss6KIw$G?ea^KZ!2WbpOh9OmhILDU*=*8roRg0+W_?9eUgflO+^96l%;` zE!&wTZnovPy$+QyOWityhk1B7Oa>7%hMtb_@JOh%S+G|-c8~J#Xjti}IL5yDrafcWcM9vBIf3ZWgi+BxBRCrR3JL_UoQRCf%8aKpd zu|XUnwur4TUaZBYAiyWr1;IQ;5V}(ZVLD9^oYMt?I3p8uwkS_LbGgWN^BxK8tR4IC z>>SUb^F#y2LS`ABd+^EU(a9%eZI-p`fk}l-dJPtaeWh9zSj`Fc`3f({@j?m%BTJA@ zmJ9GAhxOt*jCCW`#!D7qN+v;+g}g|`;H5cU=8*4lIb7~iy27P&rAy>0SY0me$cPGY zwTIW#_pDpe0mFiyg0uhq;Z(f#zdxLY*Kw%CtQYds3T$2TH~l&0ssrY(&)S^QcbUN| zt65??O2=H|4K0`&wn(9g8*{t~D)h6jgqw5R4KrpTZmY;2tTYH7-U4e6YOrGWtsd@y z4a=7M#i!dmydA26v_*p&yu-sg9X?n+=;T6c9yRU|;enpN%R}G6N|m;R`|cK0WLP#e zqo$r(ip5~t!vLlRhxGx3IdYhxc9NR9*e5^ea%-^TVHYZfTPu^UL9s;D9jy|}ldyIR zi!w4blnU?3ac>>g4XE&4GZFB;1|x#8o z)~4q+oAkPoaN9%$RmwWxE*z#5X*%Vp!_CP~0t$jHm^RersUN7=IjccU#UpVpfnZ>q zzUT$CFcq<+n~`7A`jBG=qvUCGP^I?Z)o{ zd0Kc=nep?Bu&O_je5Y7^fnYjaE>YQwbi^{^@g*3~Y-i`$_%hVW?M}q6&~BM5EfKyt zSos>P@k41?n`kUKdA$Wy>e!SHlRbQcjHqf^+n<*qS=O7gH02N05WWTD%mh;6+b}s8 z^6!W(Q0?-B)08Jt-z5k|p%0|~9*NpjaM)|_!{KGG&Cky_(giD2QViaZ&oybKY2pX4 z?chX~>Gwmi52l^J_y-dB2u5XyAJh3XKHS(VIsRl34()dck9g6hl%f^>U;=+iIxHzE zRA%rq4?l-Zh2mslxGpX~JaOEG_yvh{72PnX4f-#>q!&{~&O^ugs+F~2<8sgK-*>*A z9qAAFZ*u%r%!mz!l(F=d)pz;ta{OLwB{!xC_d_v_e{_@VCpXD{9^PYqp~+1H?N>L@ ce#@Xb@IZsVd-w-TxYE*H;?Era%G!;80Hw9WLI3~& literal 0 HcmV?d00001 diff --git a/sites/scrapy.org/docs/pickle/.doctrees/tutorial/tutorial1.doctree b/sites/scrapy.org/docs/pickle/.doctrees/tutorial/tutorial1.doctree new file mode 100644 index 0000000000000000000000000000000000000000..7b38cc029c3bbf384cd5496bba1619c00e3e94ae GIT binary patch literal 20879 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 K-Fwz7X8#9b4y5P+ literal 0 HcmV?d00001 diff --git a/sites/scrapy.org/docs/pickle/.doctrees/tutorial/tutorial2.doctree b/sites/scrapy.org/docs/pickle/.doctrees/tutorial/tutorial2.doctree new file mode 100644 index 0000000000000000000000000000000000000000..bd065ce4517f52823d26dfe1211977273e745003 GIT binary patch literal 33834 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ıw6308+y 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 literal 0 HcmV?d00001 diff --git a/sites/scrapy.org/docs/pickle/.doctrees/tutorial/tutorial3.doctree b/sites/scrapy.org/docs/pickle/.doctrees/tutorial/tutorial3.doctree new file mode 100644 index 0000000000000000000000000000000000000000..de11abfa856cae935f0e569eeb83270dbcbc3670 GIT binary patch literal 30742 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 literal 0 HcmV?d00001 diff --git a/sites/scrapy.org/docs/pickle/basics.fpickle b/sites/scrapy.org/docs/pickle/basics.fpickle new file mode 100644 index 0000000000000000000000000000000000000000..20132dd6228e3291442864a99a757c113166c770 GIT binary patch literal 4934 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 CuhhB# literal 0 HcmV?d00001 diff --git a/sites/scrapy.org/docs/pickle/environment.pickle b/sites/scrapy.org/docs/pickle/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..910edf0f44187b132341b7d625aebdf8b33ac559 GIT binary patch literal 6759 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 literal 0 HcmV?d00001 diff --git a/sites/scrapy.org/docs/pickle/genindex.fpickle b/sites/scrapy.org/docs/pickle/genindex.fpickle new file mode 100644 index 000000000..346c4dfb0 --- /dev/null +++ b/sites/scrapy.org/docs/pickle/genindex.fpickle @@ -0,0 +1 @@ +€}q(Ugenindexcountsq]qU split_indexq‰Ugenindexentriesq]qUcurrent_page_nameqUgenindexqu. \ No newline at end of file diff --git a/sites/scrapy.org/docs/pickle/globalcontext.pickle b/sites/scrapy.org/docs/pickle/globalcontext.pickle new file mode 100644 index 0000000000000000000000000000000000000000..fa71d534f790e05588e383b8994457d14fa3ed79 GIT binary patch literal 526 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 literal 0 HcmV?d00001 diff --git a/sites/scrapy.org/docs/pickle/tutorial/tutorial2.fpickle b/sites/scrapy.org/docs/pickle/tutorial/tutorial2.fpickle new file mode 100644 index 0000000000000000000000000000000000000000..2d13910947afaab33667643b116a63583cbb9313 GIT binary patch literal 14028 zcmcgz>v9`Mc9z#t){DJl*V%0DNgJ|6vKAZwBxPF^1&6jIn^js%B?@J_xGdEG( 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 y$<4W6kI4_dX2z6$R5L!?wal|JI*kS-mLwt& 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 Slip2|gYK}M{&VkI(*8ddKnr;Q literal 0 HcmV?d00001 diff --git a/sites/scrapy.org/docs/sources/basics.rst b/sites/scrapy.org/docs/sources/basics.rst new file mode 100644 index 000000000..ccaa3dec7 --- /dev/null +++ b/sites/scrapy.org/docs/sources/basics.rst @@ -0,0 +1,47 @@ +====== +Basics +====== + +Scrapy is built up on `Twisted `_ , a python platform for the developing of network applications in an asynchronous (non-blocking) approach. This means that, while running in a single thread, a Scrapy application does not block while waiting data arrival from the network. Instead, it continues to process any task that requires CPU attention. Then, when data arrives, a callback function is called with this data as parameter. This is why this kind of code is also called event-driven or callback-based. For more information about this issue see `Asynchronous Programming with Twisted `_. + +When coding with Scrapy, the elemental scheme loop is: + +1. Feed the application with an initial set of urls. +2. Create a [source:scrapy/trunk/scrapy/http/request.py Request] object for each given url. +3. Attach callback functions to each Request, so you define what to do with data once arrives. +4. Feed the [source:scrapy/trunk/scrapy/core/engine.py Execution Engine] with a list of Requests and data. + +Eventually, the callbacks can return data or more Request objects to the Execution Engine, so the crawling process will continue until no more request left. + +At this point, it may seem that Scrapy can't do anything that cannot be done easily with Twisted. But the magic of Scrapy resides on that it helps the developer to implement this basic scheme under a very simple and straightforward model and, most important, on all the fully integrated helpers that places at developer disposal in order to perform intensive network crawling and quickly deploy a fully functional application. + +These helpers includes + +* Parsers/interpreters for most common languages found in the web (xml/html/csv/javascript). +* Network request and response pre and post process pluggable middleware to comply with specific network tasks, such as HTTP authentication, redirection, compression, network caching, network debug info logging, download retrying, cookie management, etc. +* Scraping results post process pluggable middleware. +* Pluggable extensions such as memory debugging, memory usage control and profiling, cpu profiling, controlling web/webservice and telnet consoles, distributed crawling cluster, scraping statistics and lot more. +* Built-in event signaling. +* Spiders quality test tools. +* Lots of useful utilities for many kinds of data processing. + +In order to implement all these resources, Scrapy heavily exploits the concept of middleware. Middleware is plugin code organized in a pipeline model, that resides in the execution line between the spiders, the engine and the Web. + +So, if you don't want to start from the very begining a serious production crawling/scraping project, Scrapy is for you. + +Getting Scrapy and starting a new project +========================================= + +Scrapy is under heavy development, so you will want to download it from his svn repository:: + + svn co http://svn.scrapy.org/scrapy + +This command will create a folder with the name *scrapy* You can find **scrapy** module under *scrapy/trunk* so in order to import this module, assure you have its absolute path in your PYTHONPATH environment variable. + +In order to start a new project, Scrapy gives you a script tool that helps to generate a basic folder structure for the new project, an initial settings file, and a control script. + +Do:: + + $ scrapy/trunk/scrapy/bin/scrapy-admin.py startproject myproject + +You will see that a new folder, *myproject*, in your actual path, was created. Let's continue in the scrapy tutorial. diff --git a/sites/scrapy.org/docs/sources/conf.py b/sites/scrapy.org/docs/sources/conf.py new file mode 100644 index 000000000..797fda1e2 --- /dev/null +++ b/sites/scrapy.org/docs/sources/conf.py @@ -0,0 +1,187 @@ +# -*- coding: utf-8 -*- +# +# Scrapy documentation build configuration file, created by +# sphinx-quickstart on Mon Nov 24 12:02:52 2008. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# The contents of this file are pickled, so don't put values in the namespace +# that aren't pickleable (module imports are okay, they're removed automatically). +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If your extensions are in another directory, add it here. If the directory +# is relative to the documentation root, use os.path.abspath to make it +# absolute, like shown here. +#sys.path.append(os.path.abspath('.')) + +# General configuration +# --------------------- + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = [] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['../templates/docs'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Scrapy' +copyright = u'2008, Insophia' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '1.0' +# The full version, including alpha/beta/rc tags. +release = '1.0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +language = 'en' + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of documents that shouldn't be included in the build. +#unused_docs = [] + +# List of directories, relative to source directory, that shouldn't be searched +# for source files. +exclude_trees = ['.build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + + +# Options for HTML output +# ----------------------- + +# The style sheet to use for HTML and HTML Help pages. A file of that name +# must exist either in Sphinx' static/ path, or in one of the custom paths +# given in html_static_path. +html_style = 'default.css' + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['.static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_use_modindex = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, the reST sources are included in the HTML build as _sources/. +html_copy_source = False + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = '' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Scrapydoc' + + +# Options for LaTeX output +# ------------------------ + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, document class [howto/manual]). +latex_documents = [ + ('index', 'Scrapy.tex', ur'Scrapy Documentation', + ur'Insophia', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_use_modindex = True diff --git a/sites/scrapy.org/docs/sources/index.rst b/sites/scrapy.org/docs/sources/index.rst new file mode 100644 index 000000000..6b138661b --- /dev/null +++ b/sites/scrapy.org/docs/sources/index.rst @@ -0,0 +1,13 @@ +.. Scrapy documentation master file, created by sphinx-quickstart on Mon Nov 24 12:02:52 2008. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Scrapy's documentation +====================== + +Contents: + +.. toctree:: + + basics + tutorial/index diff --git a/sites/scrapy.org/docs/sources/tutorial/index.rst b/sites/scrapy.org/docs/sources/tutorial/index.rst new file mode 100644 index 000000000..4b7714423 --- /dev/null +++ b/sites/scrapy.org/docs/sources/tutorial/index.rst @@ -0,0 +1,9 @@ +======== +Tutorial +======== + +.. toctree:: + + tutorial1 + tutorial2 + tutorial3 diff --git a/sites/scrapy.org/docs/sources/tutorial/tutorial1.rst b/sites/scrapy.org/docs/sources/tutorial/tutorial1.rst new file mode 100644 index 000000000..93231fe60 --- /dev/null +++ b/sites/scrapy.org/docs/sources/tutorial/tutorial1.rst @@ -0,0 +1,74 @@ +================ +Our first spider +================ + +Lets code our first spider. But before, lets check two important asociated settings in *conf/scrapy_settings.py* file:: + + SPIDER_MODULES = ['myproject.spiders'] + ENABLED_SPIDERS_FILE = '%s/conf/enabled_spiders.list' % myproject.__path__[0] + +The first setting, SPIDER_MODULES, is a list that sets the modules that contains the spiders. The second one, ENABLED_SPIDERS_FILE, sets the location of a text file that contains the list of enabled spiders. When you created the project branch, the admin script set both for you. Hence, you will see that with these values, **Scrapy** will search spiders in the module *myproject.spiders* and will read the enabled spiders list from the path *path to myproject>/myproject/conf/enabled_spiders.list* where ** is the path where the module *myproject* resides on. Of course, you can change this settings as taste. These are just defaults to help you. + +Now, finally, the code to our first spider:: + + from scrapy.spider import BaseSpider + + class MySpider(BaseSpider): + + domain_name = "scrapy.org" + + start_urls = ["http://dev.scrapy.org/wiki/WikiStart", "http://dev.scrapy.org/wiki/Starting"] + + def parse(self, response): + filename = response.url.split("/")[-1] + open(filename, "w").write(response.body.to_unicode()) + + return [] + + CRAWLER = MySpider() + +The first line imports the class [source:scrapy/trunk/scrapy/spider/models.py BaseSpider]. For the purpose of creating a working spider, you must subclass !BaseSpider, and then define the three main, mandatory, attributes: + +* *domain_name* identifies the spider. It must be unique, that is, you can't set the same domain name for different spiders. +* *start_urls* is a list of urls where the spider will begin to crawl from. So, the first pages downloaded will be those listed here. The subsequent urls will be generated successively from data contained in the start urls. +* *parse* is the callback method of the spider. This means that each time a page is retrieved, the downloaded data will be passed to this method. In this simple example, the only action is to save the data. But anything can be done here: parse the data, organize it and store in a db or in the filesystem, process it, get new urls to continue the crawling process, etc. + +*parse()* method must always return a list. We will see why later. + +In the last line, we instantiate our spider class. + +So, save this code in a file named myfirst.py inside *myproject/spiders* folder, and create the file *conf/enabled_spiders.list* with the content:: + + scrapy.org + +to enable our new spider. + +Now, go to myproject base folder and run:: + + ./scrapy-ctl.py crawl + +The **crawl** subcommand runs all the enabled spiders. The output of this command will be something like:: + + 2008/07/27 19:46 -0200 [-] Log opened. + 2008/07/27 19:46 -0200 [scrapy-bot] INFO: Enabled extensions: TelnetConsole, WebConsole + 2008/07/27 19:46 -0200 [scrapy-bot] INFO: Enabled downloader middlewares: + 2008/07/27 19:46 -0200 [scrapy-bot] INFO: Enabled spider middlewares: + 2008/07/27 19:46 -0200 [scrapy-bot] INFO: Enabled item pipelines: + 2008/07/27 19:46 -0200 [scrapy-bot/scrapy.org] INFO: Domain opened + 2008/07/27 19:46 -0200 [scrapy-bot/scrapy.org] DEBUG: Crawled live from + 2008/07/27 19:46 -0200 [scrapy-bot/scrapy.org] DEBUG: Crawled live from + 2008/07/27 19:46 -0200 [scrapy-bot/scrapy.org] INFO: Domain closed (finished) + 2008/07/27 19:46 -0200 [-] Main loop terminated. + +Pay attention to the lines labeled [scrapy-bot/scrapy.org], which corresponds to our spider identified by the domain "scrapy.org". You can see a log line for each url defined in *start_urls*. Because these urls are the starting ones, they have no referrers, and this condition is indicated at the end of the log line, where it says *from *. + +But more interesting, as our *parse* method instructs, two files have been created: WikiStart and Starting, with the content of both urls. + +If you remember the elemental loop scheme of Scrapy described before: + +1. Feed the application with an initial set of urls. +2. Create a Request object for each given url. +3. Attach callback functions to each Request, so you define what to do with data once arrives. +4. Feed the Execution Engine with a list of Requests and data. + +You will see that the sample spider we made here (and all spiders) actually performes step 1 and 3. But behind the scenes, step 2 and 4 are also carried out. Most spiders will explicitly create Requests. And they don't need to call the engine by themselves. In fact, they will never do that. diff --git a/sites/scrapy.org/docs/sources/tutorial/tutorial2.rst b/sites/scrapy.org/docs/sources/tutorial/tutorial2.rst new file mode 100644 index 000000000..970d8ae74 --- /dev/null +++ b/sites/scrapy.org/docs/sources/tutorial/tutorial2.rst @@ -0,0 +1,173 @@ +========= +Selectors +========= + +In the last section we have learned how to make an spider, that is, the piece of code that actually does something with data directly retrieved from the web. But we want more than just save this data in a file. We want to extract and classify meaningful data for us. So, first we have to *parse* the data contained in the page. We could use for example regular expressions. And indeed, Scrapy has support for them. + +But web pages has a particular language structure, a markup language, that can be easily accessed by more suitable means. One way, and the one adopted by Scrapy, is xpath. Lets suppose we have the following html code:: + + + Commodities + + + + + + + + + + + + +
Gold939.12US$/oz
Oil123.44US$/bbl
+ + + +We can access to the title content by the xpath "/html/head/title", which, according to xpath specifications, it is evaluated as "Commodities". "/html/head/title/text()" is evaluated as "Commodities". + +If you want to access all the root td elements, the xpath expression is "//td", and the result is multivaluated: "Gold", "939.12US$/oz", "Oil", "123.44US$/bbl". + +If want to access all the first tags inside its parent tag (in this case, ), the xpath is "//td![1]", and the result is multivalued "Gold", "Oil". + +Also, you can access tags by attributes. For example, "//td[@class='price']" will match "939.12US$/oz" and "123.44US$/bbl". + +The value of the xpath "//body" will be the entire content of the body tag, and so on. For an xpath specifications tutorial see http://www.w3schools.com/xpath/default.asp. I strongly recommend to read that tutorial before continue here. Usually we will not being using such simple xpath expressions. + +In order to manage with xpaths, Scrapy defines a class, [source:scrapy/trunk/scrapy/xpath/selector.py XPathSelector]. To access the different elements of a html code, you instantiate the class XPathSelector with a response object. XPathSelector comes in two flavors: XmlXPathSelector and HtmlXPathSelector. At this point I will introduce you a very useful tool: the scrapy console, *shell* so i can ilustrate the use of selectors. I strongly recommend to install IPython package to experience scrapy shell in the most convenient way. Save the above html code in a file, i.e. *sample.html* and run:: + + $ ./scrapy-ctl.py shell file://sample.html + Scrapy 0.1.0 - Interactive scraping console + + Enabling Scrapy extensions... done + Downloading URL... done + ------------------------------------------------------------------------------ + Available local variables: + xxs: + url: http://www.bloomberg.com/markets/commodities/cfutures.html + spider: + hxs: + item: + response: + Available commands: + get : Fetches an url and updates all variables. + scrapehelp: Prints this help. + ------------------------------------------------------------------------------ + Python 2.5.2 (r252:60911, Apr 21 2008, 11:12:42) + Type "copyright", "credits" or "license" for more information. + + IPython 0.8.1 -- An enhanced Interactive Python. + ? -> Introduction to IPython's features. + %magic -> Information about IPython's 'magic' % functions. + help -> Python's own help system. + object? -> Details about 'object'. ?object also works, ?? prints more. + + In [1]: + +Ipython is an extended python console, and *shell* command adds some useful local variables and methods, sets python path and imports some scrapy libraries. One of the loaded variables is *response* and contains all the data associated with the result of the request action for the given url. If you enter *response.body.to_unicode()* the downloaded data will be printed on screen. + +*xxs* and *hxs* are selectors already instantiated with this response as initialization parameter. *xxs* is a selector with xml 'flavor', and hxs is a selector with html 'flavor'. In the present case, we will use *hxs* You can see selectors as objects that represents nodes in the document structure. So, these instantiated selectors are associated to the root node, or entire document. + +Selectors has three methods: *x* *re* and *extract* + + - *x* returns a list of selectors, each of them representing the nodes getted in the xpath expression given as parameter. + - *re* returns a list of results of a regular expression given as parameter. + - *extract* actually extracts the data contained in the node. Does not receive parameters. + +A list of selectors, a XPathSelectorList object, has the same methods, but they are evaluated on each XPathSelector of the list. + +Examples::: + + In [2]: hxs.x("/html") + Out[1]: [] + + In [2]: hxs.x("//td[@class='price']") + Out[2]: + [, + ] + + In [3]: _.extract() + Out[3]: + [u'939.12US$/oz', + u'123.44US$/bbl'] + + In [4]:hxs.re("\d+.\d+US\$") + Out[4]: [u'939.12US$', u'123.44US$'] + + In [5] hxs.x("//td[2]").re("\d+") + Out[5]: [u'939', u'12', u'123', u'44'] + +This is a trivial example. But pages retrieved from the web won't be so simple. Lets suppose we are interested in financial data, and want to extract gold, oil and soy prices from Bloomberg Commodities Page http://www.bloomberg.com/markets/commodities/cfutures.html + +Lets try::: + + $ ./scrapy-ctl.py shell http://www.bloomberg.com/markets/commodities/cfutures.html + +And inside the scrapy console::: + + In [1]: response.body.to_unicode() + ... + +We will get a big text, and data is not easily targeted there. We need three prices, and can search by try and error, or by aproximation, but it is a tedious job. But someone has developed a very practical tool for doing this: [https://addons.mozilla.org/firefox/addon/1843 Firebug], an add-on for Mozilla Firefox. Install it, then open in your Firefox the Bloomberg url given above. Point the mouse over the Gold row, Price column, click right button and select Inspect Element. This new inspect option has been added by Firebug. A tab will open with the page source code, and highlighted, the code corresponding to the Gold Price: + +[[Image(firebug.png)]] + +(Observe that pointing the mouse over different elements in code tab, the matching rendered region in browser will be highlighted as well.) + +So, you could find the gold price by the xpath expression *span[@class='style5']"* If you type in scrapy console *hxs.x("//span[@class='style5']/text()").extract()* you will get a large list of nodes, because multiple instances of this xpath pattern were found, so you could select that corresponding to gold by the expression *hxs.x("//span[@class='style5']/text()").extract()![73]* + +Always there are several ways to target the same element. We could find the same gold price, for example, with the expression *hxs.x("//span[contains(text(),'GOLD')]/../following-sibling::td![1]/span/text()").extract()* And this is an interesting approach, because we could do::: + + In [2]: def get_commodity_price(text): + ....: return hxs.x("//span[contains(text(),'%s')]/../following-sibling::td[1]/span/text()" % text).extract()[0] + ....: + +and then,:: + + In [3]: get_commodity_price('GOLD') + Out[3]: u'916.500' + + In [4]: get_commodity_price('WTI CRUDE') + Out[4]: u'121.590' + + In [5]: get_commodity_price('SOYBEAN FUTURE') + Out[5]: u'1390.750' + +And so on. + +So, we can add the following spider to our project::: + + from scrapy.spider import BaseSpider + from scrapy.xpath import HtmlXPathSelector + + class MySpider(BaseSpider): + + domain_name = "bloomberg.com" + + start_urls = ["http://www.bloomberg.com/markets/commodities/cfutures.html"] + + def parse(self, response): + + hxs = HtmlXPathSelector(response) + def get_commodity_price(text): + return hxs.x("//span[contains(text(),'%s')]/../following-sibling::td[1]/span/text()" % text).extract()[0] + + print "Gold Futures NY: %sUS$/oz" % get_commodity_price("GOLD") + print "Oil WTI Futures: %sUS$/bbl" % get_commodity_price("WTI CRUDE") + print "Soybean: %sUS$/bu" % get_commodity_price("SOYBEAN FUTURE") + + return [] + + CRAWLER = MySpider() + +Save it as *spiders/bloomberg.py* for example, and enable it adding "bloomberg.com" to *conf/enabled_spiders.list* Actually the name given to the module that contains the spider does not matter. Scrapy will find the correct spider looking for its *domain_name* attribute. + +Do a crawl (*scrapy-ctl.py crawl* and both spiders will be ran. We will get printed in part of the log output something like this::: + + 2008/07/30 12:40 -0200 [HTTPPageGetter,client] Gold Futures NY: 905.400US$/oz + 2008/07/30 12:40 -0200 [HTTPPageGetter,client] Oil WTI Futures: 121.210US$/bbl + 2008/07/30 12:40 -0200 [HTTPPageGetter,client] Soybean: 1390.750US$/bu + +If you want to crawl only one domain among all availables, you just add the domain name to the command line arguments::: + + ./scrapy-ctl.py crawl bloomberg.com diff --git a/sites/scrapy.org/docs/sources/tutorial/tutorial3.rst b/sites/scrapy.org/docs/sources/tutorial/tutorial3.rst new file mode 100644 index 000000000..4ad73d18c --- /dev/null +++ b/sites/scrapy.org/docs/sources/tutorial/tutorial3.rst @@ -0,0 +1,173 @@ +================== +Items and Adaptors +================== + +At this point we have seen how to scrape data from a web page. But the only thing we did was to print it in the screen. Frequently we need to organize, process, or store the data we have retrieved. In order to perform these jobs, Scrapy model includes a data encapsulation class: [source:scrapy/trunk/scrapy/item/models.py ScrapedItem]. + +A [source:scrapy/trunk/scrapy/item/models.py ScrapedItem] contains attributes with given values, just like any python object. And you use the method *attribute* in order to assign to the item an attribute with a given value and name. Of course, you could do something like:: + + index.name = "Gold Future" + index.value = get_commodity_price("GOLD") + +being *index* an instance of a given object class. But *attribute* method is intended to do more than just assign. Very often data from the web contains entities, tags, or comes inside a piece of text, and are always strings. But you may want to remove or not entities and tags depending on attribute name, or extract significative data from a bigger text (i.e. dimensions or prices inside a text), convert data to float, integers, and validate data assigned, or normalize some data features. You could do all this inside the spider code. But in this manner you will repeat lot of code, and even generate data inconsistencies from spider to spider simply because you forget to apply correct data processing according to policies you have pre-established (imagine when working with lots and lots of different spiders and source webpages) + +When you use the *attribute* method, the data passes through an adaptation pipeline before finally be assigned. The purpose of this adaptation pipeline is preciselly to apply all the data processing in a user-defined, simple and scalable way, and without having to implement it inside the spiders code each time you add a new one. + +Lets continue our bloomberg commodities example. Modify our bloomberg.py file as follows::: + + from scrapy.spider import BaseSpider + from scrapy.xpath import HtmlXPathSelector + + from scrapy.item import ScrapedItem as FinancyIndex + + class BloombergSpider(BaseSpider): + + domain_name = "bloomberg.com" + + start_urls = ["http://www.bloomberg.com/markets/commodities/cfutures.html", + "http://www.bloomberg.com/markets/stocks/movers_index_spx.html"] + + def parse(self, response): + + hxs = HtmlXPathSelector(response) + + def get_commodity_price(text): + value = hxs.x("//span[contains(text(),'%s')]/../following-sibling::td[1]/span/text()" % text).extract()[0] + unit = hxs.x("//span[contains(text(),'%s')]/following-sibling::span" % text).re("\((.*)\)")[0] + return value, unit + + def get_index_value(): + return hxs.x("//span[contains(text(),'VALUE')]/../following-sibling::td/text()").extract()[0] + + items = [] + if "cfutures" in response.url: + for i in [("GOLD", "Gold Futures NY"), ("WTI CRUDE", "Oil WTI Futures"), ("SOYBEAN FUTURE", "Soybean")]: + index = FinancyIndex() + index.attribute("name", i[1]) + value, unit = get_commodity_price(i[0]) + index.attribute("value", value) + index.attribute("unit", unit) + items.append(index) + elif "index_spx" in response.url: + index = FinancyIndex() + index.attribute("name", "S&P500") + index.attribute("value", get_index_value()) + index.attribute("unit", "%") + items.append(index) + return items + + CRAWLER = BloombergSpider() + +Note two important differences with our previous version: + +* We have added a second url in our *start_urls* list. This means our spider will visit two webpages. In order to handle this, we have splitted our code in two parts, according to the response url, one that handles commodities page , and other which handles Standard&Poor's index page. We can add any ammount of urls we want to visit in the *start_urls* list. But this is an inefficient approach if we want to scrape lots of pages from a site (it is common to visit hundreds or even thousands of them). Further we will learn crawling techniques with Scrapy in order to generate and follow links in a site, beginning from few starting urls. +* Instead of printing scraped data in the console, we assign it to [source:scrapy/trunk/scrapy/item/models.py ScrapedItem] objects. Each item contains three attributes: name, value and unit (also, we have added code to scrape units). Then, *parse* method returns a list of the scraped items. Remember we said in previous section that *parse* must always return a list. + +If we run the scrapy shell with our commodity url as parameter and run *spider.parse(response)* we will get a list of three items::: + + In [1]: spider.parse(response) + Out[1]: + [, + , + ] + +So parse is doing what we expect: it returns three items, one for each index. If we want to see a more detailed output, *scrapy-ctl* proportionates another useful tool: the *parse* subcommand. Try::: + + $ ./scrapy-ctl.py parse http://www.bloomberg.com/markets/commodities/cfutures.html + 2008/09/02 17:40 -0200 [-] Log opened. + 2008/09/02 17:40 -0200 [scrapy-bot] INFO: Enabled extensions: TelnetConsole, WebConsole + 2008/09/02 17:40 -0200 [scrapy-bot] INFO: Enabled downloader middlewares: + 2008/09/02 17:40 -0200 [scrapy-bot] INFO: Enabled spider middlewares: + 2008/09/02 17:40 -0200 [scrapy-bot] INFO: Enabled item pipelines: + 2008/09/02 17:40 -0200 [scrapy-bot/bloomberg.com] INFO: Domain opened + 2008/09/02 17:40 -0200 [scrapy-bot/bloomberg.com] DEBUG: Crawled live from + 2008/09/02 17:40 -0200 [scrapy-bot/bloomberg.com] INFO: Domain closed (finished) + 2008/09/02 17:40 -0200 [-] Main loop terminated. + # Scraped Items ------------------------------------------------------------ + ScrapedItem({'name': 'Gold Futures NY', 'unit': u'USD/t oz.', 'value': u'812.700'}) + ScrapedItem({'name': 'Oil WTI Futures', 'unit': u'USD/bbl.', 'value': u'110.430'}) + ScrapedItem({'name': 'Soybean', 'unit': u'USd/bu.', 'value': u'1298.500'}) + + # Links -------------------------------------------------------------------- + + $ + +We get a nice printing of our items, displaying all their attributes. Observe that attribute values are raw data, extracted as is from the page. All are strings, and we could be interested in operate with decimal values; units expressions are not homogeneous (see dollar symbols are USD and USd), and we did not give unicode strings as items name. So, lets construct an adaptor pipeline and create our own item class for this purpose::: + + from decimal import Decimal + import re + + from scrapy.item.models import ScrapedItem + from scrapy.item.adaptors import AdaptorPipe + + def extract(value): + if hasattr(value, 'extract'): + value = value.extract() + if isinstance(value, list): + value = value[0] + return value + + def to_decimal(value): + return Decimal(value) + + def to_unicode(value): + return unicode(value) + + _dollars_re = re.compile("[Uu][Ss][Dd]") + def normalize_units(value): + return _dollars_re.sub("U$S", value) + + def clean(value): + return value.strip() + + def clean_number(value): + if value.find(".") > value.find(","): + value = value.replace(",", "") + elif value.find(",") > value.find("."): + value = value.replace(".", "") + value = value.replace(",", ".") + return value + + pipedict = { + 'name': [extract, to_unicode, clean], + 'unit': [extract, to_unicode, clean, normalize_units], + 'value': [extract, to_unicode, clean, clean_number, to_decimal] + } + + class FinancyIndex(ScrapedItem): + + adaptors_pipe = AdaptorPipe(pipedict) + + +Save this as *item.py* and in the bloomberg spider code, replace the line:: + + from scrapy.item import ScrapedItem as FinancyIndex + +by:: + + from financy.item import FinancyIndex + +Also, you can remove the *extract()* and *0]* in our helper functions *get_commodity_price* and *get_index_value*:: + + def get_commodity_price(text): + value = hxs.x("//span[contains(text(),'%s')]/../following-sibling::td[1]/span/text()" % text) + unit = hxs.x("//span[contains(text(),'%s')]/following-sibling::span" % text).re("\((.*)\)") + return value, unit + + def get_index_value(): + return hxs.x("//span[contains(text(),'VALUE')]/../following-sibling::td/text()")v + +The extract adaptor will do that for us. + +Run *parse* command again::: + + # Scraped Items ------------------------------------------------------------ + FinancyIndex({'name': u'Gold Futures NY', 'unit': u'U$S/t oz.', 'value': Decimal("809.600")}) + FinancyIndex({'name': u'Oil WTI Futures', 'unit': u'U$S/bbl.', 'value': Decimal("110.240")}) + FinancyIndex({'name': u'Soybean', 'unit': u'U$S/bu.', 'value': Decimal("1298.500")}) + +Very nice, uh? And this adaptor pipeline will be applied for all spiders you add to your project --which is the purpose of the adaptor pipeline--, provided you use the item *attribute* method to assign them. + +Adaptors run in the specified order. And you must take care that each adaptor receives from the previous one, what expects to receive. In order to enable an adaptors pipeline, you have to instantiate an [source:scrapy/trunk/scrapy/item/adaptors.py AdaptorPipe] class in your item class (in this example, *financy.item.FinancyIndex*) with a dictionary which maps *attribute name* to a pipeline of adaptation functions, and assign it to the class attribute *adaptors_pipe*. + +You can at anytime edit the pipeline by accessing to *pipe* attribute of the !AdaptorPipe instance. For example, you may want to remove or add an adaptor from a spider code for a certain group of attributes. But you must take on account that, because the pipeline is a class attribute, any change will has effect on all. diff --git a/sites/scrapy.org/scrapyorg/docs/__init__.py b/sites/scrapy.org/scrapyorg/docs/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sites/scrapy.org/scrapyorg/docs/models.py b/sites/scrapy.org/scrapyorg/docs/models.py new file mode 100644 index 000000000..71a836239 --- /dev/null +++ b/sites/scrapy.org/scrapyorg/docs/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/sites/scrapy.org/scrapyorg/docs/urls.py b/sites/scrapy.org/scrapyorg/docs/urls.py new file mode 100644 index 000000000..1ae2f4ef9 --- /dev/null +++ b/sites/scrapy.org/scrapyorg/docs/urls.py @@ -0,0 +1,18 @@ +from django.conf import settings +from django.conf.urls.defaults import * + +from scrapyorg.docs.views import index, document + + +urlpatterns = patterns('', + (r'^$', index), + (r'^(?P[\w./-]*)/$', document), +) + +if settings.DEBUG: # devel + urlpatterns += patterns('', + (r'^%s/(?P.*)$' % settings.MEDIA_URL[1:], + 'django.views.static.serve', + {'document_root': settings.MEDIA_ROOT}), + ) + diff --git a/sites/scrapy.org/scrapyorg/docs/views.py b/sites/scrapy.org/scrapyorg/docs/views.py new file mode 100644 index 000000000..ceaf7d6ef --- /dev/null +++ b/sites/scrapy.org/scrapyorg/docs/views.py @@ -0,0 +1,28 @@ +import cPickle as pickle +import os + +from django.conf import settings +from django.http import Http404 +from django.shortcuts import render_to_response +from django.template import RequestContext + + +def index(request): + return document(request, '') + + +def document(request, url): + docroot = settings.DOC_PICKLE_ROOT + + if os.path.exists(os.path.join(docroot, url, 'index.fpickle')): + docpath = os.path.join(docroot, url, 'index.fpickle') + elif os.path.exists(os.path.join(docroot, url + '.fpickle')): + docpath = os.path.join(docroot, url + '.fpickle') + else: + raise Http404("'%s' does not exist" % url) + + docfile = open(docpath, 'rb') + doc = pickle.load(docfile) + + return render_to_response('docs/doc.html', {'doc': doc}, + context_instance=RequestContext(request)) diff --git a/sites/scrapy.org/scrapyorg/settings.py b/sites/scrapy.org/scrapyorg/settings.py index 4723280aa..bd9bd45f1 100644 --- a/sites/scrapy.org/scrapyorg/settings.py +++ b/sites/scrapy.org/scrapyorg/settings.py @@ -79,8 +79,11 @@ INSTALLED_APPS = ( 'django.contrib.markup', 'scrapyorg.article', 'scrapyorg.download', + 'scrapyorg.docs', ) +DOC_PICKLE_ROOT = os.path.join(PROJECT_ROOT, 'docs', 'pickle') + # Override previous settings with values in local_settings.py settings file. try: from local_settings import * diff --git a/sites/scrapy.org/scrapyorg/urls.py b/sites/scrapy.org/scrapyorg/urls.py index c3b90b697..c401bdadb 100644 --- a/sites/scrapy.org/scrapyorg/urls.py +++ b/sites/scrapy.org/scrapyorg/urls.py @@ -10,6 +10,9 @@ urlpatterns = patterns('', # admin url(r"^admin/download/downloadlink/", include("scrapyorg.download.urls")), url(r'^admin/(.*)', admin.site.root), + + # docs + url(r"^docs/", include("scrapyorg.docs.urls")), ) diff --git a/sites/scrapy.org/static/style/pygments.css b/sites/scrapy.org/static/style/pygments.css new file mode 100644 index 000000000..1f2d2b618 --- /dev/null +++ b/sites/scrapy.org/static/style/pygments.css @@ -0,0 +1,61 @@ +.hll { background-color: #ffffcc } +.c { color: #408090; font-style: italic } /* Comment */ +.err { border: 1px solid #FF0000 } /* Error */ +.k { color: #007020; font-weight: bold } /* Keyword */ +.o { color: #666666 } /* Operator */ +.cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.cp { color: #007020 } /* Comment.Preproc */ +.c1 { color: #408090; font-style: italic } /* Comment.Single */ +.cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.gd { color: #A00000 } /* Generic.Deleted */ +.ge { font-style: italic } /* Generic.Emph */ +.gr { color: #FF0000 } /* Generic.Error */ +.gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.gi { color: #00A000 } /* Generic.Inserted */ +.go { color: #303030 } /* Generic.Output */ +.gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.gs { font-weight: bold } /* Generic.Strong */ +.gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.gt { color: #0040D0 } /* Generic.Traceback */ +.kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.kp { color: #007020 } /* Keyword.Pseudo */ +.kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.kt { color: #902000 } /* Keyword.Type */ +.m { color: #208050 } /* Literal.Number */ +.s { color: #4070a0 } /* Literal.String */ +.na { color: #4070a0 } /* Name.Attribute */ +.nb { color: #007020 } /* Name.Builtin */ +.nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.no { color: #60add5 } /* Name.Constant */ +.nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.ne { color: #007020 } /* Name.Exception */ +.nf { color: #06287e } /* Name.Function */ +.nl { color: #002070; font-weight: bold } /* Name.Label */ +.nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.nt { color: #062873; font-weight: bold } /* Name.Tag */ +.nv { color: #bb60d5 } /* Name.Variable */ +.ow { color: #007020; font-weight: bold } /* Operator.Word */ +.w { color: #bbbbbb } /* Text.Whitespace */ +.mf { color: #208050 } /* Literal.Number.Float */ +.mh { color: #208050 } /* Literal.Number.Hex */ +.mi { color: #208050 } /* Literal.Number.Integer */ +.mo { color: #208050 } /* Literal.Number.Oct */ +.sb { color: #4070a0 } /* Literal.String.Backtick */ +.sc { color: #4070a0 } /* Literal.String.Char */ +.sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.s2 { color: #4070a0 } /* Literal.String.Double */ +.se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.sh { color: #4070a0 } /* Literal.String.Heredoc */ +.si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.sx { color: #c65d09 } /* Literal.String.Other */ +.sr { color: #235388 } /* Literal.String.Regex */ +.s1 { color: #4070a0 } /* Literal.String.Single */ +.ss { color: #517918 } /* Literal.String.Symbol */ +.bp { color: #007020 } /* Name.Builtin.Pseudo */ +.vc { color: #bb60d5 } /* Name.Variable.Class */ +.vg { color: #bb60d5 } /* Name.Variable.Global */ +.vi { color: #bb60d5 } /* Name.Variable.Instance */ +.il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/sites/scrapy.org/templates/base_doc.html b/sites/scrapy.org/templates/base_doc.html new file mode 100644 index 000000000..3fd77433e --- /dev/null +++ b/sites/scrapy.org/templates/base_doc.html @@ -0,0 +1,42 @@ +{% extends "base.html" %} + +{% block extrastyles %} + + +{% endblock %} + +{% block content %} +{% include "header.html" %} +
+
+ {% block main-content %}{% endblock %} +
+ +
+ {% block extra-content %}{% endblock %} +
+
+{% endblock %} diff --git a/sites/scrapy.org/templates/docs/doc.html b/sites/scrapy.org/templates/docs/doc.html new file mode 100644 index 000000000..c9cd071b3 --- /dev/null +++ b/sites/scrapy.org/templates/docs/doc.html @@ -0,0 +1,37 @@ +{% extends "base_doc.html" %} + +{% block title %}{{ doc.title|safe }}{% endblock %} + +{% block main-content %} +{{ doc.body|safe }} +{% endblock %} + +{% block extra-content %} + +{% if doc.display_toc %} +

Contents:

+{{ doc.toc|safe }} +{% endif %} + +

Browse

+
+ + +{% if doc.parents %} +{% for p in doc.parents %} +{% endfor %} + + +{% endif %} + +{% endblock %} diff --git a/sites/scrapy.org/templates/header.html b/sites/scrapy.org/templates/header.html index c856bc52b..65b5bb754 100644 --- a/sites/scrapy.org/templates/header.html +++ b/sites/scrapy.org/templates/header.html @@ -4,7 +4,7 @@
  • Home
  • Code
  • Weblog -
  • Documentation +
  • Documentation
  • Download