Python爬蟲番外篇之關於登陸

常見的登陸方式有如下兩種:php

  1. 查看登陸頁面,csrf,cookie;受權;cookie
  2. 直接發送post請求,獲取cookie

上面只是簡單的描述,下面是詳細的針對兩種登陸方式的時候爬蟲的處理方法html

第一種狀況

這種例子其實也比較多,如今不少網站的登陸都是第一種的方法,這裏經過以github爲例子:git

分析頁面

獲取authenticity_token信息github

咱們都知道登陸頁面這裏都是一個form表單提交,我能夠能夠經過谷歌瀏覽器對其進行分析ajax

如上圖咱們找到了這個token信息
因此咱們在登陸以前應該先經過代碼訪問這個登陸頁面獲取這個authenticity_token信息瀏覽器

獲取登錄頁面的cookie信息cookie

set-cookie這裏是登陸頁面的cookiesession

分析登陸包獲取提交地址post

當咱們輸入用戶名和密碼以後點擊提交,咱們能夠從包裏找到如上圖的地址,就是post請求提交form的信息
請求的地址:https://github.com/session
請求的參數有:
"commit": "Sign in",
"utf8":"✓",
"authenticity_token":「KM6Q0mM9FtI95wYsI/WU3BnaMbYrmV60c0YTQlZjBuAuYa193LP2Gd8BTCmQBSFvPFZRlk3/1TFOnOgGUdy7Ig==」,
"login":"hjzhaofan@163.com",
"password":"123"網站

從這裏咱們也能夠看出提交參數中的「authenticity_token」,而這個參數就是須要咱們從登錄頁面先獲取到。
當咱們登陸成功後:

再次訪問github,這個時候cookie裏就增長了兩個cookie信息,而這個信息是登陸後在增長的信息
因此若是咱們想要經過程序登陸,咱們就須要在登陸成功後再次獲取cookie信息
而後經過這個cookie去訪問咱們github的其餘信息例如咱們的我的信息設置頁面:
https://github.com/settings/profile

代碼實現

下面代碼實現了登陸並訪問https://github.com/settings/repositories

import requests
from bs4 import BeautifulSoup

Base_URL = "https://github.com/login"
Login_URL = "https://github.com/session"

def get_github_html(url):
    '''
    這裏用於獲取登陸頁的html,以及cookie
    :param url: https://github.com/login
    :return: 登陸頁面的HTML,以及第一次的cooke
    '''
    response = requests.get(url)
    first_cookie = response.cookies.get_dict()
    return response.text,first_cookie



def get_token(html):
    '''
    處理登陸後頁面的html
    :param html:
    :return: 獲取csrftoken
    '''
    soup = BeautifulSoup(html,'lxml')
    res = soup.find("input",attrs={"name":"authenticity_token"})
    token = res["value"]
    return token


def gihub_login(url,token,cookie):
    '''
    這個是用於登陸
    :param url: https://github.com/session
    :param token: csrftoken
    :param cookie: 第一次登陸時候的cookie
    :return: 返回第一次和第二次合併後的cooke
    '''

    data= {
        "commit": "Sign in",
        "utf8":"",
        "authenticity_token":token,
        "login":"你的github帳號",
        "password":"*****"
    }
    response = requests.post(url,data=data,cookies=cookie)
    print(response.status_code)
    cookie = response.cookies.get_dict()
    #這裏註釋的解釋一下,是由於以前github是經過將兩次的cookie進行合併的
    #如今不用了能夠直接獲取就行
    # cookie.update(second_cookie)
    return cookie


if __name__ == '__main__':
    html,cookie = get_github_html(Base_URL)
    token = get_token(html)
    cookie = gihub_login(Login_URL,token,cookie)
    response = requests.get("https://github.com/settings/repositories",cookies=cookie)
    print(response.text)

第二種狀況

這裏經過伯樂在線爲例子,這個相對於第一種就比較簡單了,沒有太多的分析過程直接發送post請求,而後獲取cookie,經過cookie去訪問其餘頁面,下面直接是代碼實現例子:
http://www.jobbole.com/bookmark/ 這個地址是隻有登陸以後才能訪問的頁面,不然會直接返回登陸頁面

這裏說一下:http://www.jobbole.com/wp-admin/admin-ajax.php是登陸的請求地址這個能夠在抓包裏能夠看到

 
import requests
def login():
    url = "http://www.jobbole.com/wp-admin/admin-ajax.php"
    data = {
        "action": "user_login",
        "user_login":"zhaofan1015",
        "user_pass": '******',
    }
    response = requests.post(url,data)
    cookie = response.cookies.get_dict()
    print(cookie)
    url2 ="http://www.jobbole.com/bookmark/"
    response2 = requests.get(url2,cookies=cookie)
    print(response2.text)

login() 
相關文章
相關標籤/搜索