首页 > 代码库 > python第三方模块精选

python第三方模块精选

python不但有着强大丰富的“内置电池”,同样的,第三方模块也是非常的多。目前收集了requests、paramiko、pymsql,以后会陆续添加:

一、requests

  Python标准库中提供了:urllib等模块以供Http请求,但是,它的 API 太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。

  利用urllib发送GET请求:

1
2
3
4
5
import urllib.request
 
 
= urllib.request.urlopen(‘http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508‘)
result = f.read().decode(‘utf-8‘)

  利用urllib发送携带请求头的GET请求

1
2
3
4
5
6
7
import urllib.request
 
req = urllib.request.Request(‘http://www.example.com/‘)
req.add_header(‘Referer‘‘http://www.python.org/‘)
= urllib.request.urlopen(req)
 
result = f.read().decode(‘utf-8‘)

注:更多见Python官方文档:https://docs.python.org/3.5/library/urllib.request.html#module-urllib.request


 

  Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。

1、安装模块

  pip3 install requests

2、使用模块

技术分享
# 1、无参数实例
 
import requests
 
ret = requests.get(‘https://github.com/timeline.json‘)
 
print(ret.url)
print(ret.text)
 
 
 
# 2、有参数实例
 
import requests
 
payload = {‘key1‘: ‘value1‘, ‘key2‘: ‘value2‘}
ret = requests.get("http://httpbin.org/get", params=payload)
 
print(ret.url)
print(ret.text)

GET请求
技术分享
# 1、基本POST实例
 
import requests
 
payload = {‘key1‘: ‘value1‘, ‘key2‘: ‘value2‘}
ret = requests.post("http://httpbin.org/post", data=http://www.mamicode.com/payload)>
技术分享
requests.get(url, params=None, **kwargs)
requests.post(url, data=http://www.mamicode.com/None, json=None, **kwargs)>

更多requests模块相关的文档见:http://cn.python-requests.org/zh_CN/latest/

3、Http请求和XML实例

实例:检测QQ账号是否在线

技术分享
import urllib
import requests
from xml.etree import ElementTree as ET

# 使用内置模块urllib发送HTTP请求,或者XML格式内容
"""
f = urllib.request.urlopen(‘http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508‘)
result = f.read().decode(‘utf-8‘)
"""


# 使用第三方模块requests发送HTTP请求,或者XML格式内容
r = requests.get(‘http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508‘)
result = r.text

# 解析XML格式内容
node = ET.XML(result)

# 获取内容
if node.text == "Y":
    print("在线")
else:
    print("离线")

实例:查看火车停靠信息

技术分享
import urllib
import requests
from xml.etree import ElementTree as ET

# 使用内置模块urllib发送HTTP请求,或者XML格式内容
"""
f = urllib.request.urlopen(‘http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=‘)
result = f.read().decode(‘utf-8‘)
"""

# 使用第三方模块requests发送HTTP请求,或者XML格式内容
r = requests.get(‘http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=‘)
result = r.text

# 解析XML格式内容
root = ET.XML(result)
for node in root.iter(‘TrainDetailInfo‘):
    print(node.find(‘TrainStation‘).text,node.find(‘StartTime‘).text,node.tag,node.attrib)

注:更多接口点击这里

4.网络小说爬虫

最后放一个利用requests写的超简单版本网络小说爬虫,请支持正版!

技术分享
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Python 3.5

"""
这不是一个全自动的智能版本,只是当你闲得无聊的时候用用。
"""
import requests
import re


def action(url):
    ret = requests.get(url)
    ret.encoding = "gbk"
    title = re.findall(r"<h1>(.+)</h1>", ret.text)
    pattern = re.compile(r"<div id=\"content\"><script>readx..;</script>&nbsp;&nbsp;&nbsp;&nbsp;(.+)</div>")
    text = pattern.findall(ret.text)
    if text:
        text = re.sub(r"<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;", "\n", text[0])
    text = "\n%s\n%s" % (title[0], text)
    next_addr = re.search(r"<a href=http://www.mamicode.com/"(\d+).html\">下一章</a>", ret.text)
    return next_addr.group(1), text


if __name__ == ‘__main__‘:
    # 找到第一章的链接地址
    url = "http://www.biquge.la/book/9352/3992880.html"
    while True:
        addr,result = action(url)
        # 懒得抓取书名,请自行修改
        with open(r"d:\book_name.txt", "a", encoding="utf8") as w:
            w.write(result)
        url = "http://www.biquge.la/book/9352/%s.html" % addr

 

二、paramiko

paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实。

大家会发现,常见的解决方法都会需要对远程服务器必要的配置,如果远程服务器只有一两台还好说,如果有N台,还需要逐台进行配置,或者需要使用代码进行以上操作时,上面的办法就不太方便了。

  使用paramiko可以很好的解决以上问题,比起前面的方法,它仅需要在本地上安装相应的软件(python以及PyCrypto),对远程服务器没有配置要求,对于连接多台服务器,进行复杂的连接操作特别有帮助。

1、下载安装

1
2
3
pycrypto,由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto
pip3 install pycrypto
pip3 install paramiko

1.1 PyCrypto安装

wget http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.6.tar.gz

tar -zxvf pycrypto-2.6.tar.gz

cd pycrypto-2.6/

python setup.py build && python setup.py install

1.2 paramiko安装

wget http://www.lag.net/paramiko/download/paramiko-1.7.7.1.tar.gz

tar xvzf paramiko-1.7.7.1.tar.gz

cd paramiko-1.7.7.1/

python setup.py build && python setup.py install

Crypto error: ‘module‘ object has no attribute ‘HAVE_DECL_MPZ_POWM_SEC‘

  测试:

python>> import paramiko

  (Crypto error: ‘module‘ object has no attribute ‘HAVE_DECL_MPZ_POWM_SEC‘

  找到 /usr/lib/python2.7/site-packages/Crypto/Util/number.py

  把if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:

  注释了

  #if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:

  )

2、模块使用

 执行命令 - 用户名+密码

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python
#coding:utf-8
 
import paramiko
 
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(‘192.168.1.108‘22‘alex‘‘123‘)
stdin, stdout, stderr = ssh.exec_command(‘df‘)
print stdout.read()
ssh.close();

执行命令 - 密钥

1
2
3
4
5
6
7
8
9
10
11
12
import paramiko
 
private_key_path = ‘/home/auto/.ssh/id_rsa‘
key = paramiko.RSAKey.from_private_key_file(private_key_path)
 
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(‘主机名 ‘, 端口, ‘用户名‘, key)
 
stdin, stdout, stderr = ssh.exec_command(‘df‘)
print stdout.read()
ssh.close()

上传或下载文件 - 用户名+密码 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import os,sys
import paramiko
 
= paramiko.Transport((‘182.92.219.86‘,22))
t.connect(username=‘wupeiqi‘,password=‘123‘)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.put(‘/tmp/test.py‘,‘/tmp/test.py‘)
t.close()
 
 
import os,sys
import paramiko
 
= paramiko.Transport((‘182.92.219.86‘,22))
t.connect(username=‘wupeiqi‘,password=‘123‘)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.get(‘/tmp/test.py‘,‘/tmp/test2.py‘)
t.close()

上传或下载文件 - 密钥 

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
import paramiko
 
pravie_key_path = ‘/home/auto/.ssh/id_rsa‘
key = paramiko.RSAKey.from_private_key_file(pravie_key_path)
 
= paramiko.Transport((‘182.92.219.86‘,22))
t.connect(username=‘wupeiqi‘,pkey=key)
 
sftp = paramiko.SFTPClient.from_transport(t)
sftp.put(‘/tmp/test3.py‘,‘/tmp/test3.py‘)
 
t.close()
 
import paramiko
 
pravie_key_path = ‘/home/auto/.ssh/id_rsa‘
key = paramiko.RSAKey.from_private_key_file(pravie_key_path)
 
= paramiko.Transport((‘182.92.219.86‘,22))
t.connect(username=‘wupeiqi‘,pkey=key)
 
sftp = paramiko.SFTPClient.from_transport(t)
sftp.get(‘/tmp/test3.py‘,‘/tmp/test4.py‘)
 
t.close()

pymsql

pymsql是Python中操作MySQL数据库的第三方模块之一,其使用方法和MySQLdb模块几乎相同。

一、下载安装:

pip3 install pymysql

二、使用

1、执行SQL

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
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
  
# 创建连接
conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘)
# 创建游标
cursor = conn.cursor()
  
# 执行SQL,并返回收影响行数
effect_row = cursor.execute("update hosts set host = ‘1.1.1.2‘")
  
# 执行SQL,并返回受影响行数
#effect_row = cursor.execute("update hosts set host = ‘1.1.1.2‘ where nid > %s", (1,))
  
# 执行SQL,并返回受影响行数
#effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
  
  
# 提交,不然无法保存新建或者修改的数据
conn.commit()
  
# 关闭游标
cursor.close()
# 关闭连接
conn.close()

2、获取新创建数据自增ID 

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
  
conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘)
cursor = conn.cursor()
cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
conn.commit()
cursor.close()
conn.close()
  
# 获取最新自增ID
new_id = cursor.lastrowid

3、获取查询数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
  
conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘)
cursor = conn.cursor()
cursor.execute("select * from hosts")
  
# 获取第一行数据
row_1 = cursor.fetchone()
  
# 获取前n行数据
# row_2 = cursor.fetchmany(3)
# 获取所有数据
# row_3 = cursor.fetchall()
  
conn.commit()
cursor.close()
conn.close()

注:在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:

  • cursor.scroll(1,mode=‘relative‘)  # 相对当前位置移动
  • cursor.scroll(2,mode=‘absolute‘) # 相对绝对位置移动

4、fetch数据类型

  默认获取的数据是元组类型,如果想要自动将数据转换成字典类型,可以在游标定义式进行参数设定,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
  
conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘)
  
# 游标设置为字典类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
r = cursor.execute("call p1()")
  
result = cursor.fetchone()
  
conn.commit()
cursor.close()
conn.close()

  

python第三方模块精选