1.参考:

http://scrapy.org/download/

去cmd中通过pip安装,结果出错:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 `E:Dev_ToolspythonScrapy>p``install``all Scrapy` `Downloading/unpacking Scrapy` `  ``Downloading Scrapy-0.16``tar``tar.gz (675kB): 675kB downloaded` `  ``Running setup.py egg_in``for``for package Scrapy` `    ``warning: no files found matchi``'license.txt'``xt' under directo``'scrapy'``py'` `    ``no previously-included directories found matchi``'docsbuild'``ld'` `Downloading/unpacking Twisted>=8.0 (from Scrapy)` `  ``Downloading Twisted-1``tar``.0.tar.bz2 (2.9MB): 2.9MB downloaded` `  ``Running setup.py egg``for``fo for package Twisted` `Downloading/unpacking w3lib>=1.2 (from Scrapy)` `  ``Downloading w``tar``b-1.2.tar.gz` `  ``Running setup.py ``for``_info for package w3lib` `Downloading/unpacking lxml (from Scrapy)` `  ``Downloading lx``tar``3.0.1.tar.gz (3.2MB): 3.2MB downloaded` `  ``Running setup.py ``for``_info for package lxml` `    ``Building lxml version 3.0.1.` `    ``Building without Cython.` `  ``'xslt-config'``t-config' 不是内部或外部命令,也不是可运行的程序` `    ``或批处理文件。``make`  `** make sure the development packages of libxml2 and libxslt are installed **` `    ``Using build configuration of libxslt` `    ``warning: no files found ``'lxml.etree.c'``.etree.c' under d``'srclxml'``srclxml'` `    ``warning: no files found ``'lxml.objectify.c'``ectify.c' under d``'srclxml'``srclxml'` `    ``warning: no files found ``'lxml.etree.h'``.etree.h' under d``'srclxml'``srclxml'` `    ``warning: no files found ``'lxml.etree_api.h'``ee_api.h' under d``'srclxml'``srclxml'` `    ``warning: no files found ``'etree_defs.h'``e_defs.h' under d``'srclxml'``srclxml'` `    ``warning: no files found ``'*.txt'``g '*.txt' under d``'srclxmltests'``mltests'` `    ``warning: no files found ``'pubkey.asc'``bkey.asc' under d``'doc'``ory 'doc'` `    ``warning: no files found ``'tagpython*.png'``hon*.png' under d``'doc'``ory 'doc'` `    ``warning: no files found ``'Makefile'``Makefile' under d``'doc'``ory 'doc'` `Downloading/unpacking pyOpenSSL (from Scrapy)` `  ``Downloading pyOpen``tar``-0.13.tar.gz (250kB): 250kB downloaded` `  ``Running setup.py ``for``_info for package pyOpenSSL` `    ``error: C``find` `'openssl.exe'``nssl.exe'` `    ``Complete out``command``m command python setup.py egg_info:` `    ``running egg_info` `creating pip-egg-infopyOpenSSL.egg-info` `writing pip-egg-infopyOpenSSL.egg-infoPKG-INFO` `top``iting top-level names to pip-egg-infopyOpenSSL.egg-infotop_level.txt` `writing dependency_links to pip-egg-infopyOpenSSL.egg-infodependency_links.txt` `writing ``file``f``'pip-egg-infopyOpenSSL.egg-infoSOURCES.txt'``RCES.txt'` `warning: manifest_maker: ``file``d``'-c'``file '-c' not found` `error: C``find` `'openssl.exe'``nssl.exe'` `----------------------------------------` `Command python setup.py egg_info failed with erro``in``code``users``c:usersadmini~1``local``atalocaltemppip-buildpyOpenSSL` `Storing comp``in``te log in C:UsersAdministratorpippip.log`

2。【已解决】安装Scrapy过程中出错:ERROR: ‘xslt-config’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

3.【已解决】安装Scrapy过程中出错:error: Could not find ‘openssl.exe’

4. 解决了openssl的问题,结果又出现

error: Unable to find vcvarsall.bat

的问题:

【已解决】安装Scrapy过程中出错:error: Unable to find vcvarsall.bat

