第二天:

 

Requests深入

  1. 发送post请求
  2. 使用代理
  3. 处理cookies session

 

GET和POST请求的区别:

GET请求的参数是附加到URL的后面(?kw=赵丽颖&pn=0)

POST请求的参数是附加到请求体中的

GET请求常用在超链接(<a href=”xxx”>)

POST请求常用在表单中(form标签)

 

发送post请求

哪些地方我们会用到post请求:

  1. 登陆注册
  2. 传输大文本的时候(post对数据长度是没有要求的)

所以同样的,我们的爬虫也需要在这两个地方模拟浏览器发送post请求

 

用法:

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

data 的形式:字典

使用代理

浏览器 è 代理 è 服务器

为什么我们要使用代理?

  1. 让服务器以为不是一个客户端在请求
  2. 防止我们的真实地址被泄漏,防止被追究

proxies的形式:字典

proxies = {

            ”http://12.34.56.79:9527”,

            ”https://12.34.56.79:9527

}

代理网站:快代理,代理云,西刺免费代理IP

 

cookie和session区别:

  • cookie数据存放在客户的浏览器上,session数据放在服务器上。
  • cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗。
  • session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。
  • 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

爬虫处理cookie和session

带上cookie、session的好处:

      能够请求到登录之后的页面

带上cookie、session的弊端:

      一套cookie和session往往和一个用户对应

      请求太快,请求次数太多,容易被服务器识别为爬虫

不需要cookie的时候尽量不去使用cookie

但是为了获取登录之后的页面,我们必须发送带有cookies的请求

 

处理cookies 、session请求

requests 提供了一个叫做session类,来实现客户端和服务端的会话保持

使用方法:

  1. 实例化一个session对象
  2. 让session发送get或者post请求

session = requests.session()

response = session.get(url,headers)

 

使用requests提供的session类来请求登录之后的网站的思路:

1.首先实例化一个session对象。

2.然后使用session发送请求,登录对应的网站,把cookie保存在session对象中。

3.再使用session对象请求登录之后才能访问的网站,session能够自动的携带登录成功时保存在其中的cookie,进行请求。

获取登陆后的页面的三种方式:

  1. 实例化session对象,使用session发送post请求,再使用它获取登陆后的页面。

import requests

# 实例化一个session对象
session = requests.session()
url = "http://www.renren.com/PLogin.do/"

data = {"email":"**********", "password":"***********"}

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

# 使用session发送post请求,cookie保存在其中
session.post(url, data=data, headers=headers)

r = session.get("http://www.renren.com/970724654/profile", headers=headers)

#保存
with open('renren1.html', 'w', encoding='utf-8') as f:
    f.write(r.content.decode())

 

  1. headers中添加cookie键,值为字符串   

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
    "Cookie": "anonymid=jvdydlcgy97su0; depovince=GW; _r01_=1; _de=010A33CAECAC9FB3E34F9DF2409E43F1; ln_uact=17608484920; ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; jebe_key=7a3b8afb-6889-452f-87b2-c31f7c098132%7Ca0ba31c1833dc38cbaebc26d12250140%7C1557243378971%7C1%7C1557243378746; jebecookies=fadd08d5-408a-4073-b657-07cad1ab5e43|||||; JSESSIONID=abcOmuoEeKCy3gL1hKxQw; ick_login=2c985b25-87cb-4d5c-9b37-0a54cdfc256e; p=80809be57d49622ca56e2ab6a546440d4; first_login_flag=1; t=8db3ba858dd6405899a4570a80aacd524; societyguester=8db3ba858dd6405899a4570a80aacd524; id=970724654; xnsid=686f6ca3; ver=7.0; loginfrom=null; wp_fold=0"
}

r = requests.get("http://www.renren.com/970724654/profile", headers=headers)

#保存
with open('renren2.html', 'w', encoding='utf-8') as f:
    f.write(r.content.decode())

 

 

Requests小技巧

处理HTTPS请求SSL证书验证

Requests也可以为HTTPS请求验证SSL证书:

  • 要想检查某个主机的SSL证书,你可以使用 verify 参数(也可以不写)

import requests

response = requests.get("https://www.baidu.com/", verify=True)

# 也可以省略不写

# response = requests.get("https://www.baidu.com/")

print (response.text)

  • 如果SSL证书验证不通过,或者不信任服务器的安全证书,则会报出SSLError,据说 12306 证书是自己做的

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