1. 程式人生 > >python爬蟲--模擬登錄知乎

python爬蟲--模擬登錄知乎

print url 開發 數字 pan tps 參數 content 開發者

1、處理登錄表單

處理登錄表單可以分為2步:

第一、查看網站登錄的表單,構建POST請求的參數字典;

第二、提交POST請求。

打開知乎登錄界面,https://www.zhihu.com/#signin,

技術分享

按f12,打開開發者界面:

技術分享

在這裏面找到headers信息,

現在在用戶名和密碼處查找信息,

技術分享

技術分享

發現用戶名的屬性為account,account中的內容為我們的用戶名;

同理,password中的內容為我們的密碼。

在登錄表單中,有些key值在瀏覽器中設置了hidden值,不會顯示出來,這個時候我們需要去審查元素中去查找,

技術分享

發現了,cookie中有一個_xsrf的屬性,類似於token的作用。而這個東西的存在,就讓我們在模擬登錄的時候,必須將這個屬性作為參數一起加在請求中發送出去。

而獲取_xsrf則可以用之前的BeautifulSoup獲取

import requests
from bs4 import BeautifulSoup as bs
session = requests.session()
post_url = https://www.zhihu.com/#signin
agent = Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/5.1.2.3000 Chrome/55.0.2883.75 Safari/537.36
headers = {
    "Host
": "www.zhihu.com", "Referer":"http://www.zhihu.com/", User-Agent:agent } postdata = { password: ‘*****, account: ******, } response = bs(requests.get(http://www.zhihu.com/#signin,headers=headers).content, html.parser) xsrf = response.find(input,attrs={name:_xsrf})[value
] postdata[_xsrf] =xsrf responed = session.post(http://www.zhihu.com/login/email,headers=headers,data=postdata) print(responed)

結果顯示:

<Response [200]>;

代碼做一些修改:

import requests
from bs4 import BeautifulSoup
session = requests.session()
agent = ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/5.1.2.3000 Chrome/55.0.2883.75 Safari/537.36‘
headers = {
"Host": "www.zhihu.com",
"Origin":"https://www.zhihu.com/",
"Referer":"http://www.zhihu.com/",
‘User-Agent‘:agent
}

postdata = {
‘password‘: ‘*****‘,
‘account‘: ‘******‘,
}

response = session.get("https://www.zhihu.com", headers=headers)
soup = BeautifulSoup(response.content, "html.parser")
xsrf = soup.find(‘input‘, attrs={"name": "_xsrf"}).get("value")
postdata[‘_xsrf‘] =xsrf
login_page = session.post(‘http://www.zhihu.com/login/email‘, data=postdata, headers=headers)
print(login_page.status_code)

運行結果:200

代表響應的狀態為請求成功,可以成功登錄表單。

python爬蟲--模擬登錄知乎