python模擬登錄我愛我家網站

什麼是模擬登陸?

模擬登陸:用腳本模擬用戶行爲實現賬戶登陸。

模擬登陸分類

暴力模擬登陸:忽略web設計原理,忽略登陸需求,硬性的將cookie取出加載爬蟲當中進行登錄。

原理分析模擬登陸: 根據網站源碼和抓包請求,分析網站登錄原理,用代碼依照登錄原理向服務器具體接口提交具體數據,實現模擬登錄,技術含量最高,難度最大。

瀏覽器驅動模擬登陸:使用Python調用瀏覽器驅動,執行瀏覽器行爲(發送數據,點擊),進行模擬登陸,這種模擬登陸由於難度低,逐漸被一些項目認可,但是效率低。

正常瀏覽器模擬登陸

無頭瀏覽器模擬登陸

Cookie原理

      上面說的前兩種模擬登陸都需要我們瞭解cookie是啥

       Cookie(曲奇,小餅乾):是服務器下發給瀏覽器用於識別用戶身份的校驗值。

       舉個例子:

              西遊記當中唐僧手中的通關文牒:

              每到一個國家,唐僧需要提交通關文牒來證明自己身份,同時每個國家的國王需要下發自己的校驗來提供給唐僧校驗身          份。

         Cookie是實現當前web身份識別的基礎手段,具有一定的不安全性,因爲:

         cookie下發,瀏覽器可以拒收

         cookie下發到瀏覽器本地,容易被重寫僞裝

         我們來查看cookie的下發和提交

cookie的下發是在和http請求的response header當中

案例地址url = http://www.wangcai5188.com/auth/signin

Cookie的設置和下發

 

注意:

         Set_cookie 也可以有多個

攜帶cookie在RequestHeader裏面

由上面得到我們在寫爬蟲的時候

需要關心cookie的下發,我們需要保存下發的cookie來維持自己的身份

需要關心提交的cookie

所有的Python爬蟲模塊默認都不攜帶cookie

Post 模擬登陸

模擬登陸分析技巧

         結構分析

         Form表單提交分析

在HTML的form標籤當中,我們要關注兩個參數

        Method: 請求的方式,不寫或者爲空代表採用默認值 get,表單提交通常是post

        Action: 提交的路由,指向處理提交數據的地址

由上面的分析和規律我們得到

我愛我家網站的請求方法是:post

密碼和賬號提交的位置:https://passport.5i5j.com/passport/sigin?city=bj

Form表單提交數據分析

上面的分析,我們看着很完美,其實不然,我們現在不知道我們提交了多少參數,我們從HTML界面上看有:用戶名、密碼兩項,但是注意,爲了防止最簡單的爬蟲

在網站設計的思路上:

        有一個隱性的form元素hidden

Hidden也可以像普通的form元素一樣向後臺以name= value的形式進行數據提交,但是在頁面上不做顯示。Hidden通常是不變的,我們在請求的時候,攜帶數據就可以,但是有部分網站的hidden的值來源於後臺算法生成,所以是變化的,所以我們在爬蟲請求登錄的時候,要先從頁面上抓取當前請求對應的hidden值。

抓包分析

上面結構分析,也可以說是靜態分析,我們接下來是抓包分析,也是動態分析,

       抓取登錄頁面的包

請求登錄的包

我們需要故意輸錯密碼,防止頁面跳轉的同時,抓取到登錄的包

首先發現請求沒有問題

請求登錄接口會有cookie下載

請求頭部發現,我們在請求的時候

  1. 需要攜帶cookie
  2. 需要攜帶請求來源
  3. 瀏覽器的版本

我們發現了請求攜帶的數據,比較結構分析,發現數據需求一致,而且是明文的!!!

通過上述分析得到以下結論:

當前我們的爬蟲請求需要分爲兩個步驟

  1. 請求登錄頁面:
  1. 獲取三項校驗數據
  2. 獲取登錄頁面下發的cookie

2、在得到請求的三項校驗數據和cookie之後,我們發起對登錄接口的請求

       Urllib 系列的模擬登陸

               模擬登陸目標:

                     我愛我家

