在Centos6.7中将python升级成2.7版本

在Centos6.7中将python升级成2.7版本,网上有一大堆文章,但是要知道,没有永远正确的配置,每台机子,每个软件版本可能都不一样,所以要针对自己的问题,记录,找出对应的原因,才能以不变应万变啊。

不废话了,我这里记录一下在64位centos6.7中将python2.6.6升级为python2.7.12的过程。

1.安装devtoolset

devtoolset可以帮助我们解决gcc编译的问题,而在yum中,我们直接使用groupinstall,就能把工具组给安装了,很方便,输入以下命令:

yum groupinstall "Development tools"

2.安装编译Python需要的包:

yum install zlib-devel
yum install bzip2-devel
yum install openssl-devel
yum install ncurses-devel
yum install sqlite-devel

3.下载python2.7.12:

wget https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz

4.解压:

tar -xvf Python-2.7.12.tgz

然后进入该目录:

cd Python-2.7.12

5.开始编译安装三部曲

./configure --prefix=/usr/local --enable-shared
make
make install

如果遇到错误:

error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

那就新建一个文件:

vim /etc/ld.so.conf.d/python2.7.conf

加入以下内容:

/usr/local/lib

保存退出后运行命令读取配置:

ldconfig

然后再重新编译安装三部曲即可。

看到网上很多教程有说,安装完新版本的python,系统还是用的默认的旧版本,所以需要更改软连接,还有yum的设置。但在我这里并没有遇到,我是可以直接用了,而且yum也正常。可能和python的版本有关,如果你在安装完之后出现,运行python,发现版本仍然是默认的版本,那么你就需要更改软连接了,更改完软连接之后,要检查yum是否正常。

6.安装pip

在windows下,装完python2.7.12会默认把pip也装上。但在linux上有所不同,至少我在完成以上步骤之后,运行pip并没有反应。所以还需要安装pip。直接用yum神器:

yum install python-pip

7.安装python-devel

输入命令安装就行:

yum install python-devel

这就基本上就完成了python的升级。

python的切片(slice)机制

在python编程中,我们经常要取list或者tuple里面的元素,或者对字符串进行处理,这恰恰也是python的一个闪光点,它的切片(slice)机制,使得我们处理这类问题变得简单灵活。

“切片”是针对列表(list)、元组(tuple)的,另外,字符串也可以当作特殊的list,通过切片,可以很轻易的实现截取字符串、反转字符串的操作。

所谓的切片,就是按照你的规则,将一个列表切成另外一个列表,先来直观感受一下。

list = ["lookfor404","lipengfei","hello","what"]
list1 =list[0:2:2]
print list1

你猜输出什么?输出了一个新的列表['lookfor404']

假如是这样呢?又会输出什么?

list = ["lookfor404","lipengfei","hello","what"]
list1 =list[0:2:1]
print list1

答案是['lookfor404', 'lipengfei']

现在就来解释一下。切片的使用就是这么简单,在一个list后面加个中括号,里面有两个冒号,插空有3个参数。

list[first_index:last_index:step]

这个表示,从这个list的first_index开始,到last_index结束(不包括last_index本身),以step步长来截取这个list

回到刚才的例子,由于list = ["lookfor404","lipengfei","hello","what"],这个list有4个元素,而list1 =list[0:2:2]表示的是,从list的第0个元素(lookfor404)开始,到第2个元素(hello)结束,以步长2来截取list,这里要注意的是,前两个参数0和2,在数学上是个半闭半开的区间:[0,2)。所以,很自然的,可以得到list1的结果就是['lookfor404']

当然,并不是一定要用两个冒号,如果只使用了一个冒号,就意味着步长默认为1。以上是常规用法,下面拓展一下,其实它很强大,所以python不需要一些字符串的截取函数了。

比如————
复制list,可以直接这样

list = ["lookfor404","lipengfei","hello","what"]
list1 =list[:]

list1就复制了list的内容过来了,因为冒号两边不填参数的话,就默认从0到最后一个元素(包括最后一个元素)。

再比如————
反转字符串,可以这样

str = "helloworld"
str1 =str[::-1]