5.最后终于安装成功:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 `E:Dev_ToolspythonScrapy>p``install``all Scrapy` `Requirement already satisfied (use --upgrade to upgrade): Scra``in` `in e:dev_install_rootpython27libsite-packages` `Requirement already satisfied (use --upgrade to upgrade): Twisted>``in``8.0 in e:dev_install_rootpython27libsite-packages` ` ``(from Scrapy)` `Downloading/unpacking w3lib>=1.2 (from Scrapy)` `  ``Running setup.py ``for``_info for package w3lib` `Requirement already satisfied (use --upgrade to upgrad``in``: lxml in e:dev_install_rootpython27libsite-packages (from S` `crapy)` `Requirement already satisfied (use --upgrade to upgrade): p``in``penSSL in e:dev_install_rootpython27libsite-packages (f` `rom Scrapy)` `Downloading/unpacking zope.interface (from Twisted>=8.0->Scrapy)` `  ``Running set``for``py egg_info for package zope.interface` `Requirement already satisfied (use --upgrade to upgrad``in``: distribute in e:dev_install_rootpython27libsite-packagesd` `istribute-0.6.28-py2.7.egg (from zope.interface->Twisted>=8.0->Scrapy)` `Installing collected packages: w3lib, zope.inter``install``R``for``ing setup.py install for w3``install``R``for``ing setup.py install for zope.``'zope.interface._zope_interface_coptimizations'``nterface_coptimizations' extension` `    ``********************************************************************************` `    ``WARNING:` `            ``An optional code optimization (C extension) could not be compiled.` `  ``for`       `Optimizations for this package will not be availabl``find`   `()` `    ``Unable to find vcvarsall.bat` `    ``********************************************************************************` `    ``Skipping installation of E:dev_install_rootPython27Libsite-packageszope__init__.py (namespace package)` `    ``Installing E:dev_install_rootPython27Libsite-packageszope.interface-4.0.1-py2.7-nspkg.pth` `Successfully installed w3lib zope.interface` `Cleaning up...`

6.然后再去参考:

Steps to install Scrapy

去测试安装是否成功:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 `Python ``2.7``.``2` `(default, Jun ``12` `2011``, ``14``:``24``:``46``) [MSC v.``1500` `64` `bit (AMD64)] on win32` `Type` `"copyright"``, ``"credits"` `or` `"license()"` `for` `more information.` `>>> ``import` `zope.interface` `>>> ``import` `twisted` `>>> ``import` `lxml` `>>> ``import` `OpenSSL` `Traceback (most recent call last):` `  ``File` `"<pyshell#3>"``, line ``1``, ``in` `<module>` `    ``import` `OpenSSL` `  ``File` `"E:dev_install_rootPython27libsite-packagesOpenSSL__init__.py"``, line ``13``, ``in` `<module>` `    ``from` `OpenSSL ``import` `crypto` `ImportError: DLL load failed: ``%``1` `不是有效的 Win32 应用程序。` `>>> ``import` `openssl` `Traceback (most recent call last):` `  ``File` `"<pyshell#4>"``, line ``1``, ``in` `<module>` `    ``import` `openssl` `ImportError: No module named openssl` `>>> ``import` `scrapy` `>>> ``print` `twisted.version` `[twisted, version ``10.2``.``0``]` `>>> ``print` `zope.version` `Traceback (most recent call last):` `  ``File` `"<pyshell#7>"``, line ``1``, ``in` `<module>` `    ``print` `zope.version` `AttributeError: ``'module'` `object` `has no attribute ``'version'` `>>> ``print` `lxml.version` `Traceback (most recent call last):` `  ``File` `"<pyshell#8>"``, line ``1``, ``in` `<module>` `    ``print` `lxml.version` `AttributeError: ``'module'` `object` `has no attribute ``'version'` `>>> ``print` `OpenSSL.version` `Traceback (most recent call last):` `  ``File` `"<pyshell#9>"``, line ``1``, ``in` `<module>` `    ``print` `OpenSSL.version` `NameError: name ``'OpenSSL'` `is` `not` `defined` `>>> ``print` `scrapy.version` `Traceback (most recent call last):` `  ``File` `"<pyshell#10>"``, line ``1``, ``in` `<module>` `    ``print` `scrapy.version` `AttributeError: ``'module'` `object` `has no attribute ``'version'` `>>>`

很明显,此处貌似OpenSSL好像没哟安装成功啊。

但是,前面的显示是:

Requirement already satisfied (use –upgrade to upgrade): pyOpenSSL in e:dev_install_rootpython27libsite-packages (from Scrapy)

说明是安装成功的才对啊。

先不管了,等以后遇到问题再说。

7.不过,后来参考了官网的安装教程:

http://doc.scrapy.org/en/latest/intro/install.html#intro-install

->

http://doc.scrapy.org/en/latest/intro/install.html#intro-install-platform-notes

Win32 OpenSSL page

下载

Visual C++ 2008 Redistributables (x64)

得到vcredist_x64.exe并安装。

再下载Win64 OpenSSL v1.0.0j得到Win64OpenSSL-1_0_0j.exe并安装。

期间竟然提示找不到VC++ 2008:

not found vc   2008

不过不管,继续安装至完毕。

然后把

E:dev_install_rootOpenSSL-Win64bin

添加到环境变量PATH中。

【总结】

想要安装Scrapy,但是其依赖一堆的其他库,而本身pip或者Easy_install时,又不难很好的自动解决这些依赖的库的问题(比如twisted,是twisted本身的问题),导致只是安装Scrapy,都这么麻烦。无语了。

作者:Seeksky

Scrapy在windows7-64位上安装真心的麻烦,花了很长时间才搞成

遇到了很多问题,在这里做一个总结,主要参考之前转的几篇文章:

Scrapy安装介绍

【original】安装Scrapy

【已解决】安装Scrapy过程中出错:ERROR: ‘xslt-config’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

【已解决】安装Python模块mmseg出错:error: Unable to find vcvarsall.bat

