1. 程式人生 > >Cookie和Post模擬登陸

Cookie和Post模擬登陸

藉助Chrome直接獲取到Cookie,不過這種方式有侷限性,並不如Fiddler通用,有一些網站使用這種方式獲取的Cookie無法登入。

經過測試,這種方式對知乎有效。

在已經登入知乎的情況下,開啟開發者工具,定位到 Network 選顯示卡,然後重新整理網頁,在載入的內容中,隨便選擇一項,然後看右側的資料,如下圖所示:

這裡寫圖片描述
在右側的Request Headers下面,你可以找到Cookie這一項,它後面的一長串資料就是我們需要的Cookie。

請注意這裡一定要是”Request Headers”,不要選成了”Response Headers”。

使用這種方式獲取的Cookie比使用Fiddler獲取的Cookie要長几十個字元,不過不影響正常使用。以下是獲取知乎回答的一個例子:

這裡寫圖片描述
原始碼中出現了“私信”和“我的首頁”這兩連結,說明是以登入的身份獲取的原始碼。

我們現在已經有這一段“登入後”的Cookie了,所以如果我們的指令碼訪問網站的時候,把這段程式碼一併提交上去,就可以讓網站以為我們已經登入過,於是直接顯示登入後的內容。

使用Cookie來登入網頁,有時候可以直接繞過網站的驗證碼。

藉助requests的Session模組,我們可以用幾行程式碼加Cookie來實現登入知乎。

session = requests.Session()
cookie = {'Cookie': '一長串文字'}
html = session.get('網址', cookies=cookie).content
print(html.decode())

獲取網頁的時候,網址可以隨便修改,只要保證每次都有cookies=cookie這個引數,就可以正常訪問登入以後才能訪問的頁面。

Post模擬登陸

在之前的課程中,我們主要使用了requests的get方法來直接獲取網頁的內容。支援GET方法的網頁,接受我們的URL, 從URL裡面取出引數,然後再將結果返回給瀏覽器。由於URL的長度是有限制的,所以只能接收少量的引數。而支援POST方法的網頁,可以傳遞大量的引數和大量的資訊。如果一個網頁只支援POST方法,那這個網頁是沒有辦法在瀏覽器裡面直接輸入網址訪問的。requests的post方法支援將引數以POST方式提交給網頁,並得到網頁的返回資訊。

大多數的網站,登入的使用者名稱和密碼都是通過POST方式提交給伺服器的,因此如果可以模擬網站的這個提交行為,就可以模擬登入網站。

我們首先進入知乎的登入頁面,開啟Chrome的開發者工具的Network選項卡,勾選“Preserve log”並故意輸入錯誤的賬號和密碼嘗試登入,從Chrome抓取到的資料中我們可以找到我們需要的資訊:

這裡寫圖片描述
這裡寫圖片描述

從以上兩張圖中,我們可以看到,當我們點選了登入按鈕以後,程式會將圖二紅框中的Form Data下面四個資料使用POST方式傳送給圖一紅框中的https://www.zhihu.com/login/email 這個URL。

上圖中的Form Data,後三項的意義顯而易見,email: 郵箱, password: 密碼, remember_me: 記住我。但是第一項”_xsrf”是什麼意思?它後面的一長串資料是哪裡來的?

這個時候大家開啟登入頁面的原始碼,你將會找到這樣內容:
這裡寫圖片描述

那麼事情就簡單了,使用正則表示式或者XPath先從原始碼裡面把這個xsrf提取出來,然後再和登入資訊一起提交即可。

還有一點需要注意:在Form Data中,remember_me後面的值是true, 首字母是小寫的。但是在Python裡面的布林值True, 首字母需要大寫。

在一般情況下是不需要使用驗證碼登入的,所以只需要提供圖二列出的資訊,將它們寫成一個字典並POST提交就能實現登入。那麼如果遇到驗證碼怎麼辦呢?後面我們會有專門的課程將驗證碼的處理。

現在,我們已經知道了登入知乎的原理,於是就可以通過程式碼來實現登入。核心程式碼如下:


data = {'_xsrf': xsrf, 'email': '郵箱', 'password': '密碼',
        'remember_me': True}
session = requests.Session()
result = session.post('https://www.zhihu.com/login/email', headers=header, data=data) #這裡的result是一個json格式的字串,裡面包含了登入結果

