網站爬取心得2_Cookie

網站爬取思路總結2

1、Cookie介紹
  • (1)cookie的類型:會話cookie和持久cookie;其唯一的區別在於過期時間,如果設置了Discard參數,或者沒有設置Expires或Max-Age參數來說明擴展的過期時間,這個cookie就是一個會話cookie.
    • a.會話cookie:是一種臨時的cookie,它記錄了用戶訪問站點時的設置和偏好,用戶退出瀏覽器時,會話cookie就被刪除了。
    • b.持久cookie的生存時間更長一些,它們存儲在硬盤上,瀏覽器退出,計算機重啓時它們仍然存在。通常用持久cookie維護某個用戶會週期性訪問的配置文件或登錄名。
  • (2)cookie是如何工作的:cookie就像服務器給用戶貼的“(。・∀・)ノ゙嗨,我叫”的貼紙一樣,cookie中包含了一個由名字=值這樣的信息構成的任意列表,並通過set-Cookie或set-cookie2HTTP響應首部將其貼到用戶身上去。瀏覽器會記住從服務器返回的set-cookie或set-cookie2首部中的cookie內容,並將cookie集存儲在瀏覽器的cookie數據庫中。
  • (3)cookie罐:客戶端的狀態,cookie的基本思想就是讓瀏覽器積累一組服務器特有的信息,每次訪問服務器時都將這些信息提供給它。因爲瀏覽器要負責存儲cookie信息,所以此係統被稱爲客戶端側狀態,cookie規範的正式名稱爲HTTP狀態管理機制。