也有一些自己遇到的问题:

1.python的版本问题,因为之前安装了python2.7.3的64位版本之后,为了方便还安装了python(x,y),导致有些库是32位的

后来将python(x,y)删掉之后,重新安装了python2.7.3的64位版本之后,很多问题都解决了

2.scrapy整个库的依赖关系非常复杂,主要出问题的是xml那一块,依赖关系基本上是这样的:

libxml2<-libxslt<-lxml<-Scrapy

安装时请务必下载64位编译好的windows版本,自行编译容易出错,下载地址如下:

http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml

在如上地址中可以找到libxml2和lxml的所有编译好的做好了安装程序的库

然后还差一个libxslt,这个请在下面地址下载:

ftp://ftp.zlatkovic.com/pub/libxml/

然后将解压后得到的bin文件夹下的所有文件复制到windows/System32文件夹中

这样基本上能解决xml依赖的所有问题了

后面就是其他一些库的下载

这个请参考:

Scrapy安装介绍

到此,基本上所有库依赖的问题全部解决了

然后还有环境变量的问题,之前把环境变量C:Python27Scripts;C:Python27加到系统的path中怎么都不行

后来换到user下面的path就可以了

还有一个我使用的是VS2010也就是VC10

所以提示

error: Unable to find vcvarsall.bat

然后参考了上面引用的那篇文章,使用如下命令就解决了

1 `SET VS90COMNTOOLS=%VS100COMNTOOLS%`

然后使用pip install scrapy安装scrapy就搞定了

转自emacs中文网:http://emacser.com/vimvsemacs.htm

一直想学一下emacs编辑器,但是苦于没有精力,没有时间,但是情怀还是有的,所以转了这篇文章

——–正文开始————

作者: C. Minos Niu

1 钗黛双收:若你也同Vim难割舍,却又看Emacs情切切 (引子)

这篇文章分享我的一些经历,写给和我一样对娇小的Vim难以割舍,又在抱上Emacs这个大家闺秀以后死活不愿意撒手的朋友们。 

如果你不知道什么是“编辑器圣战”,那不妨百度Google一下,总之是自从开辟鸿蒙以来,就有两个以伴君左右为己任的贤内助(Vim编辑器和Emacs编辑器)在互掐。由于两位佳人的理念差别之大,加上各自阵营之间的鸿沟之深,使得先贤先哲基本上都会在这两个阵营里面挑一个来站队。

网络普及以后,凡有帖子对Vim和Emacs这两大编辑器作出比较,大都有成为必删贴的潜质。原因很好理解,无论是谁看了红楼梦,很难不对宝钗黛玉这两位产生点好恶,此后但凡有人起了个头要对钗黛二人做点比较,那后面的楼经常能盖歪到变成地域攻击男女对骂。在技术论坛里,这样折腾不被河蟹掉才怪。更有甚者,如果谁在讨论编程的时候问了一句“需要做xx开发,用什么工具比较好?”随后也常常演变成Vim对Emacs的钗黛攻伐,最后一样飞沙走石天昏地暗。这就说明,选择Vim或Emacs已经不仅取决于我们在编辑文本时的好恶,而已经上升到干活的人怎么挑工具,过日子的人怎么选老婆这种哲学高度的问题。

我一向觉得,成事者不可狭于器。所以选工具时候没必要为了工具本身而搞个粉丝团,而是就着菜选刀,比着孩子找媳妇,揽来什么样的活计使什么样的家伙。若以我的经验来概括,Vim的犀利在于键盘操作,练家子爽得是用最少的手指运动完成编辑;Emacs的NB在于自定义功能,高手们都有一套独门不传的脚本,所以Emacser满手都是绝活,靠这些绝活上天入地无所不能。注意,这里要讲的既不是比出高下,也不是评测完了各打五十大板和稀泥。而是说说提炼出两个工具的精华加以“双修”,用足够务实的态度来平息争端。

先说点野史当引子。大学里面从来都不缺废寝忘食折腾电脑的兄弟。他们当中应该有不少动机都和当年的我一样:希望被人误认为是电脑高手。这种伪装有一个巨大的好处——没准能多给女生重装几次Windows。

不过,重装Windows的高手们为了哥们面前神侃时不露怯,基本上还要玩过点一般人玩不转的GNU/Linux。我想,工科男生们的Linux情结,怕有不少是因此而生。然而凡事不易,玩Linux是要自己改配置文件的,这倒是根硬骨头。

骨头硬的重要原因么,编辑器不顺手。在那没有Ubuntu的年代里,谁要是折腾几个晚上装好一台Linux的小白肉鸡,会发现可用的编辑器只有Vim。这玩意和Windows的记事本、Dos的edit相比简直就是个怪胎。这一点想必Emacser也深有感触吧,进到Vim里面若是不懂命令,肯定是在一阵滴滴滴过后连一个字母都敲不到屏幕上。

