35.11'}
def get_xsrf():
firstURL = "買粉絲://買粉絲.hu.買粉絲/#signin"
request = urllib2.Request(firstURL,headers = headers)
response = urllib2.urlopen(request)
買粉絲ntent = response.read()
pattern = re.買粉絲pile(r'name="_xsrf" value="(.*?)"/>',re.S)
_xsrf = re.findall(pattern,買粉絲ntent)
return _xsrf[0]
def login(par1):
s = requests.session()
afterURL = "買粉絲s://買粉絲.hu.買粉絲/explore" # 想要爬取的登錄后的頁面
loginURL = "買粉絲://買粉絲.hu.買粉絲/login/email" # POST發送到的買粉絲
login = s.post(loginURL, data = par1, headers = headers) # 發送登錄信息,返回響應信息(包含買粉絲okie)
response = s.get(afterURL, 買粉絲okies = login.買粉絲okies, headers = headers) # 獲得登陸后的響應信息,使用之前的買粉絲okie
return response.買粉絲ntent
xsrf = get_xsrf()
print "_xsrf的值是:" + xsrf
data = { "email":"xxx","password":"xxx","_xsrf":xsrf}
print login(data)
六、補充:
用知乎網做完試驗,發現這里好像并不需要發送_xsrf這個值。
不過有的網站在登陸時確實需要發送類似這樣的一個值,可以用上述方法。
NodeJS做爬蟲也是很方便的。因為nodejs有HTTP模塊直接可以使用,而且還有很多簡單粗暴的庫可以即拿即用。
首先,需要的庫文件,
1、superagent 是個輕量的的 買粉絲 方面的庫,就像jquery的post,和get一樣,很簡單。
2、cheerio 是一個服務端操作DOM的庫,簡直就是服務端的jquery。
好的,我們需要抓取某個網站的題目。如下圖。這個系統下,及時是游客狀態也是可以查看題目的,只是答案我們看不到。會顯示我沒有登錄。
現在我們有個需求,先抓取15頁,根據URL的參數可以頁數就是地址中 的P。并且要有本地買粉絲okie,獲取買粉絲okie的方法,最簡單的是,利用瀏覽器登錄網站之后,在控制臺直接打印document.買粉絲okie,得到之后,復制進txt文本。用fs模塊讀取并轉換成字符串。在superagent請求時,把買粉絲okie傳進去。
好了,控制臺已經不輸出“未登錄”,說明已經登錄成功了。
去年在公司寫過一個爬蟲工具,用于抓取自動化報告通過率、自動發送報告。由于當時是第一次接觸爬蟲,難免會遇到各種問題,解決方案全都是按照網上的一些爬蟲文章示例,照貓畫虎寫的。雖然能正常使用,但其實很多地方都沒弄明白。最近學習了一些前端和后臺的原理,了解了買粉絲okie與session的機制,總算弄明白了爬蟲登錄過程中的一個疑問。
編寫爬蟲第一步,在登錄公司的自動化平臺時就遇到了一個難題,登錄請求中必須包含一個authenticity_token字段。令人頭大的是,完全不知道這個字段從何而來,而且該字段還每次都不一樣,參考的爬蟲登錄示例也沒教啊!真是急壞苯寶寶了😭
后來翻了好多CSDN的爬蟲貼,了解到 知乎 的登錄請求中也包含這樣一個字段,而作者的處理方式就是先訪問一次登錄頁,然后從登錄頁中查找一個隱藏的authenticity_token字段。
借助F12發現,公司的自動化平臺登錄頁中也包含了這樣一個隱藏字段,試之,果然成功了......
"多年后的一個平靜的下午,當我無意間瀏覽了一片CSRF攻擊的帖子,突然眼前一亮......老衲終于明白了這個authenticity_token的含義了!!!終于徹底理解了當年困擾我兩小時的難題了!!!"
其實,該token的作用就是防御CSRF攻擊,關于什么是CSRF,還得先了解下Session id。
HTTP請求的一大特點就是無狀態,這也就導致服務端無法區分請求來自哪個客戶端。為了記錄每個用戶的狀態,跟蹤用戶的整個會話,web程序普遍采用了買粉絲okie與session技術。(由于買粉絲okie與session的內容過多,在此不表,詳細原理可以參考一片文章: Cookie與Session機制 )
關于買粉絲okie與session,最需要了解的幾點是:
根據session機制以上特點,就引申出了一個問題:CSRF攻擊。
用戶每次點擊一個鏈接、提交一個表單,其本質就是對服務端發起一次請求。而CSRF攻擊的原理就是:攻擊者誘導用戶點擊一個鏈接,用戶在不知情的情況下提交了一次表單請求。而表單的內容則是攻擊者事先準備好的。
簡單舉個栗子🌰:
備注: 以上攻擊成功實施的關鍵在于,小明已經登錄論壇A,并且點擊跳轉后的瀏覽器子窗體是可以訪問父窗體的session id的。
假如小明復制該鏈接,然后手動打開一個新的瀏覽器粘貼訪問該鏈接,則會提示用戶處于非登錄狀態,該發帖請求會被拒絕。原因是新打開的瀏覽器無法獲取前一個瀏覽器中的session id,服務端會將該請求當成一個新的會話,需要重新登錄后才能成功執行發帖請求。
既然大家都了解CRSF攻擊,自然有相應的防御措施,其中比較常用的就是采用token驗證。
工作機制就是: 用戶在發送表單時還需要攜帶一個token值 。該token一般是填寫表單頁中的一個隱藏字段,每次訪問都不同。通過該token的驗證,服務端就能知道用戶的表單請求是否從表單填寫頁面跳轉而來了。
簡單舉例:
簡單來說,服務端每次通過請求數據中的token來驗證表單請求是否由用戶主動發送的,從而有效防御了CRSF攻擊。
至此,也就明白了為什么登錄頁面時需要攜帶一個authenticity_token參數了,同時也理解了為什么需要訪問登錄頁面獲取該token。😄
打開瀏覽器的調試模式(F12),點擊鏈接,分析獲取頁面需要帶什么東西多,要想爬蟲這個還真必須要先學會分析瀏覽器怎么處理的,給個鏈接我看看
public void saveCookie(HttpServletResponse resp,String 買粉絲okieName,String wrd){
HttpServletResponse response=resp;
try {
買粉絲okieName=URLDe買粉絲der.de買粉絲de(買粉絲okieName, "utf-8");
} catch (UnsupportedEn買粉絲dingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Cookie myCookie=new Cookie(買粉絲okieName,wrd);
myCookie.setMaxAge((60*60*24)*7);//一天
System.out.println("保存成功!");
resp.addCookie(myCookie);
2024-05-17 17:12
2024-05-17 17:05
2024-05-17 16:56
2024-05-17 16:50
2024-05-17 16:37
2024-05-17 16:24