多种方式安装django搭建环境

三种安装方式:
1.pip方式
apt-get install python-pip #安装pip
pip install Django #或者 pip install Django==1.6.10 或者 pip install Django==***
2.系统源获取安装
apt-get install python-django -y #源方式 安装
3.下载本地安装
#https://www.djangoproject.com/download/ 下载 django-***.tar.gz
tar -xvzf django-***.tar.gz
cd django-***
python setup.py install

win下安装使用命令方法:
cd python27/Script/#在该目录下执行
python django-admin.py startproject demo #创建demo项目,在当前目录下会生成demo名称的项目
python django-admin-script.py startapp testapp #创建app项目,与上面会在同级目录下是错误的,app应该在项目路径下

#当前项目管理路径
python manage.py migrate #数据库同步
python manage.py flush? #数据库清空

python manage.py createsuperuser #创建超级管理员
python manage.py changepassword username #修改用户密码

python manage.py dumpdata appname > appname.json #导出数据
python manage.py loaddata appname.json #导出数据

python manage.py shell #项目环境终端
python manage.py dbshell #数据库命令行

Kali下安装django使用命令方法:
django-admin startproject app_pro #创建app_pro项目 /root/app_pro
django-admin startapp testapp #创建app? /root/testapp,应该切换到项目目录,同级目录下创建app是错误的

#当前项目路径,默认为:/root/当前目录下项目管理 app_pro

./manage.py runserver 8000 #不写端口则默认为8000端口,也可以自定义
./manage.py flush #清空当前数据库,要配置数据库后才能操作
./manage.py createsuperuser #创建超级管理员,同上
#dumpdata appname > appname.json && loaddata appname.json #导出数据
#支持的命令如下:
[auth]
changepassword
createsuperuser

[django]
cleanup
compilemessages
createcachetable
dbshell
diffsettings
dumpdata
flush
inspectdb
loaddata
makemessages
reset
runfcgi
shell
sql
sqlall
sqlclear
sqlcustom
sqlflush
sqlindexes
sqlinitialdata
sqlreset
sqlsequencereset
startapp
startproject
syncdb
test
testserver
validate

[staticfiles]
collectstatic
findstatic
runserver

Python 中级进阶学习笔记

面对对象部分:
class Student(object) #Student继承object类
def __init__(self, name, score): #类似前置函数、构造函数
self.name = name? #设置属性
self.score = score
#self.__plus = plus #private局部变量的写法,__变量名
#感觉python的多态和派生都和c++差不多,具体在django用一下才晓得
python的类可以多重继承,也可以派生(object1,object2,…)java不能派生,c++可以派生
python还有抽象类,即 类库的模版,以后要写接口的时候,可以再配个实例

调试部分:
try:
#执行语句
except:
#异常时执行
logging.basicConfig(filename=’error.log’)
logging.exception(“Exception Logged”) #logging.exception(e) 为记录错误
finally:
#按照程序流程,执行完上面的后再执行这里的语句
#调试方法+经验 print() exit() type() 下断点,拿出数据检查

文件部分:
文件读写防止IO产生错误的写法#无需关闭文件
with open(‘/file’, ‘a’) as fp:
print(fp.read())
#fp.close()
fp.readline() #每次读取文件的一行
fp.readlines() #返回一个列表,每一个元素为一行
for line in fp.readlines():
print(line.strip()) # 把末尾的’\n’删掉
fp.write() #写操作
memory_fp = StringIO() #在内存中写文件
memory_fp.getvalue() #获取内存的文件数据
BytesIO() #在内存中写二进制文件

系统部分:
os.uname() #查看当前操作系统
os.environ #查看当前操作系统环境变量
os.mkdir() #创建目录
os.rmdir() #删除目录
os.path.join() #合并路径,处理不同操作系统兼容性
os.path.split()#拆分路径
os.path.abspath(‘.’)#查看当前绝对路径
os.path.splitext() #获取文件的扩展名
os.rename(‘test.txt’, ‘test.py’) #重命名文件名
os.remove(‘test.py’) #删掉文件

pickle.dumps() #把任意对象序列化写入内存
pickle.dump() #序列化后写入指定文件
pickle.loads() #内存中读取反序列化对象
pickle.load()? #文件中读取反序列化对象
json.dumps() #打印json对象
json.dump() #把json对象写入文件

