开发工具:sublime text 编译:ctrl+b
#一、特点
简单:Python是一种代表简单主义思想的语言。
速度快:Python 的底层是用 C 语言写的,很多标准库和第三方库也都是用 C 写的,运行速度非常快。
规范的代码:Python采用强制缩进的方式使得代码具有较好可读性。而Python语言写的程序不需要编译成二进制代码。
免费、开源、解释性、丰富的库。
#二、应用
数学处理:NumPy扩展提供大量与许多标准数学库的接口。
文本处理:python提供的re模块能支持正则表达式。
网络编程:提供丰富的模块支持sockets编程。
#三、语法
控制语句:
if语句、for语句、while语句、try语句、class语句、def语句、pass语句、in语句、raise语句、import语句、from import语句、import as语句。
表达式:
Python使用and, or, not表示逻辑运算。is, is not用于比较两个变量是否是同一个对象。in, not in用于判断一个对象是否属于另外一个对象。Python使用lambda表示匿名函数。
类型
数字【int】、字符串str、列表list[ ]、元组tuple( )、字典dist{ }、文件file。
执行:Python在执行时,首先会将.py文件中的源代码编译成Python的byte code(字节码),然后再由Python Virtual Machine(Python虚拟机)来执行这些编译好的byte code。
#四、函数库
文本处理:包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能
文件处理:包含文件操作、创建临时文件、文件压缩与归档、操作配置文件等功能
操作系统功能:包含线程与进程支持、IO复用、日期与时间处理、调用系统函数、写日记(logging)等功能
网络通信:包含网络套接字,SSL加密通信、异步网络通信等功能
网络协议:支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多种网络协议,并提供了编写网络服务器的框架
W3C格式支持:包含HTML,SGML,XML的处理。
其它功能:包括国际化支持、数学运算、HASH、Tkinter等。
常用第三方包:os、sys、urllib、urllib2、httplib、http….
#五、工具功能
MySQLdb:用于连接MySQL数据库。
PyOpenCL:OpenCL的Python接口,通过该模块可以使用GPU实现并行计算。
PyMedia:用于多媒体操作的python模块。
wxPython:GUI编程框架。
#六、Python模块/包
Python模块安装
1. 单文件模块:直接把文件拷贝到$python_dir/lib
2. 多文件模块,带setup.py python setup.py install
3. easy_install 方式
先下载ez_setup.py,运行python ez_setup 进行easy_install工具的安装,之后就可以使用easy_install进行安装package了。
easy_install packageName
easy_install package.egg
4. pip 方式
先进行pip工具的安裝:easy_install pip(pip 可以通过easy_install 安裝,而且也会装到 Scripts 文件夹下。)
安裝:pip install PackageName
更新:pip install -U PackageName
移除:pip uninstall PackageName
搜索:pip search PackageName
from package import module as mymodule 命令时,Python解释器会查找package这个包的module模块,并将该模块作为mymodule引入到当前的工作空间。
Python包管理:distutils/setuptools/pip
**#
七、例子**
1.抓取页面图片
import urllib
import re
def getHtml(url):
return urllib.urlopen(url).read()
def getImg(html):
reg = r'src="(http://imgsrc\.baidu\.com.+?.jpg)"'
pattern = re.compile(reg)
img_list = re.findall(pattern, html)
return img_list
img_list = getImg(getHtml('http://tieba.baidu.com/p/3049733850'))
for i in range(0, 3):
urllib.urlretrieve(img_list[i], str(i) + '.jpg')
2.操作浏览器
import time
import os
import webbrowser as web
import random
count =random.randint(1,2)
j=0
while j<count:
i=0
while i<5:
web.open_new_tab('http://blog.sina.com.cn/s/blog_4900fe270102wdlo.html?tj=1')
i=i+1
time.sleep(1)
else :
os.system('taskkill /F /IM 360se.exe')
print j,'times closed 360se'
j=j+1
else :
print 'ending'
3.BeautifulSoup
#coding:utf-8
import urllib
import os
import chardet
from bs4 import BeautifulSoup
#url='http://www.163.com'
#url='http://blog.sina.com.cn/twocold'
url='http://tieba.baidu.com/p/2772656630'
html=urllib.urlopen(url)
#print html.read().decode("utf-8",'ignore').encode("gbk")
#print html.info()
#print html.getcode()
#Surllib.urlretrieve(url,'txt.txt',callback)
con=html.read()
soup=BeautifulSoup(con)
txt=soup.find_all('img',class_="BDE_Image")
print len(txt)
for img in txt:
print img['src']
4.urllib2
#coding:utf-8
#import urllib
url='http://www.csdn.net/article/2015-1106/2826137'
#html= urllib.urlopen(url).read()
#print html.getcode()
#urllib2:代理IP+虚构请求头
import urllib2
myheaders={
'Host':'blog.csdn.net',
'Referer':'http://blog.csdn.net/',
'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36',
'GET':url
}
req=urllib2.Request(url,headers=myheaders)
html= urllib2.urlopen(req)
print html.read()
5.MySQLdb
import MySQLdb
conn=MySQLdb.connect(user='root',passwd='mysql',host='localhost')
cur=conn.cursor()
conn.select_db('python')
sql="insert into t_user(email,nickname,password,username) value(%s,%s,%s,%s)"
cur.execute(sql,('111@a.com','nick','123','333'))
print cur.fetchmany(cur.execute("select * from t_user"))
conn.commit()
print cur.fetchmany(cur.execute("select * from t_user"))
cur.close()
conn.close()
6.糗事百科
#coding:utf-8
import urllib
import urllib2
import re
import thread
import time
import sys
#糗事百科爬虫类
class QSBK:
#初始化方法,定义一些变量
def __init__(self):
self.pageIndex = 1
self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
#初始化headers
self.headers = { 'User-Agent' : self.user_agent }
#存放段子的变量,每一个元素是每一页的段子们
self.stories = []
#存放程序是否继续运行的变量
self.enable = False
#传入某一页的索引获得页面代码
def getPage(self,pageIndex):
try:
url = 'http://www.qiushibaike.com/hot/page/' + str(pageIndex)
#构建请求的request
request = urllib2.Request(url,headers = self.headers)
#利用urlopen获取页面代码
response = urllib2.urlopen(request)
#将页面转化为UTF-8编码
pageCode = response.read().decode('utf-8')
return pageCode
except urllib2.URLError, e:
if hasattr(e,"reason"):
print u"连接糗事百科失败,错误原因",e.reason
return None
#传入某一页代码,返回本页段子列表
def getPageItems(self,pageIndex):
pageCode = self.getPage(pageIndex)
if not pageCode:
print "页面加载失败...."
return None
#item[0]是一个段子的发布者,item[1]是内容,item[2]是图片,item[3]是点赞数
pattern = re.compile('<div.*?class="author.*?>.*?<a.*?</a>.*?<a.*?title="(.*?)>.*?</a>.*?<div.*?class'+
'="content">(.*?)</div>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S)
# pattern = re.compile('<div.*?class="author.*?>.*?<a.*?</a>.*?<a.*?>(.*?)</a>.*?<div.*?class'+
# '="content".*?title="(.*?)">(.*?)</div>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S)
items = re.findall(pattern,pageCode)
#用来存储每页的段子们
pageStories = []
#遍历正则表达式匹配的信息
for item in items:
#是否含有图片
haveImg = re.search("img",item[2])
#如果不含有图片,把它加入list中
if not haveImg:
#item[0]是一个段子的发布者,item[1]是内容,item[2]是图片,item[3]是点赞数
pageStories.append([item[0].strip(),item[1].strip(),item[2].strip(),item[3].strip()])
else:
#print item[2]
reg =r'src="(.*?\.jpg)" alt="(.*?)"'
imgre=re.compile(reg)
imglist=re.findall(imgre,item[2])
#print imglist
if imglist:
#print imglist[0][0],imglist[0][1]
name="D:\Python27\\test\qsbkimg\\"+imglist[0][1]+".jpg"
urllib.urlretrieve(imglist[0][0],name)
pageStories.append([item[0].strip(),item[1].strip(),imglist[0][1],item[3].strip()])
f=file("qsbk.txt",'a+')
x=1
reload(sys)
sys.setdefaultencoding('utf-8')
for story in pageStories:
con="条数:"+str(x)+"\n"+"作者:"+story[0]+"\n"+"内容:"+story[1]+"\n"+"图片:"+story[2]+"\n"+"点赞数:"+story[3]+"\n"
f.write(con)
x=x+1
f.close()
return pageStories
#加载并提取页面的内容,加入到列表中
def loadPage(self):
#如果当前未看的页数少于2页,则加载新一页
if self.enable == True:
if len(self.stories) < 2:
#获取新一页
pageStories = self.getPageItems(self.pageIndex)
#将该页的段子存放到全局list中
if pageStories:
self.stories.append(pageStories)
#获取完之后页码索引加一,表示下次读取下一页
self.pageIndex += 1
#调用该方法,每次敲回车打印输出一个段子
def getOneStory(self,pageStories,page):
#遍历一页的段子
for story in pageStories:
#等待用户输入
input = raw_input()
#每当输入回车一次,判断一下是否要加载新页面
self.loadPage()
#如果输入Q则程序结束
if input == "Q":
self.enable = False
return
print u"第%d页\t发布人:%s\t发布内容:%s\n图片%s\n赞:%s\n" %(page,story[0],story[1],story[2],story[3])
#开始方法
def start(self):
print u"正在读取糗事百科,按回车查看新段子,Q退出"
#使变量为True,程序可以正常运行
self.enable = True
#先加载一页内容
self.loadPage()
#局部变量,控制当前读到了第几页
global nowPage
nowPage = 0
while self.enable:
if len(self.stories)>0:
#从全局list中获取一页的段子
pageStories = self.stories[0]
#当前读到的页数加一
nowPage += 1
#将全局list中第一个元素删除,因为已经取出
del self.stories[0]
#输出该页的段子
self.getOneStory(pageStories,nowPage)
spider = QSBK()
spider.start()
7.代理IP
#coding:utf-8
import urllib2
import re
import sys
import threading
import time
#url="http://www.kuaidaili.com" 免费代理IP
def getproxy():
p=re.compile(r'''<tr>
<td>(.+?)</td>
<td>(.+?)</td>
<td>(.+?)</td>
<td>(.+?)</td>
<td>(.+?)</td>
<td>(.+?)</td>
<td>(.+?)</td>
<td>(.+?)</td>
</tr>''')
global matchs
for i in range(1,3):
target =r'http://www.kuaidaili.com/proxylist/%d' %i
print target
req=urllib2.urlopen(target)
res= req.read()
matchs=p.findall(res)
#print matchs
class ProxyCheck(threading.Thread):
def __init__(self,proxylist,fname):
threading.Thread.__init__(self)
self.proxylist=proxylist
self.timeout=5
self.testurl='http://www.baidu.com/'
self.teststr='030173'
self.checkproxylist=[]
self.fname=fname
def checkProxy(self):
cookies=urllib2.HTTPCookieProcessor()
for proxy in self.proxylist:
#print proxy
hander=urllib2.ProxyHandler({"http":r'http://%s:%s'%(proxy[0],proxy[1]) })
opener=urllib2.build_opener(cookies,hander)
urllib2.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36')]
t1=time.time()
try:
req=urllib2.urlopen(self.testurl,timeout=self.timeout)
result=req.read()
#print result
timeused=time.time()-t1
pos=result.find(self.testurl)
if pos>1:
self.checkproxylist.append((proxy[0],proxy[1],proxy[2],proxy[3],timeused))
else:
continue
except Exception,e:
print e.message
continue
def sort(self):
sorted(self.checkproxylist,cmp=lambda x,y:cmp(x[4],y[4]))
def save(self):
f=open(self.fname,'w+')
for proxy in self.checkproxylist:
f.write("%s:%s\t%s\t%s\t%s\n"%((proxy[0],proxy[1],proxy[2],proxy[3],proxy[4])))
f.close()
def run(self):
self.checkProxy()
self.sort()
self.save()
if __name__ == '__main__':
getproxy()
t1=ProxyCheck(matchs,'t1.txt')
t1.start()