https://passport.5i5j.com/passport/login?service=https%3A%2F%2Fcd.5i5j.com%2Freglogin%2Findex%3FpreUrl%3Dhttps%253A%252F%252Fcd.5i5j.com%252F&status=1&city=cd

urllib模擬登錄知識點

  1. urllib.requests.urlopen方法可以請求服務器,但是不保存cookie
  2. urllib需要結合cookielib進行模擬登錄

Python2當中: cookielib

Python3當中: http.cookiejar

         開始模擬登錄的代碼:

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author  : ALLEN
# @Time    : 2018/12/28 17:08
# @File    : woaiwojia_spider.py
# @Software: PyCharm

from lxml import etree
from urllib import parse
from urllib import request
import http.cookiejar as cookielib

login_page_url = "https://passport.5i5j.com/passport/login?service=https%3A%2F%2Fcd.5i5j.com%2Freglogin%2Findex%3FpreUrl%3Dhttps%253A%252F%252Fcd.5i5j.com%252F&status=1&city=cd"

login_page_header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
}
#創建登錄請求
req = request.Request(url = login_page_url,headers = login_page_header)

#聲明一個cookie容器
cookie = cookielib.MozillaCookieJar("1.txt")

#創建cookie處理器
handler = request.HTTPCookieProcessor(cookie)

#設置代理ip (無妄之災)
#proxy = request.ProxyHandler({"http": "222.221.11.119:3128"})

#創建自己的請求器(urlopen),我們自己定義的請求器是會保存服務器下發的cookie
opener = request.build_opener(handler)

#發起請求 request.urlopen(req)
response = opener.open(req)

#保存cookie
cookie.save(ignore_discard = True,ignore_expires = True) #參數是用來第一cookie過期和覆蓋的設置

content= response.read().decode()

#獲取三項校驗數據
html = etree.HTML(content)
aim = html.xpath('//input[@id="aim1"]')[0].attrib["value"]
service = html.xpath('//input[@id="service"]')[0].attrib["value"]
status = html.xpath('//input[@id="status1"]')[0].attrib["value"]

send_dict = {
    "username": "賬號",#這裏請填寫自己的賬號
    "password": "密碼",#這裏請填寫自己的密碼
    "aim": aim,
    "service": service,
    "status": status
}

login_url = "https://passport.5i5j.com/passport/sigin?city=cd"

login_headers = {
    "Referer": login_page_url,
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
}
#封裝發送數據
send_data = parse.urlencode(send_dict).encode() #Python3 要進行字節編碼

#構建登錄請求
login_req = request.Request(url = login_url,headers = login_headers,data = send_data)

#發起登錄請求
login_respone = opener.open(login_req)

#保存cookie
cookie.save(ignore_discard = True,ignore_expires = True) #參數是用來第一cookie過期和覆蓋的設置

content = login_respone.read().decode()

print(content)

效果如下:

接下來我會更新如何模擬登陸  http://www.wangcai5188.com/auth/signin

大家也可以試着嘗試登陸一下

代碼如下:

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author  : ALLEN
# @Software: PyCharm

import requests
from lxml import etree
# 實例化一個保存cookie的請求器
session = requests.session()
# 發起對登錄頁面的請求
response = session.get("http://www.wangcai5188.com/auth/signin")
content = response.content.decode()
# 進行數據過濾,獲取token和random的值
html = etree.HTML(content)
token, = html.xpath('//input[@name="_token"]/@value')
random, = html.xpath('//input[@name="_random"]/@value')
send_dict = {
    "username":"賬號",
    "password":"密碼",
    "_token":token,
    "_random":random
}
# 向服務器發起請求
url = "http://www.wangcai5188.com/auth/signin"
headers = {
    "Referer":"http://www.wangcai5188.com/auth/signin",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"

}
login_response = session.post(url = url,headers = headers,data = send_dict)
login_content = login_response.content.decode()
print("==========================================================")
print(login_response.status_code)
print("==========================================================")
print(login_content)

效果如下:

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章