当装机圣手们的情商智商普遍被挑战了以后,大致是迅速分化为两派——啃骨头派和换骨头派。啃派如我,继续捏着脚适应Vim的小鞋;换派不用说也能猜到,自然是鞋也不要就转身踏入了Emacs阵营——在那边起码知道怎么打字。

按说天朝对于西方的编辑器圣战应该是打酱油的态度,但实际情况是,啃派和换派俨然形成了自己的圣战副本。

2 钗黛双收:若你也同Vim难割舍,却又看Emacs情切切 (Vim篇)

那段时间作为Vim啃派,我和许多队友一样有个自恃甚高的理由来支持Vim:编辑时击键次数最少。但是私下里想想,这个理由多少有些往脸上贴金。

其实Vim用多了以后,并不只是臣服于高效,更多的是手指头上瘾。用我们运动神经控制的行话来说,Vimer的大脑已经被触觉感官和运动神经一起绑架了。那些用手指肌肉记住的命令,执行起来基本不怎么过脑子。而且一旦命令执行成功,脑中还会生成大量“多巴胺”以示奖励。

看过《生活大爆炸》的应该都有印象,Leslie夜晚敲Leonard的门,只不过是为了缓解自己多巴胺分泌过剩……所以Vimer生存在这样一种状态下:只要不用hjkl这种奇怪的击键来移动光标,就会流着眼泪打着呵欠思念不已;反过来一旦用上了hjkl,那就等于在重复《生活大爆炸》里面那种神经感受。你说像在嗑药也行。

Vim瘾上身之后必然产生一个愿望,那就是以嗑药的方式,额,以Vim的方式来操作所有的软件。很不幸,持有这种愿望的啃派们几乎都会发现,就算骨头啃下来了,它也是打狗不能的。

首先,想替小家碧玉Vim扩展出十八般武艺,这个基本上真的很难。难的根本原因是Vim给用户预留的扩展能力先天不足。Vim的设计者压根没考虑把它做成一个放之四海而皆准的巨无霸,所以Vim打从娘胎里出来时在胃口上就不太给力。

既然此路不通,那只好另求变法。为了让啃骨头时攒下的功夫不至于荒废,能不能对其他软件的键盘操作方式动动刀,让它们起码和Vim敲起来差不多?这也很难。虽然软件的操作方式通常可以自定义,但自定义的途径大多是修改键位绑定。这种途径有个与生俱来的短板,它并不能区分出Vim里的“命令模式”和“编辑模式”。不巧的是,这种模式区分恰恰是Vim操作方式的核心。说到底,要想在其他软件里面模拟Vim,基本上等同于重新开发一遍。所以这么多年我只见到Firefox的Vimperator插件做到了在宿主软件(Firefox)中对Vim几乎完全模拟(当然有若干Chrome和Visual Studio的插件也可以部分模拟Vim,但个人意见它们的“类Vim”程度都还差得远)。而且现如今浏览器混战成这个样子,哪个插件都恨不得全机种通吃,但Vimperator却丝毫没有往其他浏览器上移植的意思。这也从某种意义上证明模拟Vim不是件容易的事。

折腾这一大圈,发现一个无奈而不争的事实:Vim由于太过婉约,终归没有可能升任管家。意思就是不可能让所有软件用起来都像是在操作Vim一样。所以我只好把Vim养在硬盘里没事绣绣花打打字,而让管家这个肥缺虚位以待。转机出现在某一天,那天后知后觉的看到了一个老掉牙的故事,福特汽车的创始人亨利福特说,在汽车发明以前如果你问消费者想要什么,他们会说想要跑得更快的马。苹果的乔大爷也总是拿这个故事来说事,意思就是我苹果这才叫真正抓住了问题的核心——(出门人)要的未必是马,而是快;(iPhone粉丝)要的未必是多任务,而是上网的时候还能听个小曲。

这个产品设计的例子启发在哪?在我看来,当一个愿望被挖出来以后,不见得需要照本宣科才能满足这个愿望。如果换个解法还能满足,那说明你hit the button了。换句话说,当引子出来后,故事往下怎么续是文无定法的。

回到眼前这个事上,啃骨头派的愿望是用Vim的操作方式来一统江湖,不过果真非得“用Vim的方式”吗?恐怕重点还是“一桶浆糊”吧。玩电脑的都是懒人,懒人有个癖好叫“Don’t repeat yourself”,如果谁弄出一套比较高效的键盘操作方式,能让我学一次以后就不用再学了,那就暂时去tnnd的门派。

用个比方来做总结,Vim实在是精致独特得有点像个林妹妹。但谁要是希望家里也有个林妹妹,光把自家丫头照着绣像打扮打扮是不行的,必须从零开始养成一个。而且就算真能养出来个“天上掉下来”一般的可人儿,管家婆的位置仍然没她的份。

3 钗黛双收:若你也同Vim难割舍,却又看Emacs情切切 (Emacs篇,结局)