之後訪問知乎的其他頁面,只需要使用session.get(‘網址’, headers=header)這種格式

front_page = session.get(‘https://www.zhihu.com‘, headers=header)
print(front_page.content.decode())
其執行效果如下圖所示:
這裡寫圖片描述

網址返回的登入結果是登入成功,並且檢視原始碼可以證明是登入成功。

對於其他的網站,整個流程是完全一樣的,只是POST提交的引數各有不同。有些網址只需要POST提交使用者名稱和密碼就可以了,而另外一些網址,可能還需要從原始碼裡面提取更多的引數

模擬登陸豆瓣程式碼

import requests
import re


login_url = 'https://accounts.douban.com/login'
user_url = 'https://www.douban.com/people/{}/'
email = '[email protected]'
password = '8888888'

data = {'source': None,
        'redir': 'https://www.douban.com/',
        'form_email': email,
        'form_password': password,
        'remember': 'on',
        'login': '登入'}

header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'}

session = requests.Session()
html = session.get(login_url, headers=header).content.decode()

captcha_url = re.findall('id="captcha_image" src="(.*?)"', html, re.S) #獲取驗證碼url
if captcha_url:
    captcha_url = captcha_url[0]
    captcha_id = re.findall('name="captcha-id" value="(.*?)"', html, re.S)[0] #獲取驗證碼ID

    with open('captcha.png', 'wb') as f:
        f.write(requests.get(captcha_url).content)

    captcha_solution = input('captcha code is:')
    data['captcha-solution'] = captcha_solution
    data['captcha-id'] = captcha_id

result = session.post(login_url, data=data, headers=header).content

user_id = input('請輸入使用者id:')
while user_id != 'exit':
    user_info = session.get(user_url.format(user_id)).content
    print(re.findall('title>(.*?)</title', user_info.decode(), re.S)[0])
    user_id = input('請輸入使用者id:')

相關推薦

CookiePost模擬登陸

藉助Chrome直接獲取到Cookie,不過這種方式有侷限性,並不如Fiddler通用,有一些網站使用這種方式獲取的Cookie無法登入。 經過測試,這種方式對知乎有效。 在已經登入知乎的情況下,開啟開發者工具,定位到 Network 選顯示卡,然後重新整理

ab傳送cookiepost請求的方法

ab是apache自帶的壓力測試工具,近期需要壓測一個介面,涉及使用post請求,並在其中帶cookie。方法總結如下: 1. 傳送cookie 方法1 -C key1=value1;key2=value2... 例: ab -n 1

為Boost ASIO的http server4例子新增CookiePost/Get引數提取支援

Cookie和Post/Get引數支援 Author: kagula Date: 2016-12-28 Cookie的支援 如何呼叫 第一步:所有的TCP請求加入下面的程式碼 若session不存在,會返回一個新的sessionid std::string sessio

25 API-GUI(事件監聽機制,介面卡模式),Netbeans的概述使用(模擬登陸註冊GUI版)

 1:GUI(瞭解) (1)使用者圖形介面GUI:方便直觀CLI:需要記憶一下命令,麻煩(2)兩個包:java.awt:和系統關聯較強  ,屬重量級控制元件javax.swing:純Java編寫,增強了移植性,屬輕量級控制元件。(3)GUI的繼承體系元件:元件就是物件容器元

HttpClient 4.1.3 初學篇---使用GetPost模擬登入簡單頁面(分別帶引數)

    最近需要解決的問題需要用到Httpclient,模擬登陸網站!成功之後就可以用程式碼的方式獲取網站內容或者傳送請求,類似網路爬蟲。     但是在網上找了好多篇Blog,發現每一片的寫法都不一樣,也糾結了些時間,很納悶,才發現Httpclient版本不一樣。。。現在

python全棧系列之---cookie模擬登陸模擬session原理

ger -c AD log print imp 數據庫 sta 這一 cookie模擬登陸: import tornado.web class IndexHandler(tornado.web.RequestHandler): def get(self):

模擬登陸CSDN -- Python爬蟲練習之正則表示式cookie

  這周學習的主題是正則表示式和cookie,原本是計劃每天晚上11點下班到家,練上一兩個鍾就把這部分過了,結果這周各種事情和不再狀態,所以沒整完,直至今天才把相關問題過掉。其實這部分也挺不錯的,也並沒有想象中容易,所以好事多磨。這周練習的綜合習題就是模擬登陸C

關於模擬登陸的小結-抓包、cookie、sessiontoken

概述 上個星期根據bcloud寫了個Java版本的登陸專案。其實本來時想做個Linux的百度雲登陸軟體,但是做到獲取bdstoken的時候出了問題解決不了。後來我把bcloud專案下了下來用發現也有問題,應該是百度登陸的過程有了一些改動。通過 web抓包找到一些線索,

使用httpclient4.3.X模擬post請求登陸網站獲取cookie資訊的操作

             眾所周知,httpclient可以模擬登陸操作,下面我就來個例項測試一下,順便也回憶下這個開源工具的使用,直接上例子吧! package com.pyc.search.crawler.node.login; import java.io.IO

PHP中常用的超全局變量 表單中getpost提交方式的區別 session與cookie的區別 GD庫是做什麽用的

屬性 過程 生成報表 用戶訪問 服務器 接收 file pla request PHP中常用的超全局變量 $_GET ----->get傳送方式$_POST ----->post傳送方式$_REQUEST ----->可以接收到get和post兩種方式的值

20170717_python爬蟲之requests+cookie模擬登陸

ssi alert 之前 lose net .html .net 裝載 onos 在成功登陸之前,失敗了十幾次。完全找不到是什麽原因導致被網站判斷cookie是無效的。 直到用了firefox的httpfox之後才發現cookie裏還有一個ASP.NET_SessionI

使用Post方法模擬登陸爬取網頁(轉)

source tin -m quest exc agen false buffered void 使用Post方法模擬登陸爬取網頁 最近弄爬蟲,遇到的一個問題就是如何使用post方法模擬登陸爬取網頁。下面是極簡版的代碼: import java

Golang中http請求設定cookieheader(包括GETPOST請求)

//http請求 func httpHandle(method, urlVal,data string) { client := &http.Client{} var req *http.Request if data == "" { urlArr := strings.Sp

22.天眼查cookie模擬登陸采集數據

cat from undefined 地址 answer Language ase 圖片 count 通過賬號登錄獲取cookies,模擬登錄(前提有天眼查賬號),會員賬號可查看5000家,普通只是100家,同時也要設置一定的反爬措施以防賬號被封。拿有權限的賬號去獲取co

PHP中使用CURL實現模擬GETPOST請求,親測完美解決

//初始化 $curl = curl_init(); //設定抓取的url curl_setopt($curl, CURLOPT_URL, 'http://www.baidu.com'); //設定標頭檔案的資訊作為資料流輸出 curl_setopt($cur

GETPOST的區別,CookieSession的區別聯絡,

1.GET和POST的區別 A. 從字面意思和HTTP的規範來看,GET用於獲取資源資訊而POST是用來更新資源資訊。 B. GET提交請求的資料實體會放在URL的後面,用?來分割,引數用&連線,舉個栗子:/index.html?name=wang&login=1

cookiesession實現免登陸

Cookie的機制 Cookie是瀏覽器(User Agent)訪問一些網站後,這些網站存放在客戶端的一組資料,用於使網站等跟蹤使用者,實現使用者自定義功能。 Cookie的Domain和Path屬性標識了這個Cookie是哪一個網站傳送給瀏覽器的;Cookie的Expires屬性標識了Co

網頁爬蟲-通過已登入後的cookie模擬登陸狀態,保持會話進行後續操作

剛開始的時候打算使用java程式直接登陸網站在進行後續操作,後來發現有些網站的重定向太多不好操作, 所以改用已登入的cookie 來保持會話, 使用方式很簡單,只需要在瀏覽器上登入你要操作的網站,然後獲取cookie值,將cookie放到程式裡就實現了儲存會話的功能了, 1、新增mave

PythonScript_003_通過Cookie模擬登陸人人網

#!/usr/bin/env python # -*- coding:utf-8 -*- import urllib.request import http.cookiejar # 相當於Python2的cookielib ''' 通過Cookie模擬登陸人人網,獲取請求 總結:1、POS

sessionselenium+PhantomJS模擬登陸v2ex

session方式登入 def parse_url(self, url): response = requests.get(url=url, headers=self.headers)