Python网络编程

2015/04/12 Python

Python网络编程

网络是一个互联网应用的重要组成部分,在Python语言中提供了大量的内置模块和第三方模块用于支持各种网络访问,这些模块主要包括客户端套接字(socket)、服务端套接字(socketserver)、用于访问HTTP/HTTPS资源的urllib3,异步网络框架twisted、用于访问ftp的ftplib、用于管理Email的poplib、smtplib和imaplib等。使用这些模块,可以非常方便地访问各种网络资源。

套接字(Socket)

套接字是用于网络通信的数据结构,英文是socket。在任何类型的通讯开始之前,都必须创建socket,可以将它们比作电话插孔,没有他就无法进行通讯。

Socket主要分为面向连接的Socket和无连接Socket。面向连接的Socket使用的主要协议是传输控制协议,也就是我们常说的TCP,TCP的Socket名称是SOCK_STREAM。无连接Socket的主要协议是用户数据报协议,也就是我们常说的UDP,UDP Socket的名字是SOCK_DGRAM。

Request模块实战

Requests 继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。

requests 的底层实现其实就是 urllib3

Requests的文档非常完备,中文文档也相当不错。Requests能完全满足当前网络的需求,支持Python 2.6—3.5,而且能在PyPy下完美运行。

安装方式

利用 pip 安装 或者利用 easy_install 都可以完成安装:

$ pip install requests
 
$ easy_install requests

基本GET请求(headers参数 和 parmas参数)

最基本的GET请求可以直接用get方法

response = requests.get("http://www.baidu.com/")
 
# 也可以这么写
# response = requests.request("get", "http://www.baidu.com/")

添加 headers 和 查询参数

如果想添加 headers,可以传入headers参数来增加请求头中的headers信息。如果要将参数放在url中传递,可以利用 params 参数。

import requests
 
kw = {'wd':'长城'}
 
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
 
# params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
response = requests.get("http://www.baidu.com/s?", params = kw, headers = headers)
 
# 查看响应内容,response.text 返回的是Unicode格式的数据
print response.text
 
# 查看响应内容,response.content返回的字节流数据
print response.content
 
# 查看完整url地址
print response.url
 
# 查看响应头部字符编码
print response.encoding
 
# 查看响应码
print response.status_code

基本POST请求(data参数)

最基本的POST请求可以直接用post方法

response = requests.post("http://www.baidu.com/", data = data)

传入data数据

对于 POST 请求来说,我们一般需要为它增加一些参数。那么最基本的传参方法可以利用 data 这个参数。

import requests
 
formdata = {
    "type":"AUTO",
    "i":"i love python",
    "doctype":"json",
    "xmlVersion":"1.8",
    "keyfrom":"fanyi.web",
    "ue":"UTF-8",
    "action":"FY_BY_ENTER",
    "typoResult":"true"
}
 
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"
 
headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
 
response = requests.post(url, data = formdata, headers = headers)
 
print response.text
 
# 如果是json文件可以直接显示
print response.json()

代理(proxies参数)

如果需要使用代理,你可以通过为任意请求方法提供 proxies 参数来配置单个请求:

import requests
 
# 根据协议类型,选择不同的代理
proxies = {
  "http": "http://12.34.56.79:9527",
  "https": "http://12.34.56.79:9527",
}
 
response = requests.get("http://www.baidu.com", proxies = proxies)
print response.text

也可以通过本地环境变量 HTTP_PROXY 和 HTTPS_PROXY 来配置代理:

export HTTP_PROXY="http://12.34.56.79:9527"
export HTTPS_PROXY="https://12.34.56.79:9527"

Search

    微信好友

    博士的沙漏

    Table of Contents