一旦破除了心理障碍,在Vim之外寻求“管家婆”的人选也就不算作倒戈了。电影《社交网络 The Social Network》里面有这样一个镜头,在扎克伯格同学悲愤不已,要把女生头像和畜生猪狗一起打分时,他来了句“有必要重启Emacs,修改代码”。这个杜撰的场景告诉我们,IT巨星再怎么胸怀壮志,始于足下的不过是手指另一端连着的编辑器。当geek们叫嚣要在世界上留下一个痕迹(make a dent in the universe)的时候,手里常常拎着一把折凳,折凳背面写着——Emacs。

我用Emacs的最初经历和很多Emacser可能稍有不同,但想必都是从跌跌撞撞的青涩回忆开始,最后让Emacs成了一个“全能伴侣”而浑不自知。博士期间,我主要用的工具是Matlab和Visual Studio,这两个工具自带的编辑器与Vim相比都是小白,属于要严重影响心情和智商的那一种。但是,无论是Matlab还是Visual Studio,它们自带的小白编辑器都只有Emacs模式,没有Vim模式(原因如前所述,模拟Vim很难)。这好歹是聊胜于无,而且既然Emacs用户能从中受益,我凭什么不试试。不得不说,如果目的是用统一的键盘操作方式来使用各种软件,Emacs的领地实在是太广了。除了Matlab和Visual Studio这种内部伪装出一部分Emacs的快捷键以外,非常值得一提的是还有一个日本人写的软件Xkeymacs。这玩意干脆把Windows的快捷键全部接管了,直接让所有Windows软件用起来都跟Emacs一个感觉。所以如果你像我一样不得不在Word里面写文稿的话(Neuroscience领域很多教授不是工程背景,只用Word),就知道Xkeymacs让你舒服在哪里了。难怪一个老外在评价的时候说Xkeymacs这个李鬼软件好到让人“心中不安(disturbingly good)”。

搞笑的是,我是直到在Xkeymacs这种替身杂牌军中用熟了Emacs快捷键之后,才开始慢慢尝试Emacs本尊。开始时先把Emacs配成了Matlab IDE,用它搞定了整个博士课题的数据处理,后来又陆续使用了cedet,etag,yasnippet这些扩展,再加上秒杀笔记、日程、Wiki、表格、博文的org-mode……算是把我这个入门级的Hacker武装到了神经末梢。虽然我不像其他Emacser一般可以骄傲的说自己“活在Emacs里”,但若说最近重要的工作成果都是在Emacs上创作出来,这话却是一点也不假。到了这个时候,Emacs已经完全升任管家婆,堪比宝钗再世。如果谁也有似曾相识的回忆,想必可以深刻体会到这样一个比较狗血的剧情,若宝玉能和Emacs一样的宝钗姐姐继续好下去,那完全有希望弄出个明朝版的百度,东山再起。

可是作为Vim的死忠,对于手掌几乎不挪窝的向往,那是消失不掉的。

坊间对于Emacs有一条经典评语,说Emacs是“伪装成编辑器的操作系统”。言下之意就是Emacs什么都能做(包括经典的煮咖啡)。既然Emacs都神通成瑞士军铲了,何不另辟蹊径,用军铲削出一个Vim呢?西方到底是计算机技术的始作俑者,对Emacs这种恐龙级工具而言,能被摆弄的四十年来都被摆弄一遍了。所以只要放狗一搜,就会发现Emacs居然自带Vim模拟,名叫viper-mode。而且为了让viper-mode更像Vim,还有第三方开发了一套叫做vimpulse的增强包。也就是说,只要下载一个vimpulse.el脚本,丢到Emacs的启动路径中,它就可以几乎完美的模拟Vim!

写到这里,折腾的两条主线已在此收敛,引发“圣战”的两大神器也已经被和谐进了同一个窗口。再往下就该写些技术笔记和心得回顾,不在这篇的目的之内,因此应该歇笔了。如果要问我到底是在用Emacs还是在用Vim,或问哪一方赢得了我的选择?我也不知道。每当想写点程序、调段脚本、码点wiki、记记笔记的时候,我用的都是Emacs提供的外加自己用eLisp扩展出的功能;但是当码出来的东西让人不爽,需要浏览、修改和整理的时候,手指弹出的又都是Vim的命令。

回到最开始说的,若是你用电脑要做的事和我差不多,而且也觉得用键盘工作是很爽的一件事,那就应该试试Emacs+Vim双修。道理很简单,假如你是包工头,而Emacs和Vim是两位身手不凡的应聘者,那么当然应该是两个都收了而后“择其善者而从之”,这才是对自家生意负责。不过对选编辑器如选媳妇的人来说,两大神器双修在手,尽在此一句:

惘于环肥燕瘦,颦怅蹙茫

哪比举钗盈黛,牵黄擎苍?

http://www.cnblogs.com/txw1958/archive/2012/07/12/scrapy_installation_introduce.html

 

一、 Scrapy简介

Scrapy is a fast high-level screen scraping and web crawling framework, used to crawl websites and extract structured data from their pages. It can be used for a wide range of purposes, from data mining to monitoring and automated testing.

官方主页: http://www.scrapy.org/

二、 安装Python2.7

官方主页:http://www.python.org/

下载地址:http://www.python.org/ftp/python/2.7.3/python-2.7.3.msi