进程部分:
os.getpid()#获取父进程id,类似c++的句柄
pid = os.fork() #子进程,只能用于linux内核,win内核是消息循环机制
from multiprocessing import Process #跨平台的多进程库Process()/start()/join()
Queue #进程通讯库
threading #线程库,要给线程睡眠时间
current_thread()#当前线程
MainThread #主线程 实例名
lock = threading.Lock() #线程锁 lock.acquire() 获取锁、lock.release() 释放锁 #容易造成死锁
threading.local() #全局线程对象

网络部分:
#长连接
#导入socket库:
import socket
#创建一个socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#建立连接:
s.connect(‘127.0.0.1′, 80)
#发送数据:
s.send(b’GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n’)
#接受数据
d = s.recv(1024) #接受字节数
#关闭连接:
s.close()
#监听端口:
s.bind((‘127.0.0.1’, 9999))
#连接最大数
s.listen(5)
#接受一个连接
s.accept()
#UDP短连接

数据库部分:
sqlite3 #sqlite库
mysql.connector #mysql驱动库
还是觉得mysql合适,做客户端的时候再考虑用sqlite了。

Python使用Sqlite增删改查操作

#coding=utf-8
import sqlite3,os
#创建数据库在硬盘上
conn = sqlite3.connect(‘C:\\Users\\Public\\Desktop\\test.db’)

“””
#执行sql创建表
conn.execute(”’CREATE TABLE LOG
(ID integer PRIMARY KEY autoincrement,
TITLE?????????? TEXT??? NOT NULL,
LINK??????????? TEXT??? NOT NULL,
PLUS??????? CHAR(255)
);”’)

“””

“””
#插入数据
conn.execute(“INSERT INTO LOG (TITLE,LINK) \
VALUES (‘test’,’url’)”);

conn.close()
“””

“””
#查询操作
cursor = conn.execute(“SELECT id,title,link,plus from log”)
for row in cursor:
print “id:”+str(row[0])
print “title:”+str(row[1])
print “link:”+str(row[2])
print “plus:”+str(row[3])
“””

“””
#更新、删除操作
conn.execute(“UPDATE LOG set TITLE = ‘updata’ where ID=1”)
conn.execute(“DELETE from LOG where ID=2;”)
“””

Python基础学习笔记

#字符串操作和数据类型相关
字符串切片操作 a[开始位置值:结束位置值:步长值]
len()求序列长度
+ 连接两个序列
“#”*5 重复序列元素次#####
in 判断元素是否在序列中 not in
max()min() 返回序列中的最大值和最小值
cmp(str1,str2) 判断2个序列是否相等

