小白学爬虫(三)-- requests库之Cookie

前言

上一篇文章介绍了如何用requests模拟浏览器发送一个get/post请求获取response响应,response对象的常见属性方法,以及对返回数据是乱码如何处理。这篇文章主要介绍Cookie相关的请求,但是在此之前会先说一下请求超时的问题。

使用超时参数

平时在浏览器里面访问页面的时候经常会出现 “正在加载中…” 或者 一个小圆圈不停的转 这样的情况,这种情况可能是由于网络波动引起的。那么在程序里面会不会出现这中情况呢?肯定是会的。如果出现这种情况程序就会卡死在这里,直到网络稳定之后才会继续执行。那有没有什么解决方法呢?有的,就是使用timeout参数,比如:

import requests

url = "http://www.baidu.com"
response = requests.get(url,timeout=0.01)
print(response.content.decode())

主要注意这一句

response = requests.get(url,timeout=0.01)

这句话的意思是:如果在0.01s之内可以得到响应就没事,如果得不到响应就报错。如下图:
这里写图片描述
另外也可以利用retry模块进行多次请求,如果全部都失败才报错。当然使用retry库之前也需要先安装。

import requests

from retrying import retry

# 这里的headers使用的是手机版的
m_headers = {
    "User-Agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"
}

@ retry(stop_max_attempt_number = 10)  #让被装饰的函数反复执行10次,10次全部报错才会报错, 中间有一次正常就继续往下走
def parse_url1(url):
    response = requests.get(url, headers=m_headers, timeout=5)
    return response.content.decode()

# 真正的url请求函数
def parse_url(url):
    try:
        html_str = parse_url1(url)
    except:
        html_str = None
    return html_str

if __name__ == '__main__': 
    url = "http://www.baidu.com"
    print(parse_url(url))

在requests添加Cookie参数

啥是cookie

当用户通过浏览器首次访问一个域名时,访问的web服务器会给客户端发送数据,以保持web服务器与客户端之间的状态保持,这些数据就是cookie,它是Internet站点创建的,为了辨别用户身份而储存在用户本地终端上的数据,cookie大部分都是加密的,cookie存在与缓存中或者硬盘中,在硬盘中的是一些文本文件,当你访问该网站时,就会读取对应的网站的cookie信息,cookie有效地提升了用户体验,一般来说,一旦将cookie保存在计算机上,则只有创建该cookie的网站才能读取它

上面这段话来自于:Python的Cookie详解

看懂了吗? 我反正没看懂。简单说cookie就是客户端向服务器端保持状态的,它可以辨别用户的身份,大部分是加密的。我们可以用的就是模拟登陆,在需要输入登陆账号和密码的网站就可以利用Cookie来获取数据,比如csdn。

一般携带Cookie请求有三种方式:

三种Cookie请求方式

第一种:cookie放在headers中

这里以请求我自己的博客首页为例:
这里写图片描述
首先找到登陆之后的Cookie和User-Agent,然后将User-Agent和Cookie复制到程序里面,如下:

import requests

url = "https://blog.csdn.net/williamgavin"

headers = {"User_Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
    "Cookie" : "这个还是算了吧,用你们自己的博客试 ^-^ "
}
response = requests.get(url, headers = headers )
with open("csdn.html", "w", encoding="utf-8") as f:
    f.write(response.content.decode());

这样就将这个页面的数据返回到了csdn.html这个文件里面,打开看一下,如下图:
这里写图片描述
和我自己的博客主页是一样的,而且超链接都保留了。

第二种:cookie字典传给cookies参数

这里以请求人人网为例:
这里写图片描述

找到对应的cookie和User-Agent

这里写图片描述

import requests

url = "http://www.renren.com/967272361/profile"
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
}

# 不带上Cookie就访问不了这个页面
cookie = "anonymid=jk63khrk-y97r4p; _r01_=1; ln_uact=mr_mao_hacker@163.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn421/20180720/1740/main_JAWQ_0aa000000ceb195a.jpg; _ga=GA1.2.273332130.1532825428; depovince=HUN; JSESSIONID=abcE5k0CiAJDc9ESVEcuw; ick_login=026ba348-e4e9-4871-9ce3-5868b95cfdd3; first_login_flag=1; loginfrom=syshome; wp_fold=0; BAIDU_SSP_lcr=https://www.baidu.com/link?url=VRx_HKUd53I5rYWZHvrQ9VVLotqST6-jtaZDlscFYCO&wd=&eqid=e957aec400037928000000065b64fcab; ick=64518f30-9a22-47df-b3c3-4114f185c3c6; t=8fcf47068763c279eea2620b51b7a3311; societyguester=8fcf47068763c279eea2620b51b7a3311; id=967272361; xnsid=fd736c63; jebecookies=3f9a3853-3371-4857-8268-308d663ca146|||||; jebe_key=19041c4e-4d38-4dc1-bfb9-124b81afae61%7C33b1d8f602cf6dd5a9834fe6f2bf97f2%7C1533346094265%7C1%7C1533346099750"

# 将上面哪个cookie转化成字典类型
cookie_dict = {i.split("=")[0]:i.split("=")[-1] for i in cookie.split("; ")}
response = requests.get(url, headers = headers, cookies = cookie_dict)

with open("renren2.html", "w", encoding="utf-8") as f:
    f.write(response.content.decode())

结果如下:
这里写图片描述

第三种 先发送post请求,获取cookie,带上cookie请求登陆之后的页面

这里要用到一个seesion类,seesion 实例具有的方法和requests一样,但是 seesion具有保持功能, 就类似浏览器输入一次密码之后,会自动保留cookie

  • seesion = requests.seesion()
  • seesion.post(url, data, headers) # 服务器设置在本地的cookie会保存在本地
  • seesion.get(url) # 会带上之前保存在seesion中的cookie,能够请求成功

这种方法要先提交自己的账号密码,并且要找到提交的地址。那么如何找到提交地址呢?
第一种方式:找form表单的action属性
这里写图片描述

import requests

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

seesion = requests.session()

# 因为人人网有from表单,所以可以直接找地址:http://www.renren.com/PLogin.do
# 如果没有的就要抓包了

post_url = "http://www.renren.com/PLogin.do"    # form表单里面直接找到的
#post_url = "http://www.renren.com/ajaxLogin/login?
# 用户名作为键, 真正的密码作为值  模拟登陆
post_data = {"email":"xxxx", "password":"xxxx"}
seesion.post(post_url, headers = headers, data = post_data)

url = "再次请求登陆的url"

response = seesion.get(url, headers = headers)

with open("renren3.html", "w", encoding="utf-8") as f:
    f.write(response.content.decode())

第二种方式抓包获取url
这里写图片描述

猜你喜欢

转载自blog.csdn.net/williamgavin/article/details/81390014