摘要:所以只要得到登錄后的并必要時進行更新,服務器就會認定其為登錄狀態。看看人家知乎,加密到連名字都沒有了,還混淆,如何下手綜上,適用于沒有加密的登錄或者加密算法比較簡單并且不常更新的網站。遇上無解的加密算法要么手操拷貝,要么請大佬出場。
某些網站,登錄和沒登錄,用戶的權限是不一樣的,帳號登錄之后才能獲取更多的信息。更有甚者一上來就是登錄界面,不登錄就不給你進去(如p站)。爬取目標不用登錄固然是好,但需要時也沒辦法啊,這時如果還想爬取信息,就必須讓爬蟲學會登錄。
Cookie說到這里就要介紹一下本文的小主角cookie了,簡單的說,cookie是服務器安在客戶端的“監視器”,記錄了包括登錄狀態在內的所有信息,這些信息由服務器生成和解釋,服務器通過客戶端攜帶的cookie來識別用戶。cookie存在生命周期,短的關掉瀏覽器就失效,長的能若干天免登陸,一旦失效就要重新獲取。所以只要得到登錄后的cookie并必要時進行更新,服務器就會認定其為登錄狀態。本文將介紹幾種主流方法來模擬登錄
注意:并不是說學會這幾種方法你就完全掌握了模擬登錄,加密,驗證系統也可能成為模擬登錄的頭號勁敵,如果查遍全網都沒得到滿意的答案,selenium大佬也被識別了,那估計是沒救了
從瀏覽器獲取這是最簡單也是最容易見效的方法,在瀏覽器上登錄并進行足夠多操作后獲得便能得到足量的cookie,打開F12捉包觀其headers即可
圖中上方的set-cookie是響應cookie,也就是服務器要保存在客戶端的cookie;下方的cookie則是要提交給服務器的cookie,也是我們的目標,讓requests使用這個cookie有兩種方法,一是原封不動把cookie字符串放入headers字典中提交,二是把cookie字符串變成字典再由cookies參數提交,轉換方法如下。
def cookie_to_dict(cookie): cookie_dict = {} items = cookie.split(";") for item in items: key = item.split("=")[0].replace(" ", "") value = item.split("=")[1] cookie_dict[key] = value return cookie_dict
這種直接獲取的方法缺點也很明顯,就是不能追蹤set-cookie并更新,原來的cookie一旦失效,就要從新手動獲取
session維持session名為“會話”,即多個請求的行為。requests庫提供了會話對象(requests.Session)讓使用者能跨請求保持某些參數如cookie,而且能自動處理服務器發來的cookie,使得同一個會話中的請求都帶上最新的cookie,非常適合模擬登錄。使用上也非常簡單,實例化后幾乎相當于一個requests對象擁有get,post等方法,text,cotent等屬性。為了方便下次登錄,還可以把第一次session登錄后的cookie通過cookiejar保存到本地供下次讀取免去登錄
import requests import http.cookiejar as cj r = requests.session() r.cookies = cj.LWPCookieJar() # 接入容器 r.get(url,headers=,cookie=) # 不過需要注意,就算使用了會話,方法級別的參數也不會被跨請求保持,此cookie只發送給該請求 print(r.text) r.post(url,headers=,data=,) #請求x N r.cookies.save(filename="cookies.txt", ignore_discard=True, ignore_expires=True) # 保存cookie到本地,忽略關閉瀏覽器丟失,忽略失效 r.close() # 對話支持with打開以實現自動close """#載入本地cookie s = requests.session() s.cookies = cj.LWPCookieJar(filename="cookies.txt") s.cookies.load(filename="cookies.txt", ignore_discard=True) """
雖說session使cookie管理變得一勞永逸,但登錄包中post參數的構造可能是一個深坑,post的是帳號密碼明文那簡單;蛋疼的是如果帳號密碼連同其他數據經js加密成密文作為post數據,那你就得從js中挑選并分析加密算法,還要用python實現(某些加了混淆的js像天書一樣)。如果無法破譯加密,requests登錄就是一張白紙,cookie就更不用談了,給你再牛逼的管理工具也沒用。同時對方程序員的勤奮程度也是一個考慮因素,別人經常改算法,你也要從新看js改代碼。
-----------------------------看看人家知乎,加密到連名字都沒有了,js還混淆,如何下手?-------------------------------
綜上,session適用于沒有加密的登錄或者加密算法比較簡單并且不常更新的網站。遇上無解的加密算法?要么手操拷貝cookie,要么請selenium大佬出場。
selenium大法大佬雖然是慢了點,但永遠是你大佬。借助瀏覽器完備的js解析能力,你根本不用考慮它是如何加密的,只要輸入賬號密碼,最多再加個驗證碼,瀏覽器直接運行js把他們直接變成密文并post過去,完成登錄,就像我們平時操作那么簡單。所以有一種巧妙的方法是先用selenium進行模擬登錄,然后再提取cookie給session用免去session模擬登錄的過程(當然也可以繼續selenium下去)。在代碼中,往往就是定位,點擊,定位,發送帳號密碼,Enter(或者定位點擊登錄鍵),等待一段時間讓cookie加載完后將其打包成RequestsCookieJar給session用就可以了。如對付知乎可以這樣做:
import requests from selenium import webdriver import time from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.maximize_window() driver.get("https://www.zhihu.com/") # 不考慮驗證碼的情況 driver.find_element_by_xpath("http://button[@data-za-detail-view-id="2278"]").click() #點擊登錄進入登錄界面 driver.find_element_by_xpath("http://input[@name="username"]").send_keys("account") #發送帳號名 driver.find_element_by_xpath("http://input[@name="password"]").send_keys("password",Keys.ENTER) #發送密碼并回車 time.sleep(10) # 等待cookie加載完成 cookies = driver.get_cookies() print(cookies) s=requests.Session() c = requests.cookies.RequestsCookieJar() for item in cookies: c.set(item["name"],item["value"]) print(c) s.cookies.update(c) # 載入cookie #s.get() #s.post() """ """
但就算是大佬,也不是萬能的,有些網站能識別人操作的瀏覽器和selenium操作的瀏覽器,使登錄受到拒絕,譬如用selenium模擬登錄網易云音樂就會提示登錄異常。如果不能對js進行逆向工程分析出其識別算法,那只能放棄selenium走requests那條要分析加密的老路
后記到系列第十篇文章,爬蟲系列也將接近尾聲,最后的內容是多線程,多進程及協程的介紹及使用。至于scrapy應該就不會講了,半年前剛入爬蟲坑學的,學得淺,現在忘得差不多了,如今又被深度學習帶跑了,但不排除突然復活的可能。心急的小伙伴可以去觀摩大佬們的代碼自學。本人就去挖DeepLearning的坑了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42093.html
摘要:當我們試圖從新浪微博抓取數據時,我們會發現網頁上提示未登錄,無法查看其他用戶的信息。三模擬登錄下面將介紹使用獲取新浪微博,然后使用提交從而實現模擬登錄。 當我們試圖從新浪微博抓取數據時,我們會發現網頁上提示未登錄,無法查看其他用戶的信息。模擬登錄是定向爬蟲制作中一個必須克服的問題,只有這樣才能爬取到更多的內容。 showImg(https://segmentfault.com/img/...
摘要:總的來說有兩種反爬策略,要么驗證身份,把蟲子踩死在門口要么在網站植入各種反爬機制,讓爬蟲知難而退。本節內容就著這兩種反爬策略提出一些對策。內嵌反爬很靈活,沒有什么固定的代碼格式,要花時間去分析出來。 ??之前提到過,有些網站是防爬蟲的。其實事實是,凡是有一定規模的網站,大公司的網站,或是盈利性質比較強的網站,都是有高級的防爬措施的。總的來說有兩種反爬策略,要么驗證身份,把蟲子踩死在門口...
摘要:定制篩選器,對內容進行篩選重點。審查元素這是瀏覽器自帶的工具,提供抓包和檢查網頁源碼的功能,供使用者分析網頁。超時設置,如果服務器在指定秒數內沒有應答,拋出異常,用于避免無響應連接,整形或浮點數。返回連接狀態,正常。 前言 python 3.6 !! 本爬蟲系列是面對有Python語法基礎的讀者寫的,如果你沒學過python,emmmm.....也沒關系,你或許能從每篇文章中學到一些...
摘要:楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,。本文來源知乎作者路人甲鏈接楚江數據提供網站數據采集和爬蟲軟件定制開發服務,服務范圍涵蓋社交網絡電子商務分類信息學術研究等。 楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,http://www.chujiangdata.com。 第一:Python爬蟲學習系列教程(來源于某博主:htt...
摘要:比如我們以知乎為例,直接利用來維持登錄狀態。測試后,發現同樣可以正常登錄知乎。上一篇文章網絡爬蟲實戰基本使用下一篇文章網絡爬蟲實戰正則表達式 上一篇文章:Python3網絡爬蟲實戰---24、requests:基本使用下一篇文章:Python3網絡爬蟲實戰---26、正則表達式 在前面一節我們了解了 Requests 的基本用法,如基本的 GET、POST 請求以及 Response...
閱讀 2307·2023-04-25 14:17
閱讀 1515·2021-11-23 10:02
閱讀 2170·2021-11-23 09:51
閱讀 873·2021-10-14 09:49
閱讀 3384·2021-10-11 10:57
閱讀 2921·2021-09-24 09:47
閱讀 3046·2021-08-24 10:00
閱讀 2298·2019-08-29 18:46