為什么我們要讓爬蟲模擬登陸呢旨指?
- 有些內(nèi)容只有登陸才能進行爬取宏侍,如知乎,不登錄的主頁只能看到注冊和登陸 医增;
- 你想爬取自己的個人信息
有什么方法呢慎皱?
cookie
在互聯(lián)網(wǎng)發(fā)展的早期,由于大家的服務器都不是太好叶骨,所以服務端不會記住你的個人信息茫多,這會增加服務器的壓力。因此早期的連接都是一次性的忽刽,服務器在不會記得你什么時候來過天揖,也不知道你做了什么。但是隨著服務器的升級換代跪帝,淘寶這類網(wǎng)站需要記住你的個人信息今膊,這樣你下次訪問的時候可以繼續(xù)上次的工作。但是http協(xié)議依舊保持了無狀態(tài)的特性伞剑,cookies應運而生斑唬。cookies在訪問服務器后會記錄在瀏覽器上,這樣就可以在客戶端下次訪問的時候想起它是誰了黎泣。HTTP持久連接
在沒有持久連接之前恕刘,為獲取每一個URL指定的資源都必須建立一個獨立額TCP連接,一方面加重了HTTP服務器的負擔抒倚;另一方面由于服務器不會記住客服端褐着,導致我們需要每一個請求都要執(zhí)行登錄操作。但是有了HTTP持久連接后托呕,我們對同一個主機的多次請求會使用同一個TCP連接献起。因此登錄后就可以保持這類狀態(tài)進行請求操作。
實現(xiàn)方法镣陕!
針對方法1谴餐,我們只要從在瀏覽器獲取cookie,然后帶著cookie進行訪問就行了呆抑,如下:
-
利用chrome的開發(fā)者工具獲取cookies
獲取cookies 填寫cookies
cookies = {'cookie':'紅框部分'}
帶cookies發(fā)起請求:
html = requests.get(url,cookies=cookies).content
針對方法2岂嗓,我們使用requests的Session類進行持久連接,就直接上代碼了哦
#導入必要的庫
import requests
from bs4 import BeautifulSoup
url = 'https://www.zhihu.com/#signin'
session = requests.Session() #實例化Session
wb_data = session.get(url).text
soup = BeautifulSoup(wb_data,'lxml')
# 填寫登錄表單
xsrf = soup.select('input[value]')[-1].get('value')
data = {
'_xsrf': xsrf,
'password': 'your password',
'remember_me': 'true',
'email': 'your email'
}
# 提交表單
log_post =session.post('http://www.zhihu.com/login/email', data=data)
url = 'https://www.zhihu.com/'
test = session.get(url)
wb_data = BeautifulSoup(test.text, 'lxml')
# 檢驗是否成功登錄
wb_data.select('#feed-0 > div.feed-item-inner > div.feed-main > div.feed-content > h2 > a')
結(jié)語
HTTP持久鏈接和Cookies其實沒有沖突鹊碍,雖然我說是兩種方法厌殉,但是你可以在使用cookies免提交表單登陸的時使用Session食绿,這樣只需要第一次get的時候帶上cookies,剩余操作就不需要cookies了公罕。
但是我使用cookies發(fā)現(xiàn)還是不能變成登陸狀態(tài)器紧,我也是很憂傷。但是你可以在模擬登陸后楼眷,然后取得cookies信息铲汪,用獲得的cookies登陸,不過這就失去用cookie免登陸的價值了罐柳。
當我用jupyter notebook發(fā)現(xiàn)無法使用cookie讓服務器認識我掌腰,當我用命令行時候,同樣的代碼反而沒有問題张吉,我無奈了齿梁。