爬虫------requests高级

Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。
Python3中安装利用 pip3 完成安装:pip3 install requests

params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不用urlencode()

Requests(params={}传参数自动url编码,data post传参,proxies={"http":"127"}代理)

如果我们想跳过 12306 的证书验证,把 verify 设置为 False 就可以正常请求了。

requests库发送请求将网页内容下载下来以后,并不会执行js代码,这需要我们自己分析目标站点然后发起新的request请求

建议在正式学习requests前,先熟悉下HTTP协议: http://www.cnblogs.com/linhaifeng/p/6266327.html

取消requests 警告错误:  requests.packages.urllib3.disable_warnings()

基于GET请求:

headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36', }

response = requests.get("http://www.baidu.com/s?", params = kw, headers = headers)

 添加 headers 和 查询参数
如果想添加 headers,可以传入headers参数来增加请求头中的headers信息。如果要将参数放在url中传递,可以利用 params (参数自动帮我们汉字urlencode编码)。

#如果查询关键词是中文或者有其他特殊符号,则不得不进行url编码 from urllib.parse import urlencode wd='egon老师' encode_res=urlencode({'k':wd},encoding='utf-8')

keyword=encode_res.split('=')[1] 

# 然后拼接成url url='https://www.baidu.com/s?wd=%s&pn=1' %keyword

响应Response
# 查看响应内容,response.text 返回的是解码后数据
print(response.text)
# 查看响应内容,response.content返回的字节流数据(二进制)
print(response.content)
# 查看完整url地址
print(response.url)
# 查看响应头部字符编码
print(response.encoding)
# 查看响应码
print(response.status_code)

print(respone.headers)

print(respone.cookies)

print(respone.cookies.get_dict())

print(respone.cookies.items())

print(respone.history) 页面跳转后history可以看到跳转之前的页面

解析json

res2=response.json() #直接获取json数据

指定allow_redirects=False,则响应头中即便出现Location也不会跳转到新页面,r2代表的仍然是老页面的response

r2=requests.post('https://github.com/session', data=data, cookies=r1_cookie, allow_redirects=False )

#编码问题  response.encoding='gbk' 

#通常我们在发送请求时都需要带上请求头,请求头是将自身伪装成浏览器的关键,常见的有用的请求头如下

Host Referer #大型网站通常都会根据该参数判断请求的来源

User-Agent #客户端

Cookie #Cookie信息虽然包含在请求头里,但requests模块有单独的参数来处理他,headers={}内就不要放它了

Cookies={ 'user_session':'wGMHFJKgDcmRIVvcA14_Wrt_3xaUyJNsBnPbYzEL6L0bHcfc', } response=requests.get('https://github.com/settings/emails', cookies=Cookies) #github对请求头没有什么限制,我们无需定制user-agent,对于其他网站可能还需要定制

基本POST请求(data参数):

#GET请求

HTTP默认的请求方法就是GET

* 没有请求体

* 数据必须在1K之内!

* GET请求数据会暴露在浏览器的地址栏中

GET请求常用的操作:

1. 在浏览器的地址栏中直接给出URL,那么就一定是GET请求

2. 点击页面上的超链接也一定是GET请求

3. 提交表单时,表单默认使用GET请求,但可以设置为POST

#POST请求

(1). 数据不会出现在地址栏中

(2). 数据的大小没有上限

(3). 有请求体

(4). 请求体中如果存在中文,会使用URL编码!

#!!!requests.post()用法与requests.get()完全一致,特殊的是requests.post()有一个data参数,用来存放请求体数据

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


代理(proxies参数)


如果需要使用代理,你可以通过为任意请求方法提供 proxies 参数来配置单个请求
proxies={ "http":"211.159.177.212:3128",
"https":"119.28.138.104:3128",}
response = requests.get("http://www.baidu.com/", proxies=proxies)
你也可以通过环境变量 HTTP_PROXY 和 HTTPS_PROXY 来配置代理。
 export HTTPS_PROXY="http://12.34.56.79:9527"

