首先就不介绍怎么取下载requests库了,这篇文章就是如何介绍怎么去应用,主要针对小白
python中提供了urllib、urllib2的方法,为什么还是要requests库,那是因为前者的API接口太差,说白了就是发一个简单的请求,需要写大量的代码(如下)
import urllib2
import json
import cookielib
def urllib2_request(url, method="GET", cookie="", headers={}, data=None):
"""
:param url: 要请求的url
:param cookie: 请求方式,GET、POST、DELETE、PUT..
:param cookie: 要传入的cookie,cookie= 'k1=v1;k1=v2'
:param headers: 发送数据时携带的请求头,headers = {'ContentType':'application/json; charset=UTF-8'}
:param data: 要发送的数据GET方式需要传入参数,data={'d1': 'v1'}
:return: 返回元祖,响应的字符串内容 和 cookiejar对象
对于cookiejar对象,可以使用for循环访问:
for item in cookiejar:
print item.name,item.value
"""
if data:
data = json.dumps(data)
cookie_jar = cookielib.CookieJar()
handler = urllib2.HTTPCookieProcessor(cookie_jar)
opener = urllib2.build_opener(handler)
opener.addheaders.append(['Cookie', 'k1=v1;k1=v2'])
request = urllib2.Request(url=url, data=data, headers=headers)
request.get_method = lambda: method
response = opener.open(request)
origin = response.read()
return origin, cookie_jar
# GET
result = urllib2_request('http://127.0.0.1:8001/index/', method="GET")
# POST
result = urllib2_request('http://127.0.0.1:8001/index/', method="POST", data= {'k1': 'v1'})
# PUT
result = urllib2_request('http://127.0.0.1:8001/index/', method="PUT", data= {'k1': 'v1'})
上面就是应用前者的来发送请求,是不是体验感太差啦,那么requests就是将python内置的模块高度封装,从而可以让我们更加美好的可以应用它。如果用requests想要达到上面的需求,只要如下写法:
import requests
# GET
result = requests.request('http://127.0.0.1:8001/index/', method="GET")
#或者
result = requests.get('http://127.0.0.1:8001/index/')
# POST
result = requests.request('http://127.0.0.1:8001/index/', method="POST", data= {'k1': 'v1'})
#或者
result = requests.post('http://127.0.0.1:8001/index/',data= {'k1': 'v1'})
# PUT
result = requests.request('http://127.0.0.1:8001/index/', method="PUT", data= {'k1': 'v1'})
#或者
result = requests.put('http://127.0.0.1:8001/index/', data= {'k1':'v1'})
是的没有看错就是这个简单,你不经会问requests有多少重方法,其实有很多,如下:
import requests
requests.get(url, params=None, **kwargs)
requests.post(url, data=None, json=None, **kwargs)
requests.put(url, data=None, **kwargs)
requests.head(url, **kwargs)
requests.delete(url, **kwargs)
requests.patch(url, data=None, **kwargs)
requests.options(url, **kwargs)
# 以上方法均是在此方法的基础上构建
requests.request(method, url, **kwargs)
我们常用的就是get和post,那么我就以这两个为例。首先get中的参数post中都有,那么我们就以post为例!
url:就是你要请求的url,参数类型字符串
headers:就是设置请求头,参数类型字典
cookies:就是设置请求的cookies值,参数类型字典
params:就是给这个url重新设定,参数类型字典,如:
requests.post(
url='http://www.baidu.com',
params={'k1':'v1','k2':'v2'},
)
#那么访问的地址就会变成http://www.baidu.com?k1=v1&k2=v2
data:就是给这个请求设置请求体,就是/r/n/r/n后面的内容,参数类型字典
requests.request(
url=http://www.baidu.com,
mathod='Post'
data={'k1':'v1'}
)
那么发过去的内容就是:GET/index http1.1\r\n...\r\nhonst:http://www.baidu.com\r\n\r\nk1=v1
json:也是发送请求体,但是格式和data是有区别的,会在请求头中加入一个Content-Type:appcation/json,告诉服务器发送的请求体是一个json数据,注意解析!(比较人性化)
requests.request(
url=http://www.baidu.com,
mathod='Post'
json={'k1':'v1'}
)
那么发过去的内容就是:GET/index http1.1\r\n...\r\nhonst:http://www.baidu.com\r\nContent-Type:appcation/json\r\n\r\n{'k1':'v1'}
proxies:代理用的
代理:就是怕服务器发现自己是一个爬虫,用一个代理的IP来访问这个网站,就算封IP也不是自己的!
#代理用法:
proxy_dict = {
'http':'72.35.58.234:8888',#举例ip瞎写的
'https':'23.44.55.66:8888'
}
#如果访问http类型的网站,那么就会用第一个代理ip
#如果访问https类型的网站,那么就会用第二个代理ip
#当然你也可以这样用如下:
'''
proxy_dict = {
'http://www.baidu.com':'72.35.58.234:8888',#举例ip瞎写的
'https':'23.44.55.66:8888'
}
'''
#上面这个的意思就是当访问百度这个网站时,指定应用后面的ip
res = requests.request('https://www.weibo.com', proxies=proxy_dict)
想要用代理就要代价,那么代理不是随便用的,有些好的代理需要账号和密码,那么我们就要将用户名和密码发给 代理服务器才可以!(如下)
import requests
from requests.auth import HTTPProxyAuth
proxyDict = {
'http':'77.75.105.165',
'https':'77.75.105.165'
}
auth = HTTPProxyAuth('写入用户名','写入密码')
res = requests.get(url='http://www.baidu.com',proxies=proxyDict, auth=auth)
'''
那么上面访问的网站是不需要登入,如果我现在需要代理访问的网站也是需要登入密码的怎么办(如下)
res = requests.get(url='http://www.baidu.com',data={'网站的登入用户名':'网站的登入密码'}, proxies=proxyDict, auth=auth)
'''
auth:认证
不知道你有没有遇到过这样一种用户名的登入方式,再html源码中你是找不到input框来输入用户名和密码的,其实这种是你的浏览器发出来的弹框,其实这种是将你的用户名和密码以一种请求头的方式(可以模拟登入路由器),发送给了服务器,才实现了用户的登入,我现在是说的这种登入方式!(前面也讲的是代理认证)代码发送如下
from requests.auth import HTTPBasicAuth,HTTPSigestAuth
res = requests.get('请求地址', auth=HTTPBasicAuth('用户名', '密码'))
'''
首先我们要将我们的用户名和密码拿到手进行base64进行加密
name_password = b64encode(b'用户名:密码')
之后字符串拼接
param = 'Basic {}'.format(name_password)
再然后放到请求头中:
Authorization:paramd
注意:
这种事情是浏览器给你弄了一个弹窗,才会有以上的操作!
'''
files:是专门文件上传用的
file_dict = {
'f1':open('text.txt', 'r') #如果你想你上传的文件重新命名就可以'f1'('新的名字',open('text.txt', 'r'))}
}
res = requests.request(url='...', mathod='POST', files=fil_dict)
timeout:访问超时的设置,参数类型数字或元祖
#与服务器建立连接超过5秒就放弃
res = requests.post(url='http://www.baidu.com', timeout=5)
#与服务器建立连接超过3秒或返回数据超过1秒就放弃
res = requests.post(url='http://www.baidu.com', timeout=(3, 1))
allow_redirects:是否允许重定向,如果允许就True,否则False
verify:是否验证SSL证书。还可以提供CA_BUNDLE路径。默认为True(用的非常少)
stream:是否支持大文件下载,如果为False,那么文件会立即下载,那么就会保存到我们的内存里,如果这个文件很大,超过我们的内存,那么我们就要将这个参数改成True,这样就会一点一点下载
cert:如果字符串,则路径到ssl客户机证书文件(.pem)。如果Tuple ('证书路径', '证书密钥')
requests.Session()的用法
import requests
from bs4 import BeautifulSoup
url = "http://www.v2ex.com/signin"
UA = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.13 Safari/537.36"
header = { "User-Agent" : UA,
"Referer": "http://www.v2ex.com/signin"
}
#首先创建一个session对象
v2ex_session = requests.Session()
#访问相应的网站
f = v2ex_session.get(url,headers=header)
#爬去用户信息
soup = BeautifulSoup(f.content,"html.parser")
once = soup.find('input',{'name':'once'})['value']
print(once)
postData = { 'u': 'whatbeg',
'p': '*****',
'once': once,
'next': '/'
}
#将爬取的用户信息,然后去访问网站,这个时候会有一个cookies,然后v2ex_session对象会将这cookie
#保存起来,方便用这个新的cookie去再次访问网站
v2ex_session.post(url,
data = postData,
headers = header)
#用新的cookie去访问这个网站,返回数据
f = v2ex_session.get('http://www.v2ex.com/settings',headers=header)
print(f.content.decode())