session和cookie的作用和原理,以及爬虫中的应用

Part1 基础定义

无状态http协议:
session:服务器端的状态保持机制,需要想办法在发送请求的时候携带sessionID。
cookies:客户端的状态保持机制,将信息存储在本地,有被劫持的危险;数量和大小有限制。有些状态不适合在服务端保持。

参考:
Session和Cookie的区别与联系1
Session和Cookie的区别与联系2

Part2 爬虫中的应用

#用于session模拟登陆知乎
import requests
import http.cookiejar
from bs4 import BeautifulSoup
session = requests.Session()
session.cookies = http.cookiejar.LWPCookieJar("cookie")
agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/5.1.2.3000 Chrome/55.0.2883.75 Safari/537.36'
headers = {
    "Host": "www.zhihu.com",
    "Origin":"https://www.zhihu.com/",
    "Referer":"http://www.zhihu.com/",
    'User-Agent':agent
}

postdata = {
    'password': '*******',  #填写密码
    'account': '********', #填写帐号
}
response = session.get("https://www.zhihu.com", headers=headers)
soup = BeautifulSoup(response.content, "html.parser")
xsrf = soup.find('input', attrs={"name": "_xsrf"}).get("value")
postdata['_xsrf'] =xsrf
result = session.post('http://www.zhihu.com/login/email', data=postdata, headers=headers)
session.cookies.save(ignore_discard=True, ignore_expires=True)

#github模拟登陆
import requests
from lxml import html

LOGIN_URL = 'https://github.com/login'
SESSION_URL = 'https://github.com/session'

s = requests.session()
r = s.get(LOGIN_URL)
tree = html.fromstring(r.text)
el = tree.xpath('//input[@name="authenticity_token"]')[0]

authenticity_token = el.attrib['value']

data = {
    'commit': 'Sign in',
    'utf8': '✓',
    'authenticity_token': authenticity_token,
    'login': 'orzrd',
    'password': 'qwe123!@#'
}
r = s.post(SESSION_URL, data=data)
#维护session
#此部分代码来https://blog.csdn.net/zinczhang/article/details/80234217

from selenium import webdriver
browser = webdriver.Chrome()
browser.get('url')
cookie_list = browser.get_cookies()
for cookie in cookie_list:
     cookies[cookie['name']] = cookie['value']
#因为只使用requests发送请求不便于cookie的维护,时间长cookie可能会失效,所以使用requests.session()获取session实例进行cookie维护。
#但是requests只能保持 cookiejar 类型的cookie,而我们手动构建的cookie是dict类型的。所以要把dict转为 cookiejar类型。

cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)
session = requests.session()
session.cookies = cookies

猜你喜欢

转载自blog.csdn.net/ml_1019/article/details/81207752
今日推荐