1) 安装python

安装目录:D:Python27

2) 添加环境变量

略System Properties -> Advanced -> Environment Variables - >System Variables -> Path -> Edit

3) 验证环境变量

4) 验证Python

复制代码

复制代码

三、 安装Twisted

Twisted is an event-driven networking engine written in Python and licensed under the open source

1) 安装setuptools

Download, build, install, upgrade, and uninstall Python packages – easily!

官方主页:http://pypi.python.org/pypi/setuptools

下载地址:http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11.win32-py2.7.exe

安装过程:略

2) 安装Zope.Interface

官方主页:http://pypi.python.org/pypi/zope.interface/

下载地址:http://pypi.python.org/packages/2.7/z/zope.interface/zope.interface-4.0.1-py2.7-win32.egg

安装过程:

复制代码

复制代码

验证安装:

复制代码

复制代码

3) 安装Twisted

官方主页:http://twistedmatrix.com/trac/wiki/TwistedProject

下载地址:http://pypi.python.org/packages/2.7/T/Twisted/Twisted-12.1.0.win32-py2.7.msi

安装过程:略

四、 安装w3lib

官方主页:http://pypi.python.org/pypi/w3lib

下载地址: http://pypi.python.org/packages/source/w/w3lib/w3lib-1.2.tar.gz

解压过程:略

安装过程:

复制代码

复制代码

验证安装:

复制代码

复制代码

五、 安装libxml2

官方主页:http://users.skynet.be/sbi/libxml-python/

http://pypi.python.org/pypi/pyOpenSSL

下载地址:http://users.skynet.be/sbi/libxml-python/binaries/libxml2-python-2.7.7.win32-py2.7.exe

安装过程:略

验证安装:

复制代码

复制代码

六、 安装pyOpenSSL

官方主页:http://pypi.python.org/pypi/pyOpenSSL

下载地址:http://pypi.python.org/packages/2.7/p/pyOpenSSL/pyOpenSSL-0.13.winxp32-py2.7.msi

安装过程:略

验证安装:

复制代码

复制代码

七、 安装Scrapy

官方主页:http://scrapy.org/

下载地址:http://pypi.python.org/packages/source/S/Scrapy/Scrapy-0.14.4.tar.gz

解压过程:略

安装过程:

复制代码

复制代码

验证安装:

复制代码

复制代码

 

本文简单介绍了各种常用的字符编码的特点,并介绍了在python2.x中如何与编码问题作战 :)  请注意本文关于Python的内容仅适用于2.x,3.x中str和unicode有翻天覆地的变化,请查阅其他相关文档。  尊重作者的劳动,转载请注明作者及原文地址 >.<

转自:http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html

感谢原作者AstralWind的辛勤劳作

返回主页

1. 字符编码简介

1.1. ASCII

ASCII(American Standard Code for Information Interchange),是一种单字节的编码。计算机世界里一开始只有英文,而单字节可以表示256个不同的字符,可以表示所有的英文字符和许多的控制符号。不过ASCII只用到了其中的一半(x80以下),这也是MBCS得以实现的基础。

1.2. MBCS

然而计算机世界里很快就有了其他语言,单字节的ASCII已无法满足需求。后来每个语言就制定了一套自己的编码,由于单字节能表示的字符太少,而且同时也需要与ASCII编码保持兼容,所以这些编码纷纷使用了多字节来表示字符,如GBxxx、BIGxxx等等,他们的规则是,如果第一个字节是x80以下,则仍然表示ASCII字符;而如果是x80以上,则跟下一个字节一起(共两个字节)表示一个字符,然后跳过下一个字节,继续往下判断。

这里,IBM发明了一个叫Code Page的概念,将这些编码都收入囊中并分配页码,GBK是第936页,也就是CP936。所以,也可以使用CP936表示GBK。

MBCS(Multi-Byte Character Set)是这些编码的统称。目前为止大家都是用了双字节,所以有时候也叫做DBCS(Double-Byte Character Set)。必须明确的是,MBCS并不是某一种特定的编码,Windows里根据你设定的区域不同,MBCS指代不同的编码,而Linux里无法使用MBCS作为编码。在Windows中你看不到MBCS这几个字符,因为微软为了更加洋气,使用了ANSI来吓唬人,记事本的另存为对话框里编码ANSI就是MBCS。同时,在简体中文Windows默认的区域设定里,指代GBK。

1.3. Unicode

后来,有人开始觉得太多编码导致世界变得过于复杂了,让人脑袋疼,于是大家坐在一起拍脑袋想出来一个方法:所有语言的字符都用同一种字符集来表示,这就是Unicode。

最初的Unicode标准UCS-2使用两个字节表示一个字符,所以你常常可以听到Unicode使用两个字节表示一个字符的说法。但过了不久有人觉得256*256太少了,还是不够用,于是出现了UCS-4标准,它使用4个字节表示一个字符,不过我们用的最多的仍然是UCS-2。

UCS(Unicode Character Set)还仅仅是字符对应码位的一张表而已,比如”汉”这个字的码位是6C49。字符具体如何传输和储存则是由UTF(UCS Transformation Format)来负责。