元祖(元祖)元祖值不可变类似于字符串列表?????????? (x,y)
列表 [序列] 是可变类型数据,和元祖的区别是 可对元素重新赋值??? [1,2]
list.append(“str” #列表中最后一个元素后面添加元素
list.remove(“元素值”) #删除列表中的元素,如果出现多个则删除第一个
del(list[0]) #删除元素键值
var in list 查找元素
字典 {字典} #在列表基础上增加了元祖列表映射,即列表的集合。{[x:1],[y:2]}
dic={key:value,key1,vaule1} #字典的定义方法
dic[‘key’] #字典的取值

#流程控制相关
for value in list:
print “输出数组值”+x #通常用于遍历序列
else:
print “正常结束后,输出ELSE”
if中continue和break,前者为停止跳出当前循环后代码,继续循环;后者为跳出循环
pass 代码桩,占位符,不做任何操作,预留代码块处理。

while 条件表达式:
执行代码块
else:
print “如果条件不成立,则输出!”

#函数相关
def 函数名(参数列表=缺省值):
函数体
retuen obj
xx = lambda x,y:x+y 匿名函数,快速定义一行的小函数,调用方式 xx(1,2) 返回3

#常用内建函数
type() 查看变量类型函数
id() 查看变量内存存储位置
help()? 查看帮助文档
range(开始值,结束值,步长) 连续数-函数,默认整数类型步长为1,xrange大数据运算
time.sleep(秒数值) 睡眠函数
exit() 结束程序
raw_input(‘please? input’) 输入函数
callable() 查看函数是否可被调用
isinstance(object,list) 判断object对象是否为list类型
str.split(切割字符,切割次数) 根据切割字符切割字符串函数
str.replace(变量,要替换字符,替换后字符) 字符串替换函数
filter(自定义函数,序列) 过滤方法,序列传入自定义函数后返回的序列
zip() 一一对应打包元祖序列合并为字典
map() 和zip一样,区别是map在缺少值会自动填充,支持并行遍历

#模块和包
import 模块
模块.方法 #引用模块中的方法,模块名就是文件名(不包括.py)

#正则表达式相关
正则表达式:import re
findall(‘正则’,’变量’) 返回数组 search 返回字符
. 占位符————-匹配任意字符,换行符\n除外
* 出现的位置———匹配前一个字符0次或无限次
? 寻找一次字符——-匹配前一个字符0次或1次
(\d+) 匹配数字——-
.* 贪心算法? .*? 非贪心算法
实际应用aa(.*?)bb 返回中间的值

元字符
[a-z] 常用匹配一个字符集,[^ac] 不包含a,c取反;
^ 匹配行首;$ 补集,补字符位置;
\d 匹配所有十进制,相当于[0-9]
\D 匹配所有非十进制,相当于[^0-9]
\s 匹配任何空白字符,相当于[\t\n\r\f\v]
\S 匹配任何非空白字符,相当于[^\t\n\r\f\v]
\w 匹配任何字母数字字符,相当于[a-zA-Z0-9_]
\W 匹配任何非字母数字字符,相当于[^a-zA-Z0-9_]
#\反转义字符如果是关键字则转义,如果是大写DSW结果则取反
{8} 重复次数,(^010-?\d{8}$) 匹配北京的电话号码
+ 至少出现一次,(hello+),至少出现一次hello
? 字符重复一次或者0次,比如(^010-?\d{8}$)中的-可有可无
{m,n} 至少重复m次,最多重复n次

match() #开始位置查找是否匹配,一般用来测试匹配的数据是否成功
search() #所有内容中查找是否匹配
findall() #匹配所有字符串,返回一个列表
finditer() #匹配所有字符串,返回一个迭代器
sub() #替换字符串 replsce()不支持正则,sub支持正则,subn
split() #切割字符串,返回一个字典

re.compile(r’hello’,re.I) #加入re.I参数 结果则不区分大小写
re.S #包括换行符 匹配
re.M #多行匹配
re.findall(r”\d{1}\.\d{1}\.\d{1}.\d{1}”,ip,re.I)[0] #匹配ip,使用便捷

#其他知识
浅拷贝:python中a=b赋值相当于C++中的变量引用,内存中地址并没有变化,

id(),append()函数测试;
深拷贝:c=copy.copy(a) 深拷贝,改变变量地址非引用
read() write() close() 打开、写入、关闭文件操作
FileObject类操作方法
readline() 每次读取一行 readlines() 每行返回一个列表
next() 指针移动
writelines() seek() 按行写入、按偏移量写入
flush() 刷新,不关闭文件更新文件
walk() 返回路径下的path,dirlist,filelist用于遍历目录

try:
代码块
except IOError,msg:
pass #代码块的异常处理
finally:
pass #不管是否异常都执行的语句

自定义抛出异常 raise TypeError(‘nothing!’)

ipmort MySQLdb
conn = MySQLdb.connect(user=’root’,passwd=”,host=’localhost’)
cur = conn.cursor? #创建游标
conn.select_db(‘数据库’)#创建链接
cur.execute(‘要执行的sql语句’) #增删改查操作
cur.fetchone()#游标指针
cur.scroll(0,16)#游标移动
cur.close()#关闭游标
conn.close()#关闭链接

#创建类
class myclass():
def fun(self):
print “the is class!”
#使用类
test = myclass()
test.fun()

#其他常用
time.strftime(‘%Y-%m-%d %H:%M:%S’,time.localtime(time.time())) #时间戳转换函数
sorted(set(qqlist),key=qqlist.index) #利用集合不可重复特性为列表去除重复值返回新列表
while True: #力图用死循环+睡眠做定时器
print time.strftime(‘%Y-%m-%d %H:%M:%S’,time.localtime(time.time()))
time.sleep(1)
re_href = re.compile(‘<\s*a[^>]*>[^<](.*?)*<\s*/\s*a\s*>’)
info = re_href.sub(domain,content,re.S)#去出超链接,替换
import HTMLParser
html_parser = HTMLParser.HTMLParser()
js = html_parser.unescape(html) #txt = ” #转为html代码
import cgi
html = cgi.escape(js) #html = ‘<javascript&gt’ #转为html实体
str.replace(‘\t’,”).replace(‘\n’,”).replace(‘ ‘,”) #去除空格,换行符,制表符
referer = re.findall(r”^http://.*?/{1}”,url,re.I)[0] #根据网址取域名
filename = url.split(‘/’)[-1] #根据网址取文件%

python编码之伤

#! -*- coding:utf-8 -*-
a=’你好’
print u”你好”

如果a是变量可以这么做
b=a.decode(“utf-8”).encode(“gbk”)

读文件会报错,这么去读:
codecs.open(“test.txt”, encoding=’gbk’).read()

Python的BeautifulSoup html解析库

今天看了下python也有一个html解析类库,这样就不用写繁琐的正则去抓内容和修改内容了。与php的simple_html_dom解析类库很相似,用法也都相似,总结了下常用的代码,记录下已备后需。

#http://beautifulsoup.readthedocs.org/zh_CN/latest/
# coding:utf-8
from bs4 import BeautifulSoup

html_doc = “””
<html><head><title>The Dormouse’s story</title></head>
<body>
<p class=”title”><b>The Dormouse’s story</b></p>

<p class=”story”>Once upon a time there were three little sisters; and their names were
<a href=”http://example.com/elsie” class=”sister” id=”link1″>Elsie</a>,
<a href=”http://example.com/lacie” class=”sister” id=”link2″>Lacie</a> and
<a href=”http://example.com/tillie” class=”sister” id=”link3″>Tillie</a>;
and they lived at the bottom of a well.</p>
“””
soup = BeautifulSoup(html_doc)
#获取html
#print soup.prettify()#格式化输出
#print soup.name

#打印title标签,贪心模式
print soup.title
#打印title标签,非贪心模式
print soup.title.string
#打印上级嵌套标签名
print soup.body.parent.name
#打印段落p标签和标签选择器
print soup.p
print soup.p[‘class’]
print soup.body.p
#超链接相关操作
print soup.a #获取第一个超链接
print soup.find_all(‘a’) #h获取所有超链接
print soup.find(id=”link3″) #超早id为link3返回
print soup.find(“a”, id=”link3″) #匹配id=link3的超链接
print soup.find_all([“a”, “b”]) #多个匹配内推
print soup.find_all(“a”, limit=2)#控制返回链接数
#从文档中找到所有<a>标签的链接
for link in soup.find_all(‘a’):
print(link.get(‘href’))
#从文档中获取所有内容,去掉html标签
print(soup.get_text())
#将body的子节点以列表的方式输出
head_tag = soup.body
print head_tag.contents
#对子节点循环
for child in head_tag.children:
print(child)
#查找所有a标签
print soup.find_all(‘a’)
#按css搜索
print soup.find_all(“a”, class_=”sister”)
print soup.select(“body a”)
#搜索节点
soup.html.find_all(“title”)#子孙节点
soup.html.find_all(“title”, recursive=False)#子节点
#find_all() 方法的返回结果是值包含一个元素的列表,而 find() 方法直接返回结果

全部学习文档URL:http://beautifulsoup.readthedocs.org/zh_CN/latest/
url是一个文档托管中心哦,看起来蛮不错的,以后有合适的文档可以用来托管,收藏了。

Python模拟登陆dede cms后台遇到的问题

网上好多Python模拟登陆网站的源码,今天捣腾了一天时间,全部用了个遍,无奈没有一个可以直接用的,关键是dede的登陆流程没有分析好,开始发现浏览器cookies的sessonid是一直不变的,不论登陆或注销状态都是一样的,估计在服务端的session对应的每次会记录变化,不会每次在cookies更新session标识,而用python访问生成的cookies,如果程序不结束,一直输出cookies中的sessionid也都是一样的,如果程序关闭了,则访问一次在cookies中的sessionid会变化一次,看到博客园也有人遇到过这问题,最终还是在客户端session标识的问题在纠结,尝试用浏览器登陆后在cookies中取出sessionid,然后用python获取登陆后的页面是正常获取的,在python中用下面代码跟踪cookies,一直是失败。

#获得一个cookieJar实例
cj = cookielib.LWPCookieJar()
#cookieJar作为参数,获得一个opener的实例
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

压根没用过urllib和urllib2这两个库,一直在调试sessionid的问题,最后发现是cookies问题,网上的代码适合直接提交表单,如果没有访问页面直接提交表单的,就不行了,今天一天折腾了这一个问题,像dedecms这种需要先访问页面,然后就会有cookies标识了,和浏览器的操作是同步的就没有问题了。最后用requests库自己写了一个模拟dedecms登陆的小程序,源码如下:

#!/usr/bin/python
#coding:utf8
import requests
login_url = "http://021soft.net/login/login.php"
header = {?? ?"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
"Referer"?? ?:"http://021soft.net/md5/login.php"
}
postdata = {
'userid' : 'test',
'pwd'??? : 'test',
'dopost' : 'login'
}
s = requests.session()#带着sessionid访问,保存登陆状态
loadcookies = s.get(login_url,headers = header) #理解为要先打开网页才能提交表单,先给cookies赋值
post_html = s.post(login_url,data = postdata,headers = header)
print post_html.content
#http://021soft.net/md5/content_list.php?channelid=1
get_html = s.get('http://021soft.net/md5/content_list.php?channelid=1',headers = header)
print get_html.content

标红的为解决问题的部分,过程中把dede的登陆模块都去掉了,php打印数据等等,终于找出问题所在了。下面是利用浏览器登陆后取得cookies中的sessionid登陆访问测试代码:

# coding:utf8
import urllib2,cookielib
import re

cj = cookielib.LWPCookieJar()
cookie_support = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
login_url='http://021soft.net/md5/index.php'
headers = {'cookie':"PHPSESSID=4c1a5105cdc543d6dba394c39932cf59;"}
html=urllib2.urlopen(urllib2.Request(url=login_url,headers=headers)).read()
print html

dedecms经过抓包研究,只需要提交三个字段就好了dopost、userid、pwd其他的隐藏域可以不提交,抓包挨个去掉测试,是否影响登陆。

Python发邮件代码

#!/usr/bin/env python2.7
#coding: utf-8
import smtplib
from email.mime.text import MIMEText
sender = 'longyunaihui@163.com'  #发送邮箱地址
receiver = '610358898@qq.com'    #接受邮箱地址
subject = 'python email test'    #发送邮件标题
smtpserver = 'smtp.163.com'      #邮局服务器
username = 'longyunaihui'        #用户名
password = '*********'           #密码
msg = MIMEText('<html><h1>hello world</h1></html>','html','utf-8')
msg['Subject'] = subject
smtp = smtplib.SMTP()
smtp.connect('smtp.163.com')
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()

本文代码来自:http://www.cnblogs.com/lonelycatcher/archive/2012/02/09/2343463.html 增加了注释。

Python爬取乌云漏洞库Demo

#print (‘Hello World!’ )
# coding:utf-8
import re,sys,requests
reload(sys)
sys.setdefaultencoding( “utf-8” )
#要设置RAW字段才能成功抓取到内容
wuyun_headers={‘User-Agent’:’Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36′}
html = requests.get(‘http://www.wooyun.org/bugs/new_submit/’,headers=wuyun_headers)
#html = requests.get(‘http://www.0535code.com’,headers=wuyun_headers)
#print html.text
#抓取漏洞列表
# body = re.findall(‘<td>(.*?)</td>’,html.text,re.S)
# for each in body:
#??? print each
#抓取链接列表
# body = re.findall(‘<a(.*?)</a>’,html.text,re.S)
# for each in body:
#??? print each
#循环取div块里面的超链接A
# text_fied = re.findall(‘<table class=”listTable”>(.*?)</table>’,html.text,re.S)[0]
# text_the = re.findall(‘<a(.*?)</a>’,text_fied,re.S)
# for each in text_the:
#??? print each
#sub翻页代码
# new_submit_url = “http://www.wooyun.org/bugs/new_unclaimed/page/1” #第一页
# total_page = 26 #最大页数
# for i in range(1,total_page+1):
#???? new_link = re.sub(‘page/\d+’,’page/%d’%i,new_submit_url,re.S)
#???? print new_link
#组合使用
new_submit_url = “http://www.wooyun.org/bugs/new_unclaimed/page/1” #列表起始URL
total_page = 26 #最大页数
#循环SUB函数分页抓取
for i in range(1,total_page+1):
new_link = re.sub(‘page/\d+’,’page/%d’%i,new_submit_url,re.S)
#print new_link 调试URL显示
html = requests.get(new_link,headers=wuyun_headers).text #获取URL源码
text_fied = re.findall(‘<table class=”listTable”>(.*?)</table>’,html,re.S) #获取源码中块区域
#调试获取到的html区域块
# print i
# for echo in text_fied:
#???? print echo
#获取块源码中的超链接A
for text_href in text_fied:
text_the = re.findall(‘<td>(.*?)</td>’,text_href,re.S)
#调试提取到的超链接,显示所在分页,并写入文件list.txt
for each in text_the:
print i,(each.strip()) # 需要引入sys库,调用strip去掉输出的换行符
f = open(“list.txt”, “a+”)
f.write(each)
f.close()
#用键词数据库去匹配 查找 a链接。
#http://www.wooyun.org/bugs/new_submit/ 最新提交 http://www.wooyun.org/bugs/new_unclaimed/page/1* 目前26页
#http://www.wooyun.org/bugs/new_confirm/ 最新确认
#http://www.wooyun.org/bugs/new_public/ 最新公开
#http://www.wooyun.org/bugs/new_alarm/? 漏洞预警
#http://www.wooyun.org/bugs/new_unclaimed/ 等待认领
计算了下11行就实现了分页抓取URL,确实是比PHP方便,phphtml解析类比python正则还要复杂一些。

PHP和Python获取网页源代码区别

学习Python用requests库去获取我的网站源代码,获取到的居然是加速乐的防御代码,因为我用加速乐的CDN,然后获取了下乌云网站的,获取乌云的是一片空白,什么都没有,难道Python这么弱么,然后用php获取,php都可以获取到,而且比python代码少,只是Python可以常住内存,PHP就不行了。

php获取页面源代码方法:

$re = file_get_contents('http://www.0535code.com/');
var_dump($re);

Python页面源代码方法:

# coding:utf-8
import requests
html = requests.get('http://www.0535code.com')
print html.text

Python获取页面源代码比php多呢, 要php的一倍。然后这样还不行,像加速乐,乌云了,这类安全网站都获取不到,普通网站python用上面的代码能获取到,然后研究了下,是上面的代码不完整所以获取不到一些网站的源代码,要带上访问的一些信息才行。完整的Python代码如下:

# coding:utf-8
import re,requests
#要设置RAW字段才能成功抓取到内容
wuyun_headers={'User-Agent':'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/23.0.2211.251 Safari/537.36'}
html = requests.get('http://www.0535code.com',headers=wuyun_headers)
print html.text

因为php用file_get_contents函数,默认会有代理信息一起提交请求,而用python就不会自动提交,要配置下才行。
headers的信息,通过浏览器审查元素中的网络选项,随便找一个链接,可以看到请求头信息RAW。
 

不同平台下Python第三方库Request安装

Centos平台下安装:

wget “https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5=834b2904f92d46aaa333267fb1c922bb” –no-check-certificate
#下载pip安装包
tar -xzvf pip-1.5.4.tar.gz
cd pip-1.5.4
python setup.py install

#直接安装pip会报错提示 ImportError: No module named setuptools
#然后需要安装setuptools,如下:

wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz
tar zxvf setuptools-0.6c11.tar.gz
cd setuptools-0.6c11
python setup.py build
python setup.py install

#这样就安装好了pip了,最后再pip install requests
pip install requests

#Downloading/unpacking requests
#? Downloading requests-2.9.1-py2.py3-none-any.whl (501kB): 501kB downloaded
#Installing collected packages: requests
#Successfully installed requests
#Cleaning up…

WIN7平台下安装:
先在Python环境下输入
from urllib import urlopen
data = urlopen(‘http://peak.telecommunity.com/dist/ez_setup.py’)
open(‘ez_setup.py’,’wb’).write(data.read())
exit

python2.7目录下会有下载的ez_setup.py文件,在python环境中执行python ez_setup.py就可以安装成功easy_install了,才能安装pip。
easy_install在目录C:\Python27\Scripts 下面, cd C:\Python27\Scripts,进入该目录。
运行 easy_inatall.exe pip 就安装好了pip。
验证pip在dos下输入 pip会列出相应的参数列表。其次就是用 pip install requests 命令安装了,我试了一直出问题。好像是因为ASCII码问题,没研究,百度找了另外一种方法。

先下载requests包? https://github.com/kennethreitz/requests
解压下载的zip包,进入有setup.py 的目录,然后执行 python setup.py install
最后进入python用import requests测试是否安装成功了。

#升级Requests库
pip install –upgrade requests