此时输出str1就是'dlrowolleh'。原因在于步长参数,我们选择了负数,没错,负数就表示反着来,-1表示倒序,-2表示隔着步长2倒序,也就是说,如果str1 =str[::-2],那么输出str1为'drwle'

最后对边界进行一个总结,直接上代码:

s = ["a","b","c","d"]       # s的上界为0,下界为 4(事实上,最后一个元素的索引为3,但这里称4为下界)
s[-100:100]       #返回 [1,2,3,4] :-100超出了上界,100超出了下界:等价于 s[0:4]
s[-100:-200]      #返回 [] :-100,-200均超出了上界,自动取上界:等价于s[0:0]
s[100:200]        #返回 [] :100,200均超出了下界,自动取下界值:等价于s[4:4]
s[:100]           #返回 [1,2,3,4] :开始值省略表示从第0个开始,等价于s[0:4]
s[0:]             #返回 [1,2,3,4] :结束值为空表示到最后一个结束,等价于s[0:4]

记录一下windows下panda的安装过程

搞大数据开发,就是和数据打交道,具体怎么处理数据,也需要深究,python有很多很好用的库,其中pandas是比较出名的。下面是简单的介绍:

Pandas是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的一部分。Pandas最初被作为金融数据分析工具而开发出来,因此,pandas为时间序列分析提供了很好的支持。 Pandas的名称来自于面板数据(panel data)和python数据分析(data analysis)。panel data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型。

官网:http://pandas.pydata.org/

我刚开始以为直接pip就能安装pandas了。事实证明我太天真了。下面还是记录一下我的安装过程吧。

利用pycharm直接安装pandas

pycharm的包管理工具挺好用的,直接可以在里面搜索到很多可以用的包,然后直接安装。安装pandas也不例外。

首先打开pycharm,直接在setting里面找到编译器的选项

pycharm中编译器设置

可以看到本地已经安装的包,点击右边的+号,就可以安装新的包了。想安装pandas,直接搜索pandas就是了,记得别少了s,是pandas

搜索后安装即可。pandas是依赖于别的包的,根据提示,如果还需要安装别的包,继续搜索安装就行。

在windows下用pip安装pandas

官网推荐的是直接使用Anoconda,它集成了pandas,可以直接使用。安装挺简单的,有windows下的安装包。

如果不想安装庞大的Anoconda,那就一步一步用pip来安装pandas。

如果直接pip install pandas,可能会出现一系列的问题,为了稳妥起见,我先把依赖包都一个个安装下来,最后再安装pandas,就没有问题了。

官网说pandas需要以下几个依赖:

setuptools
NumPy: 1.7.1 or higher
python-dateutil 1.5 or higher
pytz

一个个来。首先setuptools,这个和pip本身在新一点的python下是默认安装了的。我的python版本是2.7.11

然后pip install numpy

安装numpy

安装到一般,居然出错了。错误如下:

Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat

原因:windows下使用pip安装包的时候需要机器装有vs2008,VS2012都不行,如果不想装VS2008的话,可以安装一个Micorsoft Visual C++ Compiler for Python 2.7的包。
下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=44266

如果还是不行的话,就直接去官网找windows下的安装包。

官网:http://sourceforge.net/projects/numpy/files/

我找的1.9.2版本:http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/

有windows下针对python2.7的安装包,文件名为numpy-1.9.2-win32-superpack-python2.7.exe

下载安装即可。

搞定了numpy,接下来安装python-dateutil,命令:pip install python-dateutil
很顺利。

然后安装pytz,命令:pip install pytz
也很顺利。

最后!直接安装pandas就行了,命令:pip install pandas

安装pandas

大功告成,真是折腾。

python爬虫–抓取ajax更新的内容

虽然很多情况下,直接对一个url发出请求,就能得到页面的源代码,但是我们还得考虑这么一种情况,就是有的网站为了用户体验,采用了ajax技术–即不刷新页面而改变页面内容,那么我们该怎么获取这些内容呢?