2、應對生成的cookie常用解決方法
  • (1)cookie參數一般是通過兩種方式生成,一種是服務端返回的cookie,對於通過python當中request請求網頁鏈接,在response.cookies裏面即可拿到cookie參數。
  • (2)另一種是網頁端有javascript代碼生成的cookie,對於這種情況,首先需要藉助工具(https://blog.csdn.net/weixin_43411585/article/details/90339557 )去找到生成cookie的javascript代碼,如何找到javascript代碼?步驟如下:
    • a.首先將打開谷歌開發者工具(一般按F12即可打開),清除掉網頁緩存的cookie參數以及其他的參數。
      在這裏插入圖片描述
    • b.確定生成cookie的javascript代碼。打開抓包工具,如mitmproxy,刷新頁面,查看左側的一條條請求,看何時多了cookie參數,以及其response返回的代碼;有時候javascript代碼在response體裏面;有時候網頁源代碼也有可能隱藏了js代碼。
      在這裏插入圖片描述
  • (3)針對javascript代碼生成的cookie參數,一些解決方法:
    • a.用python裏面的requests的session請求,可以跨網頁維持同一個會話cookie;
    • b.通過selenium可以獲得cookie參數
    • c.用execjs解密js代碼獲得cookie參數
3、通過requests的session會話對象來進行處理cookie參數
  • (1)session會話對象讓你能夠跨請求保持某些參數,可以在同一個 Session 實例發出的所有請求之間保持 cookie。(ps:期間使用 urllib3 的 connection pooling 功能。所以如果你向同一主機發送多個請求,底層的 TCP 連接將會被重用, 從而帶來顯著的性能提升)
  • (2)session維持回話例子解釋:
  • (3)session和cookies:在瀏覽一些網站,比如購物的時候,我們常常需要先登陸,登陸過後我們可以連續訪問網站,並且可以將我們需要的購買的東西加入購物車。但是有時候我們中途過了一段時間沒有操作就需要重新登陸。還有某些網站,打開網頁之後就已經登陸了。這些功能看起來來很神奇,其實都是Session和Cookie在發揮作用。
  • (4)例子:
import requests
url1 = "http://hd.chinatax.gov.cn/fagui/initCredit.jsp"
session = requests.Session()
resp1 = session.get(url1, headers=headers, timeout=50)
url2 = 'http://hd.chinatax.gov.cn/pepp4_lakers'
resp2 = session.post(url2, data=data, headers=headers, timeout=50)
print(resp2.cookies)
4、通過chrome的headless配合selenium獲得cookie參數
  • (1) 先用selenium 獲取 url的cookies, 這裏用selenium + chrome的好處是 獲取到的cookies就是加密過後的,無需你執行js代碼。
  • (2)再用二次cookies 再次get(url) 這樣就能正常訪問了 獲得到的html.page_source 就可以用beautifulsoup4來解析了。
  • (3)例子:以下代碼裏,driver.get_cookies()即可獲得cookies,(ps絕大多數情況下不會出現__jsluid參數,服務端有時候返回521狀態碼時,就會有__jsluid參數)
from selenium import webdriver
def driver_chrome_cookie():
    # 谷歌瀏覽器無頭模式
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument("--headless")
    driver = webdriver.Chrome(options=chrome_options)
    driver.get('http://www.cyicai.com/information/applyForSubscription')
    cookies = driver.get_cookies()
    print(cookies)
    if cookies[0]['name'] == '__jsluid':
        new_cookies = cookies[0]['name'] + '=' + cookies[0]['value'] + ';' + cookies[1]['name'] + '=' + cookies[1]['value']
        print(new_cookies)
if __name__ == '__main__':
    driver_chrome_cookie()
5、用execjs解密js代碼獲得cookie參數
  • (1)通過chrome瀏覽器控制檯可以創建js腳本並調試執行,詳細操作
    在這裏插入圖片描述
  • (2)chrome瀏覽器控制檯Console選項卡也可以修改代碼運行查看結果。以下原js代碼裏面,會將eval語句替換成return語句,存放到1.js文件裏面,然後讀出來用execjs執行。
    在這裏插入圖片描述
  • (3)站長工具 格式化js代碼
    在這裏插入圖片描述
  • (4) 安裝execjs庫:pip install PyExecjs;並安裝運行環境node.js;(ps:windows裏面execjs會自動匹配node.js環境)
  • (5)在用execjs之前,需要觀察分析你獲取的js是代碼邏輯,一般情況下降js中的eval更改成return,以及一些replace來替換js代碼,即可獲取到最終python裏面要執行的js代碼。(ps如果js中有dom或者window這樣的東西,execjs貌似就無法執行了)。
  • (6)python爬蟲返回521狀態碼例子:其中js代碼存放在1.js文件裏面。
import execjs
with open('1.js', 'r') as f:
    js_text = f.read()
    parse_js = execjs.compile(js_text).call('f')
    print('解密後的js:', parse_js)
    parse_js = parse_js.replace(r"document.createElement('div');_44.innerHTML='<a href=\'/\'>_a</a>';_44=_44.firstChild.href;var _e=_44.match(/https?:\/\//)[0];_44=_44.substr(_e.length).toLowerCase()", '"http://www.cyicai.com/"')
    parse_js = 'var a' + parse_js.split('document.cookie')[1].split("Path=/;'")[0] + "Path=/;';return a;"
    js_final = "function getClearance(){" + parse_js + "};"
    jsl_clearance = execjs.compile(js_final).call('getClearance')
    print(jsl_clearance)
    jsl_cle = jsl_clearance.split(';')[0]
    print(jsl_cle)
# 輸出結果
# 解密後的js: var _44=function(){setTimeout('location.href=location.pathname+location.search.replace(/[\?|&]captcha-challenge/,\'\')',1500);document.cookie='__jsl_clearance=1559007716.074|0|'+(function(){var _e=[function(_44){return _44},function(_e){return _e},(function(){var _44=document.createElement('div');_44.innerHTML='<a href=\'/\'>_a</a>';_44=_44.firstChild.href;var _e=_44.match(/https?:\/\//)[0];_44=_44.substr(_e.length).toLowerCase();return function(_e){for(var _a=0;_a<_e.length;_a++){_e[_a]=_44.charAt(_e[_a])};return _e.join('')}})(),function(_44){for(var _e=0;_e<_44.length;_e++){_44[_e]=parseInt(_44[_e]).toString(36)};return _44.join('')}],_44=['%2FK',[(-~[([(-~{}<<-~{})]+~~[]>>(-~{}<<-~{}))]+[]+[[]][0])],'8In',[[(-~{}<<-~{})]+[-~[-~[-~[]-~[]]-~[]-~[]-~[]-~[]]]],'d',[[(-~{}<<-~{})]+[-~[-~[-~[]-~[]]-~[]-~[]-~[]-~[]]]],[(+!+[])/~~''+[]+[[]][0]][0].charAt(~~[]),'xPASrSVQnGK',[(2<<-~{})],'p',(-~!/!/+[]+[[]][0]),'w',[[-~[-~[]-~[]]]+[~~![]]],'Y%3D'];for(var _a=0;_a<_44.length;_a++){_44[_a]=_e[[1,2,1,3,1,3,0,1,0,1,0,1,3,1][_a]](_44[_a])};return _44.join('')})()+';Expires=Tue, 28-May-19 02:41:56 GMT;Path=/;'};if((function(){try{return !!window.addEventListener;}catch(e){return false;}})()){document.addEventListener('DOMContentLoaded',_44,false)}else{document.attachEvent('onreadystatechange',_44)}
# __jsl_clearance=1559007716.074|0|%2FK/8InsdsIxPASrSVQnGK4p1wuY%3D
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章