常見的登錄方式有以下兩種:
- 查看登錄頁面,csrf,cookie;授權;cookie
- 直接發送post請求,獲取cookie
上面只是簡單的描述,下面是詳細的針對兩種登錄方式的時候爬蟲的處理方法
第一種情況
這種例子其實也比較多,現在很多網站的登錄都是第一種的方法,這里通過以github為例子:
分析頁面
獲取authenticity_token信息
我們都知道登錄頁面這里都是一個form表單提交,我可以可以通過谷歌瀏覽器對其進行分析
如上圖我們找到了這個token信息
所以我們在登錄之前應該先通過代碼訪問這個登錄頁面獲取這個authenticity_token信息
獲取登陸頁面的cookie信息
set-cookie這里是登錄頁面的cookie
分析登錄包獲取提交地址
當我們輸入用戶名和密碼之后點擊提交,我們可以從包里找到如上圖的地址,就是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()