#超时设置

#两种超时:float or tuple

#timeout=0.1 #代表接收数据的超时时间

#timeout=(0.1,0.2)#0.1代表链接超时 0.2代表接收数据的超时时间

import requests

respone=requests.get('https://www.baidu.com', timeout=0.0001)

Stream模式分块读取

import requests
r = requests.get('http://zt.bdinfo.net/speedtest/wo3G.rar', stream=True)
f = open("logo.png", "wb")
for chunk in r.iter_content(chunk_size=512):
    if chunk:
        f.write(chunk)
f.close()

5.1 私密代理

# 如果代理需要使用HTTP Basic Auth,可以使用下面这种格式:
proxies = { "http":"trygf521:a4c4avg9@114.67.228.126:16818/" }
response = requests.get("http://www.baidu.com", proxies = proxy)
web客户端验证:如果是Web客户端验证,需要添加 auth = (账户名, 密码)
auth=('test', '123456')
response = requests.get('http://192.168.199.107', auth = auth)

Cookies 和 Sission

如果一个响应中包含了cookie,那么我们可以利用 cookies参数拿到:
import requests
response = requests.get("http://www.baidu.com/")
# 返回CookieJar对象:
cookiejar = response.cookies
# 将CookieJar转为字典:
cookiedict = requests.utils.dict_from_cookiejar(cookiejar)
print(cookiejar)
print(cookiedict)

#没有指定请求头,#默认的请求头:application/x-www-form-urlencoed

#如果我们自定义请求头是application/json,并且用data传值, 则服务端取不到值

requests.post(url='', json={' ':1,}, ) #默认的请求头:application/json

使用Session实现人人网登录

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":"yangguangfu2017@163.com", "password":"afu123456"}
# 4. 发送附带用户名和密码的请求,并获取登录后的Cookie值,保存在ssion里
ssion.post("http://www.renren.com/PLogin.do", data = data)
# 5. ssion包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面
response = ssion.get("http://www.renren.com/880792860/profile")
# 6. 打印响应内容
print(response.text)
Requests也可以为HTTPS请求验证SSL证书:
如果我们想跳过 12306 的证书验证,把 verify 设置为 False 就可以正常请求了。
response = requests.get("https://www.12306.cn/mormhweb/", verify = False)
print(response.content.decode("utf-8"))

大文件要循环下载(文本,wb)

if response.status_code == 200:
   #保存图片名字为logo.jpg
   with open('logo.jpg', 'wb') as f:
      for block in response.iter_content(1024×1024):
         #判断是否还有内容,没有就退出for循环
         if not block:
            break
         #把取出的内容写入文件
         f.write(block)

文件上传

import requests 

files={'file':open('a.jpg','rb')} 

respone=requests.post('http://httpbin.org/post',files=files)

print(respone.status_code)

异常处理

import requests 

from requests.exceptions import * #可以查看requests.exceptions获取异常类型 

try:
    r=requests.get('http://www.baidu.com',timeout=0.00001) 

except ReadTimeout: 
    print('===:') 

except RequestException: print('Error')

认证设置

#认证设置:登陆网站是,弹出一个框,要求你输入用户名密码(与alter很类似),此时是无法获取html的
# 但本质原理是拼接成请求头发送
#         r.headers['Authorization'] = _basic_auth_str(self.username, self.password)
# 一般的网站都不用默认的加密方式,都是自己写
# 那么我们就需要按照网站的加密方式,自己写一个类似于_basic_auth_str的方法
# 得到加密字符串后添加到请求头
#         r.headers['Authorization'] =func('.....')

#看一看默认的加密方式吧,通常网站都不会用默认的加密设置
import requests
from requests.auth import HTTPBasicAuth
r=requests.get('xxx',auth=HTTPBasicAuth('user','password'))
print(r.status_code)

#HTTPBasicAuth可以简写为如下格式
import requests
r=requests.get('xxx',auth=('user','password'))
print(r.status_code)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值