一开始这事很简单,直接使用UCS的码位来保存,这就是UTF-16,比如,”汉”直接使用x6Cx49保存(UTF-16-BE),或是倒过来使用x49x6C保存(UTF-16-LE)。但用着用着美国人觉得自己吃了大亏,以前英文字母只需要一个字节就能保存了,现在大锅饭一吃变成了两个字节,空间消耗大了一倍……于是UTF-8横空出世。

UTF-8是一种很别扭的编码,具体表现在他是变长的,并且兼容ASCII,ASCII字符使用1字节表示。然而这里省了的必定是从别的地方抠出来的,你肯定也听说过UTF-8里中文字符使用3个字节来保存吧?4个字节保存的字符更是在泪奔……(具体UCS-2是怎么变成UTF-8的请自行搜索)

另外值得一提的是BOM(Byte Order Mark)。我们在储存文件时,文件使用的编码并没有保存,打开时则需要我们记住原先保存时使用的编码并使用这个编码打开,这样一来就产生了许多麻烦。(你可能想说记事本打开文件时并没有让选编码?不妨先打开记事本再使用文件 -> 打开看看)而UTF则引入了BOM来表示自身编码,如果一开始读入的几个字节是其中之一,则代表接下来要读取的文字使用的编码是相应的编码:

BOM_UTF8 'xefxbbxbf'  BOM_UTF16_LE 'xffxfe'  BOM_UTF16_BE 'xfexff'

并不是所有的编辑器都会写入BOM,但即使没有BOM,Unicode还是可以读取的,只是像MBCS的编码一样,需要另行指定具体的编码,否则解码将会失败。

你可能听说过UTF-8不需要BOM,这种说法是不对的,只是绝大多数编辑器在没有BOM时都是以UTF-8作为默认编码读取。即使是保存时默认使用ANSI(MBCS)的记事本,在读取文件时也是先使用UTF-8测试编码,如果可以成功解码,则使用UTF-8解码。记事本这个别扭的做法造成了一个BUG:如果你新建文本文件并输入”姹塧”然后使用ANSI(MBCS)保存,再打开就会变成”汉a”,你不妨试试 :)

2. Python2.x中的编码问题

2.1. str和unicode

str和unicode都是basestring的子类。严格意义上说,str其实是字节串,它是unicode经过编码后的字节组成的序列。对UTF-8编码的str'汉'使用len()函数时,结果是3,因为实际上,UTF-8编码的'汉' == 'xE6xB1x89'。

unicode才是真正意义上的字符串,对字节串str使用正确的字符编码进行解码后获得,并且len(u'汉') == 1。

再来看看encode()和decode()两个basestring的实例方法,理解了str和unicode的区别后,这两个方法就不会再混淆了:

?

1 2 3 4 5 6 7 8 9 10 11 12 13 ~~~ # coding: UTF-8   u = u'汉' print repr(u) # u'u6c49' s = u.encode('UTF-8') print repr(s) # 'xe6xb1x89' u2 = s.decode('UTF-8') print repr(u2) # u'u6c49'   # 对unicode进行解码是错误的 # s2 = u.decode('UTF-8') # 同样,对str进行编码也是错误的 # u2 = s.encode('UTF-8') ~~~

需要注意的是,虽然对str调用encode()方法是错误的,但实际上Python不会抛出异常,而是返回另外一个相同内容但不同id的str;对unicode调用decode()方法也是这样。很不理解为什么不把encode()和decode()分别放在unicode和str中而是都放在basestring中,但既然已经这样了,我们就小心避免犯错吧。

2.2. 字符编码声明

源代码文件中,如果有用到非ASCII字符,则需要在文件头部进行字符编码的声明,如下:

?

1 `` #-*- coding: UTF-8 -*- ``

实际上Python只检查#、coding和编码字符串,其他的字符都是为了美观加上的。另外,Python中可用的字符编码有很多,并且还有许多别名,还不区分大小写,比如UTF-8可以写成u8。参见http://docs.python.org/library/codecs.html#standard-encodings

另外需要注意的是声明的编码必须与文件实际保存时用的编码一致,否则很大几率会出现代码解析异常。现在的IDE一般会自动处理这种情况,改变声明后同时换成声明的编码保存,但文本编辑器控们需要小心 :)

2.3. 读写文件

内置的open()方法打开文件时,read()读取的是str,读取后需要使用正确的编码格式进行decode()。write()写入时,如果参数是unicode,则需要使用你希望写入的编码进行encode(),如果是其他编码格式的str,则需要先用该str的编码进行decode(),转成unicode后再使用写入的编码进行encode()。如果直接将unicode作为参数传入write()方法,Python将先使用源代码文件声明的字符编码进行编码然后写入。

?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 ~~~ # coding: UTF-8   f = open('test.txt') s = f.read() f.close() print type(s) # <type 'str'> # 已知是GBK编码,解码成unicode u = s.decode('GBK')   f = open('test.txt', 'w') # 编码成UTF-8编码的str s = u.encode('UTF-8') f.write(s) f.close() ~~~