从本质出发,ajax技术也就是这么一个过程:利用js来发起一个post请求–然后接收返回的数据–js改变页面内容。在大多数情况下,我们都是点击一个按钮,然后页面就更新了。从原理上来看,点击某个按钮,就会发送一个post请求(当然还有滚动鼠标发送请求的),服务器再返回结果,再将结果直接更新到页面上。我们的思路是–用爬虫发送同样的post请求,从而获得返回来的数据。

简单点说,对于爬虫而言,在获取数据上,get和post并无太多异样,只是get的话,我们只需要对某个链接发送请求就行,而post,则需要一些表单内容。那么,我们怎么知道该post什么内容过去,又能获得什么响应呢?

以虎嗅网(http://www.huxiu.com/)为例,我用python写了一个爬取它利用ajax更新的数据。

我们打开它的首页,拉到最下面,发现有个“点击加载更多”的按钮,颜色很浅。

点击它,就会有新的内容出现。

虎嗅网底部

我们要做的,就是看看点击这个按钮会发生什么。

我这里以遨游浏览器为例,大多数浏览器(比如chrome,Firefox)应该都有类似的功能,在网页上,点击右键–审查元素,在弹出的窗口菜单栏点击“网络”一栏,在这里,我们可以监控一些get,post等行为。

刚开始是空的。

此时,回到网页上去,点击“点击加载更多”按钮。然后再回到开发者工具那里,会发现,出现了很多的请求:

点击加载更多

其中,有个请求的方法是POST,这就是我们要找的。点进去,可以看到http报头、预览、响应和cookies。

从中,我们可以获得一些头部信息,以及post的表单数据。

  • 头部信息

不同网站对头部信息的要求不同,有的不需要头部信息都能响应,有的则需要头部信息的一部分,虎嗅是不需要头部信息的。

  • 表单数据

从开发者工具里面看,虎嗅需要的表单数据有两个,一个是’huxiu_hash_code‘,这个是用来防止csrf的,一个是page,代表页数,我们把huxiu_hash_code复制下来。

构造一个请求过去,会得到一个json格式的响应,内容有msg,total_page,result和data,要的文章数据在data里面。我的程序把data里面的标题都提取出来,打印到屏幕下,下面贴上代码:

#-*- coding:utf-8 -*-
__author__ = '李鹏飞'
import urllib2
import urllib
import json
import re
url = 'http://www.huxiu.com/v2_action/article_list'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
data = {'huxiu_hash_code':'322cf76eec54c4e275d7c8122028a3b2','page':2}
data = urllib.urlencode(data)
try:
    request = urllib2.Request(url=url,data=data)
    response = urllib2.urlopen(request)
    #解析json
    result = json.loads(response.read())
    print result['msg']
    content = result['data']
    #匹配文章标题
    pattern = re.compile('
<div class="mob-ctt">.*?target="_blank">(.*?)</a>',re.S)
    #虎嗅文章标题
    items = re.findall(pattern,content)
    for item in items:
        print item
except urllib2.URLError, e:
    if hasattr(e,"code"):
        print e.code
    if hasattr(e,"reason"):
        print e.reason

这样子的话,大部分网页就能抓了,管他是post还是get。

Linux下升级python版本-2.7.9

我用的centos,预装着python,版本比较低,是2.6的,而2.7.9以上的版本自带pip,easy_instll和wheel,为了省去安装这些东西的麻烦,我干脆直接重新装一个python2.7.9好了。

这里记录一下升级安装的过程。

首先去官网下载对应的python的tgz文件,在linux下可以直接wget,在windows下直接下载就行,网址:https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz

若网址失效,请移步python官网下载。

在linux下,将下载的tgz文件解压到指定目录,运行以下命令:

tar -xvzf Python-2.7.9.tgz -C /home 

解压完成,切换到解压的目录下,运行命令:

./configure

这个命令完成后,会生成makefile文件,供下一步使用。

接下来编译源代码,运行命令:

make

再运行最后一个命令,自动把文件分发的系统的关键位置,命令如下:

make install

等到处理完成,不需要任何更改,直接在命令行输入python,看到如下提示即安装成功:
python升级成功

2.7.9以及以上版本的python都预装了pip,eazy_install,很是方便,之后安装别的包就比较简单了。