requests模块

request说明

虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “HTTP for Humans”,说明使用更简洁方便。

Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用:)

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

1.发送请求

import requests
url = 'http://www.baidu.org'
r = requests.get(url)
print(r.status_code) #获取返回状态
print(r.text)

 

说明:其他方式的请求格式一致

requests.get(url)  #get请求

requests.post(url)  #post请求

requests.put(url)  #put请求

requests.delete(url)  #delete请求

requests.head(url)  #head请求

requests.option(url)  #get请求

ps:以上的http请求,对于web系统一般只支持get和post,还有一些支持head

2. 传递参数

若http请求时带参数,那么就需要将参数加入到payload字典中,如下。

import requests
url = 'http://www.baidu.org'
payload  = {'name':'jsan'}
r = requests.get(url,params= payload)
print(r.status_code) #获取返回状态
print(r.text)

 

3.post请求发送数据

除了get请求外,有时还需要发送一些编码为表单形式的数据。比如在登录的时候请求就为post。若要实现post的请求,只需要简单的传递一个字典给requests中的data参数,这样这个数据字典就会在发出请求的时候自动编码为表单形式。

import requests,json
url = 'http://www.baidu.org'
payload  = {'name':'jsan'}
r = requests.get(url,data = json.dumps(payload))
print(r.status_code) #获取返回状态
print(r.text)

 

 

4.定制请求头

如果想为请求添加http头部,只需要传一个字典给header就行了。

import requests,json
url = 'http://httpbin.org/post'
headers  = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36'}
r = requests.get(url,data = json.dumps({'dt':'data'}),headers = headers)
print(r.status_code) #获取返回状态
print(r.text)

 

 

5. 代理(proxies参数)

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

import requests

# 根据协议类型,选择不同的代理
proxies = {
  "http": "http://12.34.56.79:9527",
  "https": "http://12.34.56.79:9527",
}

response = requests.get("https://www.baidu.com", proxies = proxies)
print(response.text)

 

6.web客户端验证

如果是Web客户端验证,需要添加 auth = (账户名, 密码)

import requests
from requests.auth import HTTPBasicAuth
r = requests.get(url,auth = HTTPBasicAuth('user','password'))
r = requests.get(url,auth=('user','password'))  #简写

 

 

7.cookie与响应对象

(1)一个响应中包含有一些cookie,可快速访问他们

import requests
response = requests.get("http://www.baidu.com/")
#返回CookieJar对象
cookiejar = response.cookies
# 8. 将CookieJar转为字典:
cookiedict = requests.utils.dict_from_cookiejar(cookiejar)
print(cookiejar)
print(cookiedict)

(2)将自身的cookie发送到服务器,用cookie参数

import requests
response = requests.get("http://www.baidu.com/")
#自身的cookie数据
cookiejar = {}
r = requests.get(url='http://www.baidu.com',cookie = cookiejar)

 

8.sission

在 requests 里,session对象是一个非常常用的对象,这个对象代表一次用户会话:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开。

会话能让我们在跨请求时候保持某些参数,比如在同一个 Session 实例发出的所有请求之间保持 cookie 。

实现人人网登录
import requests
# 1. 创建session对象,可以保存Cookie值
ssion = requests.session()
# 2. 处理 headers
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"}
# 3. 需要登录的用户名和密码
data = {"email":"mr_mao_hacker@163.com", "password":"alarmchime"}
# 4. 发送附带用户名和密码的请求,并获取登录后的Cookie值,保存在ssion里
ssion.post("http://www.renren.com/PLogin.do", data = data)
# 5. ssion包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面
response = ssion.get("http://www.renren.com/410043129/profile")
# 6. 打印响应内容
print(response.text)

 

9.requests爬虫实践

实践的目的是获取豆瓣电影top250所有电影名称。

网页的地址为:https://movie.douban.com/top250

import requests
from bs4 import BeautifulSoup

def get_movies():
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36',
        'Host': 'movie.douban.com'
   
}
    movies_list = []
    j  = 0
    for i in range(0,10):
        url = 'https://movie.douban.com/top250?start=' + str(i * 25)
        r = requests.get(url,headers = headers,timeout = 10)
        # print(str(i),r.status_code)
       
soup = BeautifulSoup(r.text,'lxml')
        div_list = soup.find_all('div', class_ = 'hd')
        for m_list in div_list:
            china_name = m_list.a.span.text.strip()
            movies_list.append(china_name)
            j+=1
    print(j)
    return movies_list
movice = get_movies()
print(movice)

 

posted @ 2018-10-18 21:52  炫风真是风  阅读(261)  评论(0编辑  收藏  举报