另外,模块codecs提供了一个open()方法,可以指定一个编码打开文件,使用这个方法打开的文件读取返回的将是unicode。写入时,如果参数是unicode,则使用open()时指定的编码进行编码后写入;如果是str,则先根据源代码文件声明的字符编码,解码成unicode后再进行前述操作。相对内置的open()来说,这个方法比较不容易在编码上出现问题。

?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ~~~ # coding: GBK   import codecs   f = codecs.open('test.txt', encoding='UTF-8') u = f.read() f.close() print type(u) # <type 'unicode'>   f = codecs.open('test.txt', 'a', encoding='UTF-8') # 写入unicode f.write(u)   # 写入str,自动进行解码编码操作 # GBK编码的str s = '汉' print repr(s) # 'xbaxba' # 这里会先将GBK编码的str解码为unicode再编码为UTF-8写入 f.write(s) f.close() ~~~

2.4. 与编码相关的方法

sys/locale模块中提供了一些获取当前环境下的默认编码的方法。

?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ~~~ # coding:gbk   import sys import locale   def p(f):     print '%s.%s(): %s' % (f.__module__, f.__name__, f())   # 返回当前系统所使用的默认字符编码 p(sys.getdefaultencoding)   # 返回用于转换Unicode文件名至系统文件名所使用的编码 p(sys.getfilesystemencoding)   # 获取默认的区域设置并返回元祖(语言, 编码) p(locale.getdefaultlocale)   # 返回用户设定的文本数据编码 # 文档提到this function only returns a guess p(locale.getpreferredencoding)   # xbaxba是'汉'的GBK编码 # mbcs是不推荐使用的编码,这里仅作测试表明为什么不应该用 print r"'xbaxba'.decode('mbcs'):", repr('xbaxba'.decode('mbcs'))   #在笔者的Windows上的结果(区域设置为中文(简体, 中国)) #sys.getdefaultencoding(): gbk #sys.getfilesystemencoding(): mbcs #locale.getdefaultlocale(): ('zh_CN', 'cp936') #locale.getpreferredencoding(): cp936 #'xbaxba'.decode('mbcs'): u'u6c49' ~~~

3.一些建议

3.1. 使用字符编码声明,并且同一工程中的所有源代码文件使用相同的字符编码声明。

这点是一定要做到的。

3.2. 抛弃str,全部使用unicode。

按引号前先按一下u最初做起来确实很不习惯而且经常会忘记再跑回去补,但如果这么做可以减少90%的编码问题。如果编码困扰不严重,可以不参考此条。

3.3. 使用codecs.open()替代内置的open()。

如果编码困扰不严重,可以不参考此条。

3.4. 绝对需要避免使用的字符编码:MBCS/DBCS和UTF-16。

这里说的MBCS不是指GBK什么的都不能用,而是不要使用Python里名为'MBCS'的编码,除非程序完全不移植。

Python中编码'MBCS'与'DBCS'是同义词,指当前Windows环境中MBCS指代的编码。Linux的Python实现中没有这种编码,所以一旦移植到Linux一定会出现异常!另外,只要设定的Windows系统区域不同,MBCS指代的编码也是不一样的。分别设定不同的区域运行2.4小节中的代码的结果:

?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ~~~ #中文(简体, 中国) #sys.getdefaultencoding(): gbk #sys.getfilesystemencoding(): mbcs #locale.getdefaultlocale(): ('zh_CN', 'cp936') #locale.getpreferredencoding(): cp936 #'xbaxba'.decode('mbcs'): u'u6c49'   #英语(美国) #sys.getdefaultencoding(): UTF-8 #sys.getfilesystemencoding(): mbcs #locale.getdefaultlocale(): ('zh_CN', 'cp1252') #locale.getpreferredencoding(): cp1252 #'xbaxba'.decode('mbcs'): u'xbaxba'   #德语(德国) #sys.getdefaultencoding(): gbk #sys.getfilesystemencoding(): mbcs #locale.getdefaultlocale(): ('zh_CN', 'cp1252') #locale.getpreferredencoding(): cp1252 #'xbaxba'.decode('mbcs'): u'xbaxba'   #日语(日本) #sys.getdefaultencoding(): gbk #sys.getfilesystemencoding(): mbcs #locale.getdefaultlocale(): ('zh_CN', 'cp932') #locale.getpreferredencoding(): cp932 #'xbaxba'.decode('mbcs'): u'uff7auff7a' ~~~

可见,更改区域后,使用mbcs解码得到了不正确的结果,所以,当我们需要使用'GBK'时,应该直接写'GBK',不要写成'MBCS'。

UTF-16同理,虽然绝大多数操作系统中'UTF-16'是'UTF-16-LE'的同义词,但直接写'UTF-16-LE'只是多写3个字符而已,而万一某个操作系统中'UTF-16'变成了'UTF-16-BE'的同义词,就会有错误的结果。实际上,UTF-16用的相当少,但用到的时候还是需要注意。

–END–