1. 程式人生 > 實用技巧 >Spider--補充--Requests--session&cookie

Spider--補充--Requests--session&cookie

# session 與 cookie

# 可能大家對session已經比較熟悉了,也大概瞭解了session的機制和原理,但是我們在做爬蟲時如何會運用到session呢,就是接下來要講到的會話保持。
# 首先說一下,為什麼要進行會話保持的操作?
# requests庫的session會話物件可以跨請求保持某些引數,說白了,就是比如你使用session成功的登入了某個網站,則在再次使用該session物件求求該
# 網站的其他網頁都會預設使用該session之前使用的cookie等引數尤其是在保持登陸狀態時運用的最多,在某些網站抓取,或者app抓取時,有的時強制登陸,
# 有的是不登陸返回的資料就是假的或者說是不完整的資料,那我們不可能去做到每一次請求都要去登陸一下怎麼辦,就需要用到保持會話的功能了,我們可以
# 只登陸一次,然後保持這種狀態去做其他的或者更多的請求。其次,我們該如何使用會話保持?舉一個事例來說明一下:

#requests.session():維持會話,可以讓我們在跨請求時儲存某些引數
 
import requests
 
#例項化session
session = requests.session()
url = 'https://www.douban.com/accounts/login'
form_data = {
    'source': 'index_nav',
    'form_email': 'xxx',
    'form_password': 'xxx',
    'captcha-solution': 'stamp',
    'captcha-id': 'b3dssX515MsmNaklBX8uh5Ab:en'}
#設定請求頭
req_header = {
    'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
}
 
#使用session發起請求
response = session.post(url,headers=req_header,data=form_data)
if response.status_code == 200:
    #訪問個人主頁:
    url = 'https://www.douban.com/people/175417123/'
    response = session.get(url,headers = req_header)
    if response.status_code == 200:
        with open('douban3.html','w') as file:
            file.write(response.text)

            

import requests
import time
mycookie = { "PHPSESSID":"56v9clgo1kdfo3q5q8ck0aaaaa" }
x = requests.session()
requests.utils.add_dict_to_cookiejar(x.cookies,{"PHPSESSID":"07et4ol1g7ttb0bnjmbiqjhp43"})
x.get("http://127.0.0.1:80",cookies = mycookie)
time.sleep(5)
#請求以後抓包可以檢驗一下是不是新增成功
x.get("http://127.0.0.1:80")

# 這樣,通過requests.utils.add_dict_to_cookiejar對session物件設定cookie,之後所有的請求都會自動加上我自定義的cookie內容。
# 也可以通過requests.utils.cookiejar_from_dict 先生成一個cookiejar物件,到時候再賦值給session.cookies。
# 貌似還可以使用session.cookies.set()或者update()。

# 另外說一點單獨處理cookie欄位,處理為字典格式:
cookie = "SINAGLOBAL=821034395211.0111.1522571861723; wb_cmtLike_1850586643=1; [email protected]; wb_timefeed_1850586643=1; UOR=,,login.sina.com.cn; wvr=6; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WWsNeq71O_sXkkXNnXFHgOW5JpX5KMhUgL.Fo2RSK5f1hqcShe2dJLoI0qLxK-L12qLB-zLxKqL1hnL1K2LxK-LBo5L12qLxKqL1hML1KzLxKnL1K.LB-zLxK-L1K-LBKqt; YF-V5-G0=c99031715427fe982b79bf287ae448f6; ALF=1556795806; SSOLoginState=1525259808; SCF=AqTMLFzIuDI5ZEtJyAEXb31pv1hhUdGUCp2GoKYvOW0LQTInAItM-ENbxHRAnnRUIq_MR9afV8hMc7c-yVn2jI0.; SUB=_2A2537e5wDeRhGedG7lIU-CjKzz-IHXVUm1i4rDV8PUNbmtBeLVrskW9NUT1fPIUQGDKLrepaNzTEZxZHOstjoLOu; SUHB=0IIUWsCH8go6vb; _s_tentry=-; Apache=921830614666.5322.1525261512883; ULV=1525261512916:139:10:27:921830614666.5322.1525261512883:1525239937212; YF-Page-G0=b5853766541bcc934acef7f6116c26d1"
cookie_dict = {i.split("=")[0]: i.split("=")[1] for i in cookie.split("; ")}
 

# 例項:    
import requests
from bs4 import BeautifulSoup

def getPage(url):
    """
    Utilty function used to get a Beautiful Soup object from a given URL
    """

    session = requests.Session()   # requests.session():維持會話,可以讓我們在跨請求時儲存某些引數

    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',
               'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'}
    try:
        req = session.get(url, headers=headers)
    except requests.exceptions.RequestException:
        return None
    bs = BeautifulSoup(req.text, 'html.